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

        /// <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;
}

最新文章

  1. TCP\IP三次握手连接,四次握手断开分析
  2. Robotium的左右为难 -- enterText
  3. WINDOWS系统下四叶草CLOVER引导U盘制作
  4. PHP 小方法之 二维数组排序
  5. IP地址查询接口
  6. ANDROID_MARS学习笔记_S01_012_SeekBar
  7. WordPress get_allowed_mime_types函数(wp-includes/functions.php)存在跨站脚本漏洞
  8. salesforce 零基础学习(六十六)VF页面应善于使用变量和函数(二)常用函数的使用
  9. 实现最简单PHP MVC实例
  10. 如何修改int的打印内容——史上最难的JAVA面试题
  11. HTTP协议 与 TCP协议 的区别
  12. springMVC_01认识springMVC
  13. php利用自定义key,对数据加解密的方法
  14. 插件开发-滑条(slide)开发
  15. 解决:According to TLD or attribute directive in tag file, attribute value does not accept any express。
  16. 20161208xlVBA工作表数据导入Access
  17. C++实现八皇后问题
  18. Scala 泛型类型和方法
  19. 在Qt中如何编写插件,加载插件和卸载插件(转)
  20. FFTW3学习笔记3:FFTW 和 CUFFT 的使用对比

热门文章

  1. Ladon简单使用例子
  2. vue3中defineComponent 的作用
  3. Elasticsearch:Dynamic mapping
  4. Logstash: 如何创建可维护和可重用的Logstash管道
  5. TCP服务端收到syn但是不回复syn ack问题分析
  6. 文档的CURD
  7. PR中导入的照片在画面上只显示一部分的解决办法
  8. .Net下的分布式唯一ID
  9. [题解] Atcoder Beginner Contest ABC 265 Ex No-capture Lance Game DP,二维FFT
  10. POJ2533 Longest Ordered Subsequence (线性DP)