曲线拟合的最小二乘法

曲线拟合的最小二乘法,第1张

对于曲线拟合函数ψ(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编写最小二乘法的程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10047363.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存