现有多个点,其位置在Y轴方向有一定偏差,比如下面5个点:
(0,20)、(10,21)、(20,18),(30,22)、(40,19)用这5个点连出来的是一条折线,如何才能将折线拟和成一条直线,且保证近似度最好???我听说过什么最小二乘法,但我对算法懂得很少,不知道怎么用。麻烦知道的大侠给出代码或类,十分感谢!!

解决方案 »

  1.   

    看看这个公式吧:
    http://www.math.sjtu.edu.cn/gskc/syal/最小64.gif那个n就是你点的个数,xi和yi表示各点的x值和y值求出a和b之后,就知道直线了:y=ax+b
      

  2.   

    1、提供y=kx+b列出多组方程,利用最小二乘法列矩阵,解行列式;
    2、看看《测量平差原理》
      

  3.   

    你看能用不
    #include"stdio.h"
    const int N = 5;
    int main(void)
    {
    double* fLS(int x[],double y[]);
    int x[N] = {0,10,20,30,40};
    double y[N] = {20,21,18,22,19};
    double *p; p = fLS(x,y);
    for(int i=0;i<N;i++)
    {
    printf("%f\n",*(p+i));
    }
        return 0;
    }//最小二乘法
    double* fLS(int x[],double y[])
    {
    int axy=0, ax=0, ay=0, ax2=0, axx=0;
    double a=0, b=0, *p; 
    for(int i=0;i<N;i++)
    {

    axy += x[i]*y[i];
    ax  += x[i];
    ay  += y[i];
    axx += x[i]*x[i];
    }
    ax2 = ax*ax; a = (N*axy - ax*ay)/(N*axx-ax2);
    b = ay/N - a*ax/N;
    for(i=0;i<N;i++)
    {
    y[i] = a*x[i] + b;
    }
    p = y;
    return p;
    }
      

  4.   

    弄错了,把下面的int改为double才对//最小二乘法
    double* fLS(int x[],double y[])
    {
    int axy=0, ax=0, ay=0, ax2=0, axx=0;
    double a=0, b=0, *p;