#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
*/