用正交多项式做最小二乘拟合

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于用正交多项式做最小二乘拟合的实验报告

1.实验目的:

用正交多项式做最小二乘拟合及拟合图形

2.实验内容:

编写用正交多项式做最小二乘拟合的程序,并用于求解一个任意给定的数的3次多项式最小二乘拟合问题,在这里给出数据如下:

对表格中数据用正交多项式做最小二乘拟合在拟合完后作出拟合曲线的图形,计算平方误差,最后对它们进行分析。

程序如下:

1). 构建的正交多项式最高项次数为3时的程序:

>> x= 1:0.3:4;

>> y=[2.718 3.669 4.95 6.686 9.025 12.182 16.445 22.198 29.964

40.447 54.598];

>> n=3; 构建的正交多项式最高项次数为3

>> result=inputdlg({'请输入权向量w:'},'charpt-3',1,{'[1 1 1 1 1 1 1 1 1 1 1]'});

>> w=str2num(char(result)); 利用str2num函数将数值型转化为符号型

>> m=length(x)-1;

>> s1=0;

>> s2=ones(1,m+1);

>> v2=sum(w);

>> d(1)=y*w';

>> c(1)=d(1)/v2;

>> for k=1:n

xs=x.*s2.^2*w';

a(k)=xs/v2;

if(k==1)

b(k)=0;

else

b(k)=v2/v1;

end

s3=(x-a(k)).*s2-b(k)*s1;

v3=s3.^2*w';

d(k+1)=y.*s3*w';

c(k+1)=d(k+1)/v3;

s1=s2;

s2=s3;

v1=v2;

v2=v3;

end

>> r=y.*y*w'-c*d'

r =

0.8918

>> alph=zeros(1,n+1)

alph =

0 0 0 0

>> T=zeros(n+1,n+2);

>> T(:,2)=ones(n+1,1);

>> T(2,3)=-a(1);

>>

>> if(n>=2)

for k=3:n+1

for i=3:k+1

T(k,i)=T(k-1,i)-a(k-1)*T(k-1,i-1)-b(k-1)*T(k-2,i-2); end

end

end

>> for i=1:n+1

for k=i:n+1

alph(n+2-i)=alph(n+2-i)+c(k)*T(k,k+2-i);

end

end

>> xmin=min(x);

>> xmax=max(x);

>> dx=(xmax-xmin)/(25*m);

>> t=(xmin-dx):dx:(xmax+dx);

>> s=alph(1);

>> for k=2:n+1

s=s.*t+alph(k);

end

>> plot(x,y,'x',t,s,'-');

>> grid on;

>> disp(alph);

>> disp(r)

2). 构建的正交多项式最高项次数为4时,将上述程序中的n改为4即可3). 构建的正交多项式最高项次数为8时,将上述程序中的n改为8即可3.实验结果:

1).n=3

>> plot(x,y,'x',t,s,'-')

>> disp(alph);

2.3365 -10.2050 19.2296 -8.9441

>> disp(r)

0.8918

2).n=4

r =

0.0185

alph =

0 0 0 0 0

0.5685 -3.3485 9.8348 -9.9063 5.6001

0.0185

2).n=8

r =

9.9721e-007

alph =

0 0 0 0 0 0 0 0 0

Columns 1 through 6

-0.0049 0.1028 -0.9037 4.4386 -13.1107 24.3727

Columns 7 through 9

-26.4044 17.4675 -3.2398

9.9721e-007

4.实验结论:

从上面的图像可以看出利用正交多项式做最小二乘拟合的效果很不错,误差很小,且正交多项式的最高次数项次数越高,误差越小。

用正交多项式做最小二乘拟合的这种方法的编程不用解线性方程组,只用递推公式,并且当逼近次数增加一次时,只要把程序中循环数加1即可,其余项都不用改变。它是就目前来说用多项式做曲线拟合最好的计算方法。

相关文档
最新文档