急~~~~~~!!!求解!用C语言编写最小二乘法求数据的拟合曲线~并做出图显示拟合效果!高分悬赏!
#includestdio.h
#includemath.h
void Guass(int n,float Array[][10])
{
float s,u;
int i,j,k,a,x,y;
for(i=0;in-1;i++)
{
s=Array[i][i];
k=i;
for(a=i+1;an;a++)
{
if(fabs(s) fabs(Array[a][i]))
{
s=Array[a][i];
k=a;
}
}
if(k!=i)
{
for(j=i;jn+1;j++)
{
u=Array[i][j];Array[i][j]=Array[k][j];Array[k][j]=u;
}
}
for(x=i+1;xn;x++)
{
u=Array[x][i]/s;
for(y=i;yn+1;y++)
{
Array[x][y]=Array[x][y]-u*Array[i][y];
}
}
}
for(x=n-1;x=0;x–)
{
s=0;
for(y=x+1;yn;y++)
s=s+Array[x][y]*Array[y][n];
Array[x][n]=(Array[x][n]-s)/(Array[x][x]);//得到结果
}
for(i=0;in;i++)printf(“%f “,Array[i][n]);printf(“\n”);
}
int main()
{
int n,i,j;
float Array[10][10];
scanf(“%d”,n);
for(i=0;in;i++)
{
for(j=0;jn+1;j++)
scanf(“%f”,Array[i][j]);
}
Guass(n,Array);
return 0;
}
你的串号我已经记下,采纳后我会帮你制作
求最小二乘曲线的拟合的C语言程序
曲线拟合的最小二乘法
如有实验数据如下
求x=55处的近似值 并画出图形
x 0 10 20 30 40 50 60 70 80 90
y 68 67.1 66.4 65.6 64.6 61.8 61.0 60.8 60.4 60
#include “stdio.h”
#include “graphics.h”
double s(double x[],double y[],double x1)
{
double a,b,tmp1=0,tmp2=0,tmp3=0,tmp4=0,result;
int i=0;
for(;i10;i++)
{
tmp1+=x[i]*x[i];
tmp2+=y[i];
tmp3+=x[i];
tmp4+=x[i]*y[i];
}
b=(tmp1*tmp2-tmp3*tmp4)/(10*tmp1-tmp3*tmp3);
a=(10*tmp4-tmp2*tmp3)/(10*tmp1-tmp3*tmp3);
result=a*x1+b;
return result;
}
void hzbz(int x,int y)
{
int i,j;
line(0,y,1024,y);
moveto(x-200,y);
j=x-200;
for(i=0;i100;i++)
{
if(i%5!=0)
lineto(j,y-5);
else
lineto(j,y-8);
j=j+10;
moveto(j,y);
}
line(x,768,x,0);
moveto(x,y+200);
j=y+640;
for(i=0;i300;i++)
{
if(i%5!=0)
lineto(x+5,j);
else
lineto(x+8,j);
j=j-10;
moveto(x,j);
}
line(x,0,x-8,6);
line(x,0,x+8,6);
line(640,y,634,y-8);
line(640,y,634,y+8);
}
void main()
{
double x[]={0,10,20,30,40,50,60,70,80,90};
double y[]={68,67.1,66.4,65.6,64.6,61.8,61.0,60.8,60.4,60};
int graphdriver=DETECT,graphmode;
int i;
printf(“x=55\ny=%lf\n”,s(x,y,55));
getch();
initgraph(graphdriver,graphmode, “”);
setbkcolor(BLUE);
hzbz(200,200);
moveto(200,200);
for(i=0;i200;i++)
lineto(i+200,-s(x,y,i)+200);
getch();
closegraph();
}
最小二乘法平面方程拟合计算 高手们 给个详细的计算方法
解:
设有n个数据点Pi(xi, yi, zi)。
假设平面方程为:a*x+b*y+c*z+d=0,其中a、b、c、d为待定系数a、b、c不能同时为0。
显然,a*x+b*y+c*z+d=0与
k*a*x+k*b*y+k*c*z+k*d=0(k≠0)
表示同一个平面。故,如d不为0,可通过把方程两边同除以d,把常数项化为1;但d=0时,情况稍微复杂一点。
现在说明大致思路,为讨论方便,开始时暂不假设d=1或0。
设拟合平面的方程为∏:a*x+b*y+c*z+d=0。
数据点Pi到平面a*x+b*y+c*z+d=0的距离设为di,
则di^2=(a*xi+b*yi+c*zi+d)^2/(a^2+b^2+c^2),
令L=∑di^2 (i=1, … , n),为目标函数,现欲使L最小。
L可以看成是关于(a, b, c, d)的函数((xi, yi, zi)均已知),
L取最小值的一个必要(非充分)条件是:
∂L/∂a=0, ∂L/∂b=0, ∂L/∂c=0, ∂L/∂d=0,
∂L/∂a=∑2*xi*(a*xi+b*yi+c*zi+d)/(a^2+b^2+c^2) (i=1, … , n)
=A1*a+B1*b+C1*c+D1*d,
其中,
A1=2/(a^2+b^2+c^2)*(∑xi^2)(i=1, … , n),
B1=2/(a^2+b^2+c^2)*(∑xi*yi)(i=1, … , n),
C1=2/(a^2+b^2+c^2)*(∑xi*zi)(i=1, … , n),
D1=2/(a^2+b^2+c^2)*(∑xi)(i=1, … , n),
同理,
∂L/∂b=A2*a+B2*b+C2*c+D2*d,
∂L/∂c=A3*a+B3*b+C3*c+D3*d,
其中,
A2=2/(a^2+b^2+c^2)*(∑yi*xi)(i=1, … , n),
B2=2/(a^2+b^2+c^2)*(∑yi^2)(i=1, … , n),
C2=2/(a^2+b^2+c^2)*(∑yi*zi)(i=1, … , n),
D2=2/(a^2+b^2+c^2)*(∑yi)(i=1, … , n),
A3=2/(a^2+b^2+c^2)*(∑zi*xi)(i=1, … , n),
B3=2/(a^2+b^2+c^2)*(∑zi*yi)(i=1, … , n),
C3=2/(a^2+b^2+c^2)*(∑zi^2)(i=1, … , n),
D3=2/(a^2+b^2+c^2)*(∑zi)(i=1, … , n),
∂L/∂d=∑2*(a*xi+b*yi+c*zi+d)/(a^2+b^2+c^2) (i=1, … , n)
=D1*a+D2*b+D3*c+D4*d,
其中,D4=2n/(a^2+b^2+c^2)。
于是有方程组:
A1*a+B1*b+C1*c+D1*d=0,
A2*a+B2*b+C2*c+D2*d=0,
A3*a+B3*b+C3*c+D3*d=0,
D1*a+D2*b+D3*c+D4*d=0,
解此方程组即可。具体如何解,可参考计算方法的书,上面有详细说明。
数值方法解线性方程组最好不要用行列式来算。
在如下网址有一篇介绍文档
其中第一步就有遗漏,而且后面还在用行列式来计算,不是太好。
用C语言编写最小二乘法线性拟合
首先你要知道最小二乘法的公式,然后使用数组实现。比如定义数组double x[10]代表十个横坐标,double y[10]代表纵坐标,然后套公式用循环计算