最小二乘法拟合C语言实现

#include
#include
#include
#include
float average(int n,float *x)
{int i; float av; av=0; for(i=0;iav=av/n; return(av); } //平方和 float spfh(int n,float *x)
{int i; float a; a=0; for(i=0;ia+=(*(x+i))*(*(x+i)); return(a); } //和平方
float shpf(int n,float *x) {int i; float a,b;
a=0; for(i=0;i} //两数先相乘,再相加
float dcj(int n,float *x,float *y)
{int i; float a; a=0; for(i=0;ia+=(*(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;ireturn(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);
printf("n=%d\n",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的值");
for(i=0;iprintf("请输入y的值,请注意与x的值一一对应");
for(i=0;i//x[0]=0.1;x[1]=0.3;x[2]=0.4;x[3]=0.55;x[4]=0.7;x[5]=0.8;x[6]=0.95;
//y[0]=15;y[1]=18;y[2]=19;y[3]=21;y[4]=22.6;y[5]=23.8;y[6]=26; for(i=0;i{ printf("x[%d]=%5.4f ",i,*(x+i));
printf("y[%d]=%5.4f\n",i,*(y+i));
} a=xsa(n,x,y); b=xsb(n,x,y,a);
printf("经最小二乘法拟合得到的一元线性方程为:\n");
printf("f(x)=%5.4fx+%5.4f\n",a,b);
}

相关文档
最新文档