C实现的多项式拟合函数

整理自《C常用算法程序集》 作者 徐士良 清华大学出版社 8.1最小二乘曲线拟合

 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;
}

例子:
M=3; 表示3次多项式;
x作为数据点之外的一个自变量,其对应的函数值:
y = (int)(A[0]+A[1]*x+A[2]*x*x+A[3]*x*x*x);

发布了37 篇原创文章 · 获赞 33 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xu_fengyu/article/details/87886997