www.pudn.com > pcir.rar > pcir.cpp


//最小二乘法 
void pcir(double X[],double Y[],double A[],int N,int M,double &DT1,double &DT2,double &DT3) 
{ 
	// X[] Y[] 使需要拟合的点,A[]是拟合曲线的系数, 
	double S[21],T[21],B[21]; 
	double Z,D1,P,C,D2,G,Q,DT; 
	int i,j,jk; 
    for(i=1;i<=M;i++)//	DO 5 i=1,M 
	{ 
		A[i]=0.0; 
	} 
 
	if (M>=N) M=N; 
	if (M>=20) M=20; 
	Z=0.0; 
/*	for(i=1;i<=N;i++)//DO 10 i=1,N 
	{ 
		Z=Z+X[i]/N; 
	}//10	Z=Z+X(i)/N*/ 
	B[1]=1.0; 
	D1=N; 
	P=0.0; 
	C=0.0; 
	for(i=1;i<=N;i++) 
	{ 
		P=P+(X[i]-Z); 
		C=C+Y[i]; 
	} 
	C=C/D1; 
	P=P/D1; 
	A[1]=C*B[1]; 
	if(M>1) 
	{ 
	  T[2]=1.0; 
	  T[1]=-P; 
	  D2=0.0; 
	  C=0.0; 
	  G=0.0; 
	  for(i=1;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[2]=C*T[2]; 
	  A[1]=C*T[1]+A[1]; 
	} 
	for(j=3;j<=M;j++) 
	{ 
	  S[j]=T[j-1]; 
	  S[j-1]=-P*T[j-1]+T[j-2]; 
	  if(j>=4) 
		  for(jk=j-2;jk>=2;jk--) 
            S[jk]=-P*T[jk]+T[jk-1]-Q*B[jk]; 
	  S[1]=-P*T[1]-Q*B[1]; 
	  D2=0.0; 
	  C=0.0; 
	  G=0.0; 
	  for(i=1;i<=N;i++) 
	  { 
	    Q=S[j]; 
		for(jk=j-1;jk>=1;jk--) 
		{     
			Q=Q*(X[i]-Z)+S[jk]; 
		} 
	    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(jk=j-1;jk>=1;jk--) 
	  { 
	    A[jk]=C*S[jk]+A[jk]; 
	    B[jk]=T[jk]; 
	    T[jk]=S[jk]; 
	  } 
	} 
	DT1=0.0; 
	DT2=0.0; 
	DT3=0.0; 
	 
	for(i=1;i<=N;i++) 
	{ 
	  Q=A[M]; 
	  for(jk=M-1;jk>=1;jk--) 
	  { 
		  Q=Q*(X[i]-Z)+A[jk]; 
	  } 
	  DT=Q-Y[i]; 
	  if (fabs(DT)>DT3) DT3=fabs(DT); 
	  DT1=DT1+DT*DT; 
	  DT2=DT2+fabs(DT); 
	} 
 
//AfxMessageBox("hello"); 
 
}