急需一道matlab程序设计题,至少30行,能运行出来的,另外能解释一下这个程序是干什么的,谢谢了

如题所述

第1个回答  2010-05-22
1、对函数 在n个节点上用拉格朗日、分段线性、三次样条三种插值方法,计算m个插值点的函数值,通过对函数和图形的输出,将三种插值结果与精确值进行比较,适当增加n,再作比较,由此做出初步分析。
解:
Step1、
Matlab 计算源程序:
%拉格朗日插值
function y=lagr(x0,y0,x)
n=length(x0);m=length(x);
for i=1:m
z=x(i);
s=0;
for k=1:n
p=1;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end

clear all;
x0=-1:0.5:1; %n=5,产生节点列x0,y0
y0=(1-x0.^2).^0.5;
x=-1:0.02:1; %产生插值节点列x,间隔0.02
y=(1-x.^2).^0.5; %计算精确值
y1=lagr(x0,y0,x); %计算拉格朗日插值
y2=interp1(x0,y0,x);%计算分段线性插值
y3=spline(x0,y0,x); %计算三次样条插值
plot(x,y,'k-',x,y1,'b+',x,y2,'g*',x,y3,'r');%将4条曲线绘在同一图中比较
gtext('黑色:y=sqrt(1-x0.^2)','FontSize',12);
gtext('蓝色:Lagr.','FontSize',12);
gtext('绿色:Pies.Lin.','FontSize',12);
gtext('红色:Spline','FontSize',12);

a1=0; %提取20个数据进行比较,并计算平均平方误差
a2=0;
a3=0;
for k=1:20
xx(k)=x(5*k-1);
yy(k)=y(5*k-1);
yy1(k)=y1(5*k-1);
yy2(k)=y2(5*k-1);
yy3(k)=y3(5*k-1);
a1=a1+(yy1(k)-yy(k))^2;
a2=a2+(yy2(k)-yy(k))^2;
a3=a3+(yy3(k)-yy(k))^2;
end
A=[a1,a2,a3]./20;
[xx' yy' yy1' yy2' yy3']
A
【结果计算】

数值比较如下:
x y y1 y2 y3

-0.9400 0.3412 0.1800 0.1039 0.1656
-0.8400 0.5426 0.4229 0.2771 0.3992
-0.7400 0.6726 0.6057 0.4503 0.5846
-0.6400 0.7684 0.7400 0.6235 0.7273
-0.5400 0.8417 0.8362 0.7967 0.8329
-0.4400 0.8980 0.9030 0.8821 0.9070
-0.3400 0.9404 0.9477 0.9089 0.9552
-0.2400 0.9708 0.9760 0.9357 0.9830
-0.1400 0.9902 0.9923 0.9625 0.9960
-0.0400 0.9992 0.9994 0.9893 0.9998
0.0600 0.9982 0.9986 0.9839 0.9995
0.1600 0.9871 0.9898 0.9571 0.9944
0.2600 0.9656 0.9714 0.9303 0.9788
0.3600 0.9330 0.9402 0.9035 0.9474
0.4600 0.8879 0.8916 0.8767 0.8945
0.5600 0.8285 0.8196 0.7621 0.8145
0.6600 0.7513 0.7165 0.5889 0.7019
0.7600 0.6499 0.5734 0.4157 0.5511
0.8600 0.5103 0.3796 0.2425 0.3565
0.9600 0.2800 0.1231 0.0693 0.1126

平均平方误差:
A =

0.0047 0.0204 0.0063
根据以上数据可计算出各种插值方法算出值与精确值之间的平均平方误差: (n=20)
拉格朗日插值法:
线性插值法:
三次样条插值法:

Step2、
改变n值。
Matlab源程序:

x0=-1:0.2:1; %n=11,产生节点列x0,y0
y0=(1-x0.^2).^0.5;
x=-1:0.02:1; %产生插值节点列x,间隔0.02
y=(1-x.^2).^0.5; %计算精确值
y1=lagr(x0,y0,x); %计算拉格朗日插值
y2=interp1(x0,y0,x);%计算分段线性插值
y3=spline(x0,y0,x); %计算三次样条插值
plot(x,y,'k-',x,y1,'b+',x,y2,'g*',x,y3,'r');%将4条曲线绘在同一图中比较
gtext('黑色:y=sqrt(1-x0.^2)','FontSize',12);
gtext('蓝色:Lagr.','FontSize',12);
gtext('绿色:Pies.Lin.','FontSize',12);
gtext('红色:Spline','FontSize',12);

a1=0; %提取20个数据进行比较,并计算平均平方误差
a2=0;
a3=0;
for k=1:20
xx(k)=x(5*k-1);
yy(k)=y(5*k-1);
yy1(k)=y1(5*k-1);
yy2(k)=y2(5*k-1);
yy3(k)=y3(5*k-1);
a1=a1+(yy1(k)-yy(k))^2;
a2=a2+(yy2(k)-yy(k))^2;
a3=a3+(yy3(k)-yy(k))^2;
end
A=[a1,a2,a3]./20;
[xx' yy' yy1' yy2' yy3']
A
【结果计算】

数值结果为:
x y y1 y2 y3

-0.9400 0.3412 0.2829 0.1800 0.2453
-0.8400 0.5426 0.5368 0.4800 0.5245
-0.7400 0.6726 0.6746 0.6600 0.6842
-0.6400 0.7684 0.7688 0.7600 0.7732
-0.5400 0.8417 0.8414 0.8350 0.8386
-0.4400 0.8980 0.8979 0.8932 0.8968
-0.3400 0.9404 0.9405 0.9355 0.9413
-0.2400 0.9708 0.9708 0.9671 0.9711
-0.1400 0.9902 0.9901 0.9859 0.9900
-0.0400 0.9992 0.9992 0.9960 0.9992
0.0600 0.9982 0.9982 0.9939 0.9981
0.1600 0.9871 0.9871 0.9838 0.9870
0.2600 0.9656 0.9656 0.9608 0.9661
0.3600 0.9330 0.9330 0.9292 0.9336
0.4600 0.8879 0.8878 0.8816 0.8860
0.5600 0.8285 0.8283 0.8233 0.8259
0.6600 0.7513 0.7521 0.7400 0.7587
0.7600 0.6499 0.6518 0.6400 0.6595
0.8600 0.5103 0.4992 0.4200 0.4798
0.9600 0.2800 0.2040 0.1200 0.1708

A =

0.0005 0.0032 0.0011
根据以上数据可计算出各种插值方法算出值与精确值之间的平均平方误差:
拉格朗日插值法:
线性插值法:
三次样条插值法:

【结果分析与讨论】
1、由图形和数值分析都能看出插值与精确函数值的接近度由好到坏依次为:拉格朗日插值、三次样条插值、分段线性插值,和书中三次样条插值、分段线性插值、拉格朗日插值的结论不同。可见,拉格朗日插值法在收敛的情况下,与真实值还是很接近的,但是在一些情况下,插值不收敛于函数值,出现龙格振荡。
2、由图线和数值(平均平方误差)可见节点数越多(n越大),插值与真实值越接近。
相似回答