//-------------------------11--------------------------
//通用曲线最小二乘曲线拟合参数
//iParNum―拟合曲线项数,iParNum<=pCurve的个数,且iParNum<=20
//参数说明:pCurve―曲线数据,pParam―拟合参数,iParam―参数个数,D**―分别代表数据点偏差的平方和、绝对值和绝对值的最大值
//--------------------------------------------------------
extern "C" int APIENTRY CurveNihe(CZYMatrix<double>*pCurve,CArray<double,double>*pParam,int iParNum,double &DPFH,double &DJDH,double &DJDMax)
{
int iDataNum=pCurve->GetRowCount();
if(iDataNum<=0) return -1;
if(pCurve->GetColumnCount()<2) return -1;
double B[20],S[20],T[20];
double Z,D1,P,C,D2,G,Q,DT;
if(iParNum>iDataNum) iParNum=iDataNum;
if(iParNum>20) iParNum=20;
pParam->RemoveAll();
pParam->SetSize(iParNum);
for(int i=0;i<pParam->GetSize();i++) pParam->SetAt(i,0);
Z=0;
for(i=0;i<iDataNum;i++) Z+=pCurve->GetData(i,0)/iDataNum;
B[0]=1.0;
D1=iDataNum;
P=0;
C=0;
for(i=0;i<iDataNum;i++)
{
P+=(pCurve->GetData(i,0)-Z);
C+=pCurve->GetData(i,1);
}
C/=D1;P/=D1;
pParam->SetAt(0,C*B[0]);
if(iParNum>1)
{
T[1]=1.0;
T[0]=-P;
D2=0;C=0;G=0;
for(i=0;i<iDataNum;i++)
{
Q=pCurve->GetData(i,0)-Z-P;
D2=D2+Q*Q;
C=pCurve->GetData(i,1)*Q+C;
G=(pCurve->GetData(i,0)-Z)*Q*Q+G;
}
C/=D2;P=G/D2;Q=D2/D1;D1=D2;
pParam->SetAt(1,C*T[1]);
pParam->SetAt(0,C*T[0]+pParam->GetAt(0));
}
for(int j=2;j<iParNum;j++)
{
S[j]=T[j-1];
S[j-1]=-P*T[j-1]+T[j-2];
if(j>=3)
{
for(int k=j-2;k>=1;k--) S[k]=-P*T[k]+T[k-1]-Q*B[k];