最小二乘法C语言的实现
《传感器技术》
题目要求:使用最小二乘法求线性度的拟合直线方程
程序:
#include
#include
#include
#include
float average(int n,float *x)
{int i;
float av;
av=0;
for(i=0;i
av+=*(x+i);
av=av/n;
return(av);
}
//平方和
float spfh(int n,float *x)
{int i;
float a,b;
a=0;
for(i=0;i
a+=(*(x+i))*(*(x+i));
return(a);
}
//和平方
float shpf(int n,float *x)
{int i;
float a,b;
a=0;
for(i=0;i
a=a+*(x+i);
b=a*a/n;
return(b);
}
//两数先相乘,再相加
float dcj(int n,float *x,float *y)
{int i;
float a;
a=0;
for(i=0;i
a+=(*(x+i))*(*(y+i));
return(a);
}
//两数先相加,再相乘
float djc(int n,float *x,float *y)
{int i;
float a=0,b=0;
for(i=0;i
{a=a+*(x+i);
b=b+*(y+i);
}
a=a*b/n;
return(a);
}
//系数a
float xsa(int n,float *x,float *y)
{float a,b,c,d,e;
a=spfh(n,x);
b=shpf(n,x);
c=dcj(n,x,y);
d=djc(n,x,y);
e=(c-d)/(a-b);
//printf("%f %f %f %f",a,b,c,d);
return(e);
}
float he(int n,float *y)
{int i;
float a;
a=0;
for(i=0;i
a=a+*(y+i);
return(a);
}
float xsb(int n,float *x,float *y,float a)
{ float b,c,d;
b=he(n,y);
c=he(n,x);
d=(b-a*c)/n;
return(d);
}
void main()
{ int n,i;
float *x,*y,a,b;
printf("请输入将要输入的有效数值组数n的值:");
scanf("%d",&n);
x=(float*)calloc(n,sizeof(float));
if(x==NULL)
{printf("内存分配失败");
exit(1);
}
y=(float*)calloc(n,sizeof(float));
if(y==NULL)
{printf("内存分配失败");
exit(1);
}
printf("请输入x的值\n");
for(i=0;i
printf("请输入y的值,请注意与x的值一一对应:\n");
for(i=0;i
for(i=0;i
{ printf("x[%d]=%3.2f ",i,*(x+i));
printf("y[%d]=%3.2f\n",i,*(y+i));
}
a=xsa(n,x,y);
b=xsb(n,x,y,a);
printf("经最小二乘法拟合得到的一元线性方程为:\n");
printf("f(x)=%3.2fx+%3.2f\n",a,b);
}
运行:按照程序要求来,输入两数之间用空格号区分。
运行结果如下:
注意:不要直接引用运行结果图片,窗口标题会暴露上级目录,例如:熊新昊pc