ITPub博客

首页 > IT职业 > IT生活 > 最小二乘法曲线拟合 (转)

最小二乘法曲线拟合 (转)

原创 IT生活 作者:worldblog 时间:2007-12-03 10:50:31 0 删除 编辑
最小二乘法曲线拟合 (转)[@more@]

//最小二乘法曲线拟合
typedef CArrayCDoubleArray;
BOOL CalculateCurveParameter(CDoubleArray *X,CDoubleArray *Y,long M,long N,CDoubleArray *A)
{
 //X,Y --  X,Y两轴的坐标
 //M  --  结果变量组数
 //N  --  采样数目
 //A  --  结果参数

 register long i,j,k;
 double Z,D1,D2,C,P,G,Q;
 CDoubleArray B,T,S;
 B.SetSize(N);
 T.SetSize(N);
 S.SetSize(N);
 if(M>N)M=N;
 for(i=0;i (*A)[i]=0;
 Z=0;
 B[0]=1;
 D1=N;
 P=0;
 C=0;
 for(i=0;i {
 P=P+(*X)[i]-Z;
 C=C+(*Y)[i];
 }
 C=C/D1;
 P=P/D1;
 (*A)[0]=C*B[0];
 if(M>1)
 {
 T[1]=1;
 T[0]=-P;
 D2=0;
 C=0;
 G=0;
 for(i=0;i {
 Q=(*X)[i]-Z-P;
 D2=D2+Q*Q;
 C=(*Y)[i]*Q+C;
 G=((*X)[i]-Z)*Q*Q+G;
 }
 C=C/D2;
 P=G/D2;
 Q=D2/D1;
 D1=D2;
 (*A)[1]=C*T[1];
 (*A)[0]=C*T[0]+(*A)[0];
 }
 for(j=2;j {
 S[j]=T[j-1];
 S[j-1]=-P*T[j-1]+T[j-2];
 if(j>=3)
 {
 for(k=j-2;k>=1;k--)
 S[k]=-P*T[k]+T[k-1]-Q*B[k];
 }
 S[0]=-P*T[0]-Q*B[0];
 D2=0;
 C=0;
 G=0;
 for(i=0;i {
 Q=S[j];
 for(k=j-1;k>=0;k--)
 Q=Q*((*X)[i]-Z)+S[k];
 D2=D2+Q*Q;
 C=(*Y)[i]*Q+C;
 G=((*X)[i]-Z)*Q*Q+G;
 }
 C=C/D2;
 P=G/D2;
 Q=D2/D1;
 D1=D2;
 (*A)[j]=C*S[j];
 T[j]=S[j];
 for(k=j-1;k>=0;k--)
 {
 (*A)[k]=C*S[k]+(*A)[k];
 B[k]=T[k];
 T[k]=S[k];
 }
 }
 return TRUE;
}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-987583/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    6241
  • 访问量
    2410110