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

        /// <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. Qt QBarSeries简易柱状图教程

    博客园最强Qt QBarSeries简易柱状图教程 前情提要 每个人的绘图需求不同,此篇教程也是根据需求来改的.我的需求大概如下所示. 通过信号槽的方式接收signals来刷新柱状图,所以每次触发信号 ...

  2. 第九十七篇:CSS的选择器及优先级

    好家伙,来补一点关于CSS的基础 1.id选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式 使用#号来定义样式 2.class选择器 class 选择器用于描述一组元素的样式 ...

  3. 【设计模式】Java设计模式 - 动态代理

    [设计模式]Java设计模式 - 动态代理 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 最近工作比较忙,没啥时间学习 目录 [设计模 ...

  4. .Net下的Http请求调用(Post与Get)

    http请求调用是开发中经常会用到的功能.在内,调用自有项目的Web Api等形式接口时会用到:在外,调用一些第三方功能接口时,也会用到,因为,这些第三方功能往往是通过http地址的形式提供的,比如: ...

  5. ASP.NET Core 6框架揭秘实例演示[35]:利用Session保留语境

    客户端和服务器基于HTTP的消息交换就好比两个完全没有记忆能力的人在交流,每次单一的HTTP事务体现为一次"一问一答"的对话.单一的对话毫无意义,在在同一语境下针对某个主题进行的多 ...

  6. Python 第二次实验

    [1] (程序设计)三位水仙花数的计算."三位水仙花数"是指一个三位整数,其各位数字的3次方和等于该数本身.例如:ABC是一个"3位水仙花数",则:A的3次方+ ...

  7. 使用mysql5.7版本的mysqldump备份mysql8.0版本的数据库报错解决办法

    使用mysql5.7版本的mysqldump命令执行备份mysql8.0版本的数据库时会报错: mysqldump: Couldn't execute 'SET SQL_QUOTE_SHOW_CREA ...

  8. 实战---在Portainer中编排docker-compose.yml文件

    选择要部署容器的主机上,不用事先安装配置docker-compose 官方示例文档地址,2.0版本的:https://docs.docker.com/compose/compose-file/comp ...

  9. 【前端必会】HtmlWebpackPlugin 和 SplitChunksPlugin 是什么?

    背景 了解什么是webpack插件,在来看一下不能不知道的两个插件 HtmlWebpackPlugin 有了这个插件,webpack执行后会自动帮我们在dist目录生成一个html文件,并且添加bun ...

  10. 监控平台SkyWalking9入门实践

    简便快速的完成对分布式系统的监控: 一.业务背景 微服务作为当前系统架构的主流选型,虽然可以应对复杂的业务场景,但是随着业务扩展,微服务架构本身的复杂度也会膨胀,对于一些核心的业务流程,其请求链路会涉 ...