
对于曲线拟合函数ψ(x),不要求其严格的通过所有数据点,也就是说拟合函数ψ(x)在xi处的偏差(亦称残差)不都严格的等于零,即为矛盾方程组:为了是近似曲线能尽量反映所给数据点的变化趋势,要求偏差按照某种度量标准最小。这后面的分析用到了范数的概念。这种方法就叫做曲线拟合的最小二乘法。
我们新建并打开一个excel表格,在excel中输入或打开要进行最小二乘法拟合的数据。此时按住“shift”键,同时用鼠标左键单击以选择数据。单击菜单栏上的“插入”-“图表”-“散点图”图标。
此时,我们选择第一个“仅带数据标记的散点图”图标,随后我们可以在窗口中间d出散点图窗口。鼠标左键单击上边的散点,单击鼠标右键,d出列表式对话框,再单击“添加趋势线(R)”。右侧就会d出“设置趋势线格式”对话框。
利用最小二乘法将上面数据所标示的曲线拟合为二次曲线,使用c语言编程求解函数系数;最小二乘法原理 原理不再赘述,主要是解法采用偏微分求出来的。
#include<stdioh>
#include<mathh>
int main(void)
{
double a,b,e,m,f,f1,f2,g,g1,g2,c,d;
double x[19],y[19];
int i,j;
for(i=0;i<19;i++)
x[i]=i+1;
for(i=0;i<19;i++){
scanf("%lf",&y[i]);
}
scanf("%lf",&a);
scanf("%lf",&b);
f=f1=f2=g=g1=g2=0;
for(j=0;j<10;j++){
for(i=0;i<19;i++){
f=f+2(aexp((i+1)b)-y[i])exp((i+1)b);
f1=f1+2exp(2(i+1)b);
f2=f2+4(i+1)aexp(2(i+1)b)-2(i+1)y[i]exp((i+1)b);
g=g+2(aexp((i+1)b)-y[i])(i+1)aexp((i+1)b);
g1=g1+4(i+1)aexp(2(i+1)b)-2(i+1)y[i]exp((i+1)b);
g2=g2+4pow((i+1)a,2)exp(2(i+1)b)-2pow((i+1),2)ay[i]exp((i+1)b);
}
c=f1a+f2b-f;
d=g1a+g2b-g;
b=(d-c(g1/f1))/(g2-f2(g1/f1));
a=(c-f2b)/f1;
e=0;
m=0;
for(i=0;i<19;i++)
e=e+pow((aexp((i+1)b)-y[i]),2);
for(i=0;i<18;i++){
if(pow((aexp((i+1)b)-y[i]),2)>m)
m=pow((aexp((i+1)b)-y[i]),2);
}
printf("a=%f b=%f 均方误差e=%f 最大偏差m=%f\n",a,b,e/19,sqrt(m));
}
return 0;
}
其中a b为估计值
其实最小二乘法也可以写得不像我原来的那么麻烦:
fid=fopen('inputtxt','r+');
U=fscanf(fid,'%f',a);
fclose(fid);
fid1=fopen('output1txt','r+');
Y=fscanf(fid1,'%f',a);
fclose(fid1);
U1=U(1:a-1);
U2=U(1:a-2);
Y1=Y(1:a-1);
Y2=Y(1:a-2);
D1=-1[0;Y1];
D2=-1[0;0;Y2];
D3=[0;U1];
D4=[0;0;U2];
D=[D1 D2 D3 D4];
Q=inv(D'D)D'Y
下面是递推最小二乘的算法:
m=input('m=')
fid=fopen('inputtxt','r+');
U=fscanf(fid,'%f',a);
fclose(fid);
fid1=fopen('output1txt','r+');
Y=fscanf(fid1,'%f',a);
fclose(fid1);
U1=U(1:m-1);
U2=U(1:m-2);
Y1=Y(1:m-1);
Y2=Y(1:m-2);
Y3=Y(1:m);
D1=-1[0;Y1];
D2=-1[0;0;Y2];
D3=[0;U1];
D4=[0;0;U2];
D=[D1 D2 D3 D4];
Q=inv(D'D)D'Y3;
P=inv(D'D);
%以上程序是用最小二乘法计算的初值,取前m个数据%
for i=m:a-1;
x=[-1Y(i);-1Y(i-1);U(i);U(i-1)];
y=Y(i+1);
p=1/(1+x'Px);
Z=Q+Pxp(y-x'Q);
P=P-Pxpx'P;
q=norm(Z-Q)/norm(Q);
Q=Z;
if q<10e-6;
k=i-m
q
Q
break
end
end
ppp='help me!'
以上就是关于曲线拟合的最小二乘法全部的内容,包括:曲线拟合的最小二乘法、最小二乘法难题、急求用maple编写最小二乘法的程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)