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

本文介绍了一种使用最小二乘法进行曲线拟合的方法,并提供了一个具体的C++实现示例。该方法通过计算一系列参数来拟合给定的数据点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小二乘法曲线拟合 (转)[@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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-987583/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值