这些点,有的近似在一条直线上,有的近似在另一条直线上,有的不在直线上,如何找出近似在一条直线上的点,并求出直线方程?下面是以前的回复:

“哈哈,这个我做过,其实就是要先知道方程形式,看样子你的方程应该是 f(x) = ax + b 的形式,然后做拟合,求出 a、b,然后用误差理论中的3σ准则去判断一个点是否偏离这条直线太远,就得出结论了。” 
//////// 
哈哈,这个我做过,其实就是要先知道方程形式,看样子你的方程应该是 f(x) = ax + b 的形式,然后做拟合,求出 a、b,然后用误差理论中的3σ准则去判断一个点是否偏离这条直线太远,就得出结论了。 
////////////// 
直线方程是通过算法求出来的,例如我上面说的 a、b,可以通过最小二乘法求出来,求出来之后不就知道了吗? 
///////////// 
平面上的N个点(x,y),组成了N个方程,但是未知数只有两个,例如a、b,在这种情况下,你要求出a、b,其实就是解一个“超定方程组”的问题,最小二乘法可以解决。你这个只是线性的,比非线性的容易多了,你得去看看最小二乘法的原理,我们总不可能在这里把一本书贴上来吧 ”这是以前的回复,关键是我不懂,谁能给个算法?分不够可以再加

解决方案 »

  1.   

    你就是要拟合一条直线使这些散点尽量靠近这条直线吧,用matlab最方便了,有内置函数:
    p=polyfit(x,y,1);  %x,y是散点的坐标,p就是这条直线方程的两个系数
    yl=polyval(p,x);   %这是求直线在x这些位置上的值
    err=std(yl-y);     %求散点和直线的标准差
      

  2.   

    只求出一条直线的话,可以用下面的代码//最小二乘法直线拟合
    BOOL CalculateLineKB(CFoldPointList *m_FoldList,double &k,double &b)
    {
     //最小二乘法直线拟合
     //m_FoldList为关键点(x,y)的链表
     //拟合直线方程(Y=kX+b),k和b为返回值 if(m_FoldList==NULL)return FALSE;
     long lCount=m_FoldList->GetCount();
     if(lCount<2)return FALSE;
     CFoldPoint *pFold;
     double mX,mY,mXX,mXY,n;
     mX=mY=mXX=mXY=0;
     n=lCount;
     POSITION pos=m_FoldList->GetHeadPosition();
     while(pos != NULL)
     {
      pFold=m_FoldList->GetNext(pos);
      mX+=pFold->X;
      mY+=pFold->Y;
      mXX+=pFold->X*pFold->X;
      mXY+=pFold->X*pFold->Y;
     }
     if(mX*mX-mXX*n==0)return FALSE;
     k=(mY*mX-mXY*n)/(mX*mX-mXX*n);
     b=(mY-mX*k)/n;
     return TRUE;
    }