C#使用MathNet库来对进行曲线拟合
下面是用来求取一条直线和一条拟合曲线交点的代码
/// <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; }
4556
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!