下面是用来求取一条直线和一条拟合曲线交点的代码

        /// <summary>
/// 拟合曲线所筛选的点的个数
/// </summary>
const int CurveNums = 10; /// <summary>
/// 拟合曲线的阶数
/// </summary>
public int m =2; /// <summary>
/// 取直线上的点的个数
/// </summary>
const int XNums = 50;
/// <summary>
/// 最小二乘法拟合曲线
/// </summary>
/// <param name="X">X轴数组</param>
/// <param name="Y">Y轴数组</param>
/// <param name="m">阶数</param>
/// <returns>返回曲线方程的各阶系数(由高阶到低阶,一般m=2)</returns>
public double[] FittingCurveByLeastSquare(double[] X, double[] Y, int m = 2)
{
/// https://blog.csdn.net/qq_23062949/article/details/119700640?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link
double[] res = new double[m + 1];
if (X.Length > m && Y.Length > m)
{
res = Fit.Polynomial(X, Y, m);
}
return res;
} /// <summary>
/// 计算直线方程
/// </summary>
/// <param name="StartPoint">直线起点</param>
/// <param name="angle">直线的角度</param>
/// <returns>返回k,b的数组</returns>
public double[] CalculateLine(Point StartPoint, double angle)
{
double k = Math.Tan(angle / 180 * Math.PI);
double b = StartPoint.Y - k * StartPoint.X;
return new double[] { k, b };
} /// <summary>
/// 计算交点
/// </summary>
/// <param name="LineResult">直线的k,b</param>
/// <param name="CurveResult">拟合曲线的系数数组</param>
/// <param name="LineX">直线上的点的X坐标</param>
/// <param name="m">阶数</param>
/// <returns></returns>
public EPoint CalculateInterPoint(double[] LineResult, double[] CurveResult, double[] LineX, int m)
{
EPoint InterPoint = new EPoint();
if (LineResult.Length == 2 && CurveResult.Length == (m + 1))
{
double k = LineResult[0];
double b = LineResult[1];
for (int i = 0; i < LineX.Count(); i++)
{
double x = LineX[i];
double y_Line = k * x + b;
double y_Curve = 0;
for (int n = 0; n <= m; n++)
{
y_Curve += CurveResult[n] * Math.Pow(x, n);
}
bool IsSuccessFind = false;
for (int t = 1; t <= 50; t++)
{
if (Math.Abs(y_Line - y_Curve) < 5)
{
InterPoint = new EPoint((int)x, (int)y_Line);
IsSuccessFind = true;
break;//跳出内循环
}
}
if (IsSuccessFind)
{
break;//跳出外循环
}
}
}
return InterPoint;
} /// <summary>
/// 计算R^2,R^2这个值越接近1,说明拟合出来的曲线跟原曲线就越接近
/// </summary>
/// <param name="Y">实际的Y</param>
/// <param name="Ytest">代入拟合曲线方程得到的Y</param>
/// <returns>返回R^2</returns>
public double CalculateRSquared(double[] Y, double[] Ytest)
{
double RSquared = GoodnessOfFit.RSquared(Y, Ytest);
return RSquared;
}

C#使用MathNet库来对进行曲线拟合的更多相关文章

  1. C#环境下的数值计算库:MathNet

    下面用一个简单的例子来说明MathNet的使用方法: 1. 进入MathNet官网找到数值计算库Math.NET Iridium(Numerics)并下载: 2. 将下载的文件解压缩,在目录下的Bin ...

  2. Scipy教程 - 优化和拟合库scipy.optimize

    http://blog.csdn.net/pipisorry/article/details/51106570 最优化函数库Optimization 优化是找到最小值或等式的数值解的问题.scipy. ...

  3. Ceres-Solver库入门

    示例1:求极值 首先我们以Ceres库官网中的Hello World例子来进行说明.这里例子的目的是为了计算方程取得最小值时x的值.从这个方程很容易看出来当x=10时,f(x)取得最小值0.这个方程虽 ...

  4. 关于java实现自定义曲线拟合的研究

    项目需要拟合曲线,使用java实现.采用了apache-commons-math3实现自定义的曲线. 作为apache开源的搞数学计算的超强的库,一直不受市场重视.为啥呢?经过研究,使用java这个强 ...

  5. HslCommunication组件库使用说明

    一个由个人开发的组件库,携带了一些众多的功能,包含了数据网络通信,文件上传下载,日志组件,PLC访问类,还有一些其他的基础类库. nuget地址:https://www.nuget.org/packa ...

  6. Ceres Solver: 高效的非线性优化库(二)实战篇

    Ceres Solver: 高效的非线性优化库(二)实战篇 接上篇: Ceres Solver: 高效的非线性优化库(一) 如何求导 Ceres Solver提供了一种自动求导的方案,上一篇我们已经看 ...

  7. Ceres Solver: 高效的非线性优化库(一)

    Ceres Solver: 高效的非线性优化库(一) 注:本文基于Ceres官方文档,大部分由英文翻译而来.可作为非官方参考文档. 简介 Ceres,原意是谷神星,是发现不久的一颗轨道在木星和火星之间 ...

  8. Python机器学习之数据探索可视化库yellowbrick

    # 背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维.陆续使用过plot ...

  9. python应用 曲线拟合04

    python应用 曲线拟合04 → 多项式拟合 主要是使用 numpy 库中的 polyfit() 函数,见第 66 行, z = np.polyfit(x_proton, y, 3) ,其中待拟合曲 ...

随机推荐

  1. 一款类似B站的开源弹幕播放器,太酷了

    今天小编推荐一款开源的弹幕视频播放器,由Typescript加Sass编写,无任何第三方运行时依赖,Gzip大小只有21KB,兼容IE11,支持SSR,支持直播.该播放器高度可定制,所有图标.按钮.色 ...

  2. 关于DOS命令窗口的一点基本知识

    1.DOS命令窗口又可称为CMD窗口.shell.终端. 2.常用的DOS命令: -硬盘分区名+: :进入到该硬盘分区(注意是英文冒号哦) -cd+目录名:进入到指定(该)目录 -dir:列出当前目录 ...

  3. django_day10_项目相关

    django_day10_项目相关 展示数据的方法 数据对象obj 普通字段 obj.字段名 ====> 数据库该字段的值 带choices参数的 obj.字段名 ====> 数据库该字段 ...

  4. KingbaseES 工具sys_dump,sys_restore使用介绍

    说明: KingbaseES V8R6版本中自带数据库备份导出sys_dump,和备份恢复sys_restore工具. sys_dump:把KingbaseES数据库抽取为一个脚本文件或其他归档文件. ...

  5. KingbaseES V8R6集群外部备份案例

    案例说明: 本案例采用sys_backup.sh执行物理备份,备份使用如下逻辑架构:集群采用CentOS 7系统,repo采用kylin V10 Server. 一主一备+外部备份 此场景为主备双机常 ...

  6. 硬核解析MySQL的MVCC实现原理,面试官看了都直呼内行

    1. 什么是MVCC MVCC全称是Multi-Version Concurrency Control(多版本并发控制),是一种并发控制的方法,通过维护一个数据的多个版本,减少读写操作的冲突. 如果没 ...

  7. JAVA中让Swagger产出更加符合我们诉求的描述文档,按需决定显示或者隐藏指定内容

    大家好,又见面啦. 在前一篇文档<JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率>中,我们探讨了如何通过自定义注解的方式扩展swagger的能力让Swag ...

  8. 基于 iframe 的微前端框架 —— 擎天

    vivo 互联网前端团队- Jiang Zuohan 一.背景 VAPD是一款专为团队协作办公场景设计的项目管理工具,实践敏捷开发与持续交付,以「项目」为核心,融合需求.任务.缺陷等应用,使用敏捷迭代 ...

  9. Linux 使用 Systemd 管理进程服务

    转载自:https://mp.weixin.qq.com/s/e-_PUNolUm22-Uy_ZjpuEA systemd 介绍 systemd是目前Linux系统上主要的系统守护进程管理工具,由于i ...

  10. Linux常用基础指令

    Linux常用指令 一.基础命令 whoami查看当前用户 pwd查看当前所在位置 ls 查看当前文件夹的内容 ls -l或ll显示详细内容 cd 绝对路径:从根目录开始的路径 cd / 文件夹 返回 ...