求C++对数据进行多项式拟合Matrix_PolyFit 改成C#可用
功能:对X_Y_Number组数据x,y进行最高次数为Fit_N的多项式拟合.拟合成功返回多项式由常数项到最高次数项的的系数ks.
即x[X_Y_Number],y[X_Y_Number],ks[Fit_N+1]
格式:Matrix_PolyFit(x,y,X_Y_Number,Fit_N,ks)
引用:
Matrix_Solve:最小二乘法解线性方程组
例子:
int main()
{
double x[]={1,2,3,4,5,6,7,8,9,10};
double y[]={9,31,83,177,325,539,831,1213,1697,2295};
double ks[4];
Matrix_PolyFit(x,y,10,3,ks);
cout<<ks[0]<<","<<ks[1]<<","<<ks[2]<<","<<ks[3]<<endl;
system("pause");
return 0;
}
上面的代码执行后会显示数据4.99927,-0.999268,2.99991,2.0001其实就是y=4.99927-0.999268*x+2.99991*x^2+2.0001*x^3和我们的真实情况y=5-x+3*x^2+2*x^3非常接近
源代码:
bool Matrix_PolyFit(double *x,double *y,int X_Y_Number,int Fit_N,double *ks)
{
/*
对X_Y_Number组数据x,y进行Fit_N次多项式拟合,拟合返回多项式的系数ks
x[X_Y_Number],y[X_Y_Number],ks[Fit_N+1]
*/
if (Fit_N>X_Y_Number || X_Y_Number<1)
{
return false;
}
int i,j,index,n;
double temp,*x2,*y2;
Fit_N++;
y2=new double[Fit_N];
x2=new double[Fit_N*Fit_N];
for (i=0,index=0;i<Fit_N;i++)
{
y2[i]=0;
for (j=0;j<Fit_N;j++)
{
x2[index+j]=0;
}
index+=Fit_N;
}
x2[0]=X_Y_Number;
for(i=0;i<Fit_N;i++)
{
for (j=i+1;j<Fit_N;j++)
{
temp=0;
n=i+j;
for (index=0;index<X_Y_Number;index++)
{
temp+=pow(x[index],n);
}
index=j;
for (n=i;n<Fit_N;n++)
{
if (index>=0)
{
x2[n*Fit_N+index]=temp;
}
index--;
}
}
}
n=Fit_N+Fit_N-2;
temp=0;
for (i=0;i<X_Y_Number;i++)
{
temp+=pow(x[i],n);
}
x2[Fit_N*Fit_N-1]=temp;
for (i=0;i<Fit_N;i++)
{
temp=0;
for (j=0;j<X_Y_Number;j++)
{
temp+=y[j]*pow(x[j],i);
}
y2[i]=temp;
}
if (Matrix_Solve(x2,y2,Fit_N,Fit_N,ks))
{
delete []y2;
delete []x2;
return true;
}
else
{
delete []y2;
delete []x2;
return false;
}
}
这是C++的写法,如何改成c#的啊,求帮助~~