求C++对数据进行多项式拟合Matrix_PolyFit 改成C#可用

chituo 2013-01-08 04:40:32
功能:对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#的啊,求帮助~~
...全文
490 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
a174740341 2015-07-01
  • 打赏
  • 举报
回复
MathNet.Numerics.Fit.Polynomial(x.ToArray(), y.ToArray(), N); 有现成的啊
LJJH12345678 2015-06-12
  • 打赏
  • 举报
回复
吧主还在么? 为什么你的代码里面返回值是true或者false啊,说好的参数ks返回呢?
ZBZYWZZY 2015-05-31
  • 打赏
  • 举报
回复
能用吗?正确吗?
林爷万福 2013-07-15
  • 打赏
  • 举报
回复
class Matrix_PolyFit { public bool matrix_PolyFit(double[] x, double[] y, int X_Y_Number, int Fit_N, ref 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; Fit_N++; double[] x2 = new double[Fit_N*Fit_N]; double[] y2 = new double[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 = 0; j < Fit_N; j++) { temp = 0; n = i + j; for (index = 0; index < X_Y_Number; index++) { temp += Math.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 += Math.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] * Math.Pow(x[j], i); } y2[i] = temp; } return true; } }

111,111

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧