matlab计算拉格朗日牛顿及分段线性插值的程序

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

《工程常用算法》综合实践作业二

班级 学号 姓名 主要工作说明 自评成绩

0718 2010071826 崔洪亮 算式与程序的编写 18 0718 2010071815 侯闰上 流程图的编辑,程序的审查

0718

2010071809

赵化川

报告的整理汇总

一.作业题目:三次样条插值与分段插值

x

3

5

7

9

11 12 13 14 15 y 0 1.2 1.7 2.0 2.1 2.0

1.8

1.2

1.0

1.6

飞机下轮廓线形状大致如下图所示:

要求分别用拉格朗日插值法、Newton 插值法、分段线性插值法和三次样条插值法计算x 每改变0.5时y 的值,即x 取 0.5, 1, 1.5, … , 14.5 时对应的y 值。比较采用不同方法的计算工作量、计算结果和优缺点。

二.程序流程图及图形

1.拉格朗日插值法

开始

x,y,x0

Length (x)==l Ength (y)?

n=length (x)

i=1:n,l=1。

j=1:i-1&j=i+1:n l=l.*(x0-x(j)/x(i)-x(j)

f=f+l*y(i)

结束

机翼

2.牛顿插值法

开始

x,y,xi

Length(x)==l ength(y)?

n=length(x)Y=zeros (n),Y (:1)=y,f=0

a=1:n-1,b=1:n-a,Y(b,a+1)=(Y (b+1,a)-Y(b,a))/(x (b+a)-x(b))

i=1:n,z=1

结束

j=1:i-1,z=z.*(xi-x(j))

f=f+Y(1,i)*z

3.分段线性插值法

开始

x ,y ,x0

length (x )==length(y)?

k=1:n-1

x(k)<=x0&x0《=x(k+1)

temp=x(k)-x(k+1)

f=(x0-x(k+1))/temp*y(k)+(x0-x(k))/(-temp)*y(k+1)

结束

否否

三.matlab 程序及简要的注释(m 文件)

1.拉格朗日插值法

2.牛顿插值法

function f=newdun(x,y,xi) %x 为已知数据点的x 坐标向量 %y 为已知数据点的y 坐标向量 function f=lang(x,y,x0) %x 为已知数据点的x 坐标向量 %y 为已知数据点的y 坐标向量

for a=1:n-1

3.分段线性插值法

%xi 为插值点的x 坐标

%f 为求得的均差牛顿插值多项式 if (length(x)==length(y)) n=length(x); else

disp('The lengths of X ang Y must be not equal!'); return ; end %检错 Y=zeros(n); Y(:,1)=y; for a=1:n-1 for b=1:n-a Y(b,a+1)=(Y(b+1,a)-Y(b,a))/ (x(b+a)-x(b)); %计算均差函数(差商) end end f=0;

for i=1:n z=1;

for j=1:i-1

z=z.*(xi-x(j)); %计算多项式函数 end

f=f+Y(1,i)*z; %计算牛顿插值函数 end

%x0为插值点的x 坐标 %f 为求得的拉格朗日插值多项式 if (length(x)==length(y)) n=length(x);

else

disp('The lengths of X ang Y must be not equal!') return ; end %检错

f=0;

for i=1:n

l=1;

for j=1:i-1

l=l.*(x0-x(j))/(x(i)-x(j)); end ;

for

j=i+1:n l=l.*(x0-x(j))/(x(i)-x(j)); %计算拉格朗日基函数

end ; f=f+l*y(i);

%计算拉格朗日插值函数 end

Return

function f=fd2(x,y,x0) %x 为已知数据点的x 坐标向量 %y 为已知数据点的y 坐标向量 %x0为插值点的x 坐标 %f 为求得的分段线性插值多项式 if (length(x)==length(y)) n=length(x); else disp('The lengths of X and Y must be not equal!') return ; end %检错 for k=1:n-1 if (x(k)<=x0&x0<=x(k+1)) temp=x(k)-x(k+1); f=(x0-x(k+1))/temp*y(k)+(x0- x(k))/(-temp)*y(k+1); end ; end

四.程序运行结果

1.拉格朗日插值法

2.牛顿插值法

3.分段线性插值法 五、对不同实现方法的运行结果进行比较 及总结

>> x=[0 3 5 7 9 11 12 13 14 15]; >> y=[0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6]; >> xi=0.5:0.5:14.5; >> yi=lang(x,y,xi) yi = Columns 1 through 8 -15.4117 -15.9238 -10.9898 -5.4272 -1.2253 1.2000 2.1765 2.2666 Columns 9 through 16 1.9894 1.7000 1.5703 1.6249 1.7995 2.0000 2.1477 2.2040 Columns 17 through 24 2.1752 2.1000 2.0269 1.9904 1.9928 2.0000 1.9537 1.8000 Columns 25 through 29 1.5272 1.2000 0.9656 1.0000 1.3480

>> plot(x,y,'b:',xi,yi)

>> yi=newdun(x,y,xi) yi =

Columns 1 through 8 -15.4117 -15.9238 -10.9898 -5.4272 -1.2253 1.2000 2.1765 2.2666 Columns 9 through 16 1.9894 1.7000 1.5703 1.6249 1.7995 2.0000 2.1477 2.2040 Columns 17 through 24 2.1752 2.1000 2.0269 1.9904 1.9928 2.0000 1.9537 1.8000 Columns 25 through 29 1.5272 1.2000 0.9656 1.0000 1.3480 >> plot(x,y,xi,yi,'g+') >> yi=fd2(x,y,xi) yi = Columns 1 through 8 0.2000 0.4000 0.6000 0.8000 1.0000 1.2000 1.3250 1.4500 Columns 9 through 16 1.5750 1.7000 1.7750 1.8500 1.9250 2.0000 2.0250 2.0500 Columns 17 through 24 2.0750 2.1000 2.0750 2.0500 2.0250 2.0000 1.9000 1.8000 Columns 25 through 29 1.5000 1.2000 1.1000 1.0000 1.3000 >> plot(x,y,'b:',xi,yi,'g+') 拉格朗日插值法的优点是表达式简单明确,形式对称,它的缺点是如果要想增加插值节点,整个公式必须都发生改变,且容易发生龙格现象。牛顿插值法却很好的改善了这一点,从而变得更加灵活方便。此外两者的拟合程度也很相似。 分段插值的缺点是不能保证曲线在连接点处的光滑性。分段插值可以步进地插值计算,同时也带来了内在的高度稳定性和较好的收敛性。与前两种相比还具有良好的拟合性。 总结:我们组只编写了前三种插值方法,对于三次样条插值参数太多,故没能编写出其程序,但通过matlab 中的interp1函数可以实现。在此次作业我们也学到了很多知识,感到很充实。补充三次样条插值图形如下:

相关文档
最新文档