C语言代码实现最小二乘法线性拟合直线

#include<stdio.h>
/*
要求的方程为: y=ax+b。

                  N∑xy-∑x∑y                        _     _
其中:a= --------------------        b = y - ax
                N∑(x^2)-(∑x)^2

设:A=∑xy  B=∑x  C=∑y  D=∑(x^2)

                   NA-BC      
则:     a = -----------                 b = C/N-aB/N
                    ND-BB

注:N为要拟合的点数量
*/

#define POINT_NUM  20  //最多输入20个点进行线性拟和
typedef struct POINT //点的结构
{
    double x;
    double y;
}POINTS;

POINTS  points[POINT_NUM]; //存放点数据

/*
参数说明:
        P[POINT_NUM]:传入要线性拟合的点数据(结构体数组)
        N:线性拟合的点的数量
        K0:直线斜率参数存放地址
        b0:直线截距参数存放地址
*/
void Least_square_method(POINTS P[],int N,double *K0,double *b0)
{
    int i=0;
    double K=0,b=0,A=0,B=0,C=0,D=0;
    for(i=0;i<N;i++)
    {
        A+=P[i].x*P[i].y;
        B+=P[i].x;
        C+=P[i].y;
        D+=P[i].x*P[i].x;
    }
    K=(N*A-B*C)/(N*D-B*B);
    b=C/N-K*B/N;
    /*将计算得到的直线参数通过指针传递到函数外部*/
    *K0=K;
    *b0=b;
    
/*    printf("A=%f\nB=%f\nC=%f\nD=%f\n",A,B,C,D);
    if(b>0) printf("y=%fx+%f\n",K,b);
    else if(b==0)printf("y=%fx\n",K);
    else printf("y=%fx%f\n",K,b);*/
}


int main()
{
    double k,b;
    points[0].x=123;
    points[1].x=130;
    points[2].x=141;
    points[3].x=150;
    points[4].x=165;
    
    points[0].y=150;
    points[1].y=160;
    points[2].y=175;
    points[3].y=190;
    points[4].y=205;
    
    Least_square_method(points,5,&k,&b); //调函数拟合直线
    
    if(b>0) printf("函数为:y=%fx+%f\n",k,b);
    else if(b<0) printf("函数为:y=%fx%f\n",k,b);
    else printf("函数为:y=%fx\n",k);
    return 0;
}
/*
在EXCEL中计算得到的拟合函数为 y = 1.3342x - 13.187
程序运算结果:  函数为:y=1.334183x-13.187113
*/
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值