C#使用MathNet库来对进行曲线拟合
下面是用来求取一条直线和一条拟合曲线交点的代码
///摘要
///拟合曲线所筛选的点的个数
////摘要
const int曲线数=10
///摘要
///拟合曲线的阶数
////摘要
public int m=2;
///摘要
///取直线上的点的个数
////摘要
const int XNums=50
///摘要
///最小二乘法拟合曲线
////摘要
///参数名='X'X轴数组/param
///参数名='是'轴数组/param
///参数名='m '阶数/param
///返回返回曲线方程的各阶系数(由高阶到低阶,一般m=2)/返回
公共双[]拟合曲线(双[]X,双[] Y,int m=2)
{
///https://博客。csdn。net/QQ _ 23062949/文章/详情/119700640 SPM=1001。2101 .3001 .6650 .3 UTM _中等=分布式。PC _相对。无-任务-博客-2 ~默认~ ctrl列表~默认-3。no _ search _ link depth _ 1-UTM _ source=distribute。PC _相对。无-任务-博客-2 ~默认~ ctrl列表~默认-1
double[] res=新的双[m^ 1];
如果(十长度米Y长度米)
{
分辨率=适合.多项式(X,Y,m);
}
返回表示留数
}
///摘要
///计算直线方程
////摘要
///参数名='起点'直线起点/param
///参数名='角度'直线的角度/param
///返回返回k,b的数组/returns
公共双[]计算线(点起点,双角度)
{
双k=数学。谭(角度/180 *数学. PI);
双b=起点.Y - k *起点x;
返回新的double[] { k,b };
}
///摘要
///计算交点
////摘要
///param name='LineResult '直线的k,b/参数
///param name='CurveResult '拟合曲线的系数数组/param
///param名称='LineX '直线上的点的X坐标/param
///参数名='m '阶数/param
///返回/返回
public EPoint计算interpoint(double[]行结果,double[] CurveResult,double[] LineX,int m)
{
EPoint InterPoint=new EPoint();
if (LineResult .长度==2曲线结果。长度==(^ 1号)
{
double k=行结果[0];
double b=行结果[1];
for(int I=0;我是LineX .count();(一)
{
double x=LineX[I];
双y _ Line=k * x b;
双y _ Curve=0;
for(int n=0;n=m;n)
{
y_Curve=曲线结果[n] *数学.幂(x,n);
}
bool IsSuccessFind=false
for(int t=1;t=50t)
{
如果(数学Abs(y)线表示“有…的”曲线)5)
{
InterPoint=new EPoint((int)x,(int)y _ Line);
IsSuccessFind=true
打破;//跳出内循环
}
}
if(issuessfind)
{
打破;//跳出外循环
}
}
}
返回InPut
}
///摘要
///计算R^2,R^2这个值越接近1,说明拟合出来的曲线跟原曲线就越接近
////摘要
///参数名='是'实际的y/参数
///参数名='Ytest '代入拟合曲线方程得到的y/参数
///返回返回R^2/returns
公共双精度计算平方(双[]是,双[] Ytest)
{
double RSquared=GoodnessOfFit .RSquared(Y,Ytest);
返回RSquared
}
4556
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/155871.html