最小二乘法曲线拟合

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

//最小二乘法曲线拟合

typedef CArray<double,double>CDoubleArray;

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<M;i++)

(*A)[i]=0;

Z=0;

B[0]=1;

D1=N;

P=0;

C=0;

for(i=0;i<N;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<N;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<M;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<N;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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航