700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言代码实现最小二乘法线性拟合直线

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

时间:2023-07-21 23:28:37

相关推荐

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

*/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。