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

最简单易懂的C语言代码实现最小二乘法线性拟合直线

时间:2020-09-16 11:39:48

相关推荐

最简单易懂的C语言代码实现最小二乘法线性拟合直线

最小二乘法拟合直线

#include<stdio.h>/*要求的方程为: y=ax+b。N∑xy-∑x∑y _ _其中:a= --------------- b = y - axN∑(x^2)-(∑x)^2设:A=∑xy B=∑x C=∑y D=∑(x^2)NA-BC则: a = ------- b = C/N-aB/NND-BB注:N为要拟合的点数量*/#define POINT_NUM 30 //最多输入30个点进行线性拟和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*/

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