描述如下:多元线性方程组AX=B,令Y=AX,B是Y的测量值,找出X使Y与B的距离最小,请哪位高手给段源码,感激不尽,谢谢!如有其他方法,不用最小二乘也可以。

解决方案 »

  1.   

    void  Min2Method(double &xyTopX, double &xyTopY, int  X[], int Y[], int nCount)
    /////////////////////////////////////////////////////////////////////////////////////
    ////////  功能描述:利用最小二乘法求斜率                                   //////////
    ////////            xyTopX -- 截距                                         //////////
    ////////            xyTopY -- 斜率
    ////////            nCount -- 点数
    /////////////////////////////////////////////////////////////////////////////////////
    {
    int      i;
    double   SumX, SumY, SumXY, SumX2;

    SumX = 0;
    SumX2 = 0;
    for( i=0; i<nCount; i++)
    {
    SumX += X[i];
    SumX2 += (X[i]*X[i]);
    }

    SumY = 0;
    for( i=0; i<nCount; i++)
    {
    SumY += Y[i];
    } SumXY = 0;
    for( i=0; i<nCount; i++)
    {
    SumXY += ( X[i]* Y[i]);
    } xyTopX = ( (SumX2*SumY - SumX*SumXY) / (nCount*SumX2 - SumX * SumX));
    xyTopY = ( (nCount*SumXY - SumX*SumY) / (nCount*SumX2 - SumX * SumX));
    }
      

  2.   

    void LineFit()
    {
    float   av_x,av_y; //声明变量   
    float   L_xx,L_yy,L_xy;
    int i;
    //变量初始化    av_x=0; //X的平均值   
    av_y=0; //Y的平均值   
    L_xx=0; //Lxx   
    L_yy=0; //Lyy   
    L_xy=0; //Lxy   
    int nPtCount;
    nPtCount = m_uCurveGraphStruct.m_uLine.GetSize();
    for(i=0;i<nPtCount;i++) //计算X、Y的平均值   
    {   
    av_x+=m_uCurveGraphStruct.m_uLine.GetAt(i).X/nPtCount;   
    av_y+=m_uCurveGraphStruct.m_uLine.GetAt(i).Y/nPtCount;   
    }   
    for(i=0;i<nPtCount;i++) //计算Lxx、Lyy和Lxy   
    {   
    L_xx+=(m_uCurveGraphStruct.m_uLine.GetAt(i).X-av_x)*(m_uCurveGraphStruct.m_uLine.GetAt(i).X-av_x);   
    L_yy+=(m_uCurveGraphStruct.m_uLine.GetAt(i).Y-av_y)*(m_uCurveGraphStruct.m_uLine.GetAt(i).Y-av_y);   
    L_xy+=(m_uCurveGraphStruct.m_uLine.GetAt(i).X-av_x)*(m_uCurveGraphStruct.m_uLine.GetAt(i).Y-av_y);   
    }
    if(nPtCount > 1)
    {
    GraphPoint p(L_xy/L_xx,av_y-L_xy*av_x/L_xx);
    m_KB = p;
    }
    }
    CArray <point,point> m_uLine;
      

  3.   

    k = m_KB.X;
    b = m_KB.Y;y=kx+b