最小二乘法拟合曲线 ( 积分: 100 )

  • 主题发起人 主题发起人 slansam
  • 开始时间 开始时间
S

slansam

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么使用时,输出的结果当M比较大时,A数组就大得惊人.
有人使用过吗?请教请教:
QQ:120807871
Email:slansam@126.com

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)=0;
Z=0;
B[0]=1;
D1=N;
P=0;
C=0;
for(i=0;i<N;i++)
{
P=P+(*X)-Z;
C=C+(*Y);
}
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)-Z-P;
D2=D2+Q*Q;
C=(*Y)*Q+C;
G=((*X)-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)-Z)+S[k];
D2=D2+Q*Q;
C=(*Y)*Q+C;
G=((*X)-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;
}
 
最小二乘法拟合倒是作过,但是只是返回2个或3个参数,您这参数返回一组参数就不知道什么意思了,需要返回多租参数吗?拟合的是什么?
 
我想拟合一组点的坐标啊.(从测量仪里读出来的)
 
后退
顶部