• 首页
  • 小学语文
  • 中学语文
  • 中学英语
  • 免费论文
  • 教学随笔
  • 学生作文
  • 综合考试
  • 试题教案
  • 育儿话题
  • 教学资源
  • 编程技术
  • 博客
  • 最小二乘法曲线拟合

    日期:2002-08-05  地址:  作者:

    //最小二乘法曲线拟合
    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;
    }

    对 最小二乘法曲线拟合 文章的评论    [查看网友评论]

    验证码:
    匿名发表: