数值分析第二次程序题.docx

上传人:b****7 文档编号:23938069 上传时间:2023-05-22 格式:DOCX 页数:18 大小:102.84KB
下载 相关 举报
数值分析第二次程序题.docx_第1页
第1页 / 共18页
数值分析第二次程序题.docx_第2页
第2页 / 共18页
数值分析第二次程序题.docx_第3页
第3页 / 共18页
数值分析第二次程序题.docx_第4页
第4页 / 共18页
数值分析第二次程序题.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数值分析第二次程序题.docx

《数值分析第二次程序题.docx》由会员分享,可在线阅读,更多相关《数值分析第二次程序题.docx(18页珍藏版)》请在冰豆网上搜索。

数值分析第二次程序题.docx

数值分析第二次程序题

数值分析第二次程序题——插值法

1.对Runge函数

在区间[-1,1]作下列插值逼近,并和R(x)的图像进行比较,并对结果进行分析。

(1)以

为节点,Newton插值

图1[-0.7,0.7]上的Newton插值图2[-1,1]上的Newton插值

由上图可以看出,在区间[-0.7,0.7]上,插值多项式可以比较好地逼近被插值函数。

而当区间改为[-1,1]时,边界附近插值多项式与被插值函数的差别很大。

即出现了Runge现象。

由于边界接近60的误差,图像中间部分的变化几乎不可见。

主要原因是被插值函数的任意阶导数不能达到一致有界。

其插值余项

不趋近零。

插值多项式不能收敛到被插值函数。

牛顿差值函数

functionf=niudun(z,N,n)

f=N(1,1);

x=-1:

0.1:

1;

fork=2:

n

a=1;

forr=1:

(k-1)

a=a*(z-x(r));

end

f=f+N(k,k)*a;

end

主程序

x=-1:

0.1:

1;

n=length(x);

fori=1:

n

y(i)=1/(1+25*x(i)*x(i));

end

N=zeros(n,n);

N(:

1)=y';

forj=2:

n

fork=j:

n

N(k,j)=(N(k,j-1)-N(k-1,j-1))/(x(k)-x(k-j+1));

end

end

fort=1:

n

c(t)=N(t,t);

end

z=-1:

0.001:

1;

m=size(z,2);

fori=1:

m

Runge(i)=1/(1+25*z(i)*z(i));

f(i)=niudun(z(i),N,n);

end

plot(z,Runge,'k',z,f,'r')

 

(2)以

为节点,Lagrange插值

图3以Chebyshev多项式零点为插值点图4以等距节点为插值点

如图所示,使用Chebyshev多项式零点构造的Lagrange插值多项式比较接近原函数,没有出现Runge现象,图4为第一小问中的等距节点插值,可以明显的看出以Chebyshev多项式零点为插值点的优势。

主要原因是其多项式误差为

,在区间内一致收敛。

 

Lagrange函数

functionlag=lagrange(z,x,y)

fori=1:

21

l(i)=1;

forj=1:

21

ifj~=i

l(i)=l(i)*(z-x(j))/(x(i)-x(j));

end

end

end

l=l';

lag=y*l;

 

主程序

fori=1:

21

x(22-i)=cos((2*i-1)*pi/42);

end

fori=1:

21

y(i)=1/(1+25*x(i)*x(i));

end

z=-1:

0.001:

1;

m=length(z);

fori=1:

m

f(i)=1/(1+25*z(i)*z(i));

lag(i)=lagrange(z(i),x,y);

end

plot(z,f,'k',z,lag,'r')

(3)以

为节点,分段线性插值

如下图所示,分段线性插值多项式比较接近原函数,没有出现Runge现象。

但是可以明显地看到在区间[-0.1,0.1]中,线性插值的拟合度较低,因为这一部分的函数的曲率较大,也就是二阶导数较大。

由误差估计公式

可知这一部分的误差较大。

图5线性插值

(4)以

为节点,三次自然样条插值

图6三次自然样条插值函数图像

由上图可以看出,三次样条插值函数的曲线及其光滑,图中并没有将插值函数连起来,否则基本无法分辨出原函数和插值函数的图像,说明得到的函数十分接近被插值函数。

另外,题目要求自然样条插值,也就是再两端的二阶导数为0,需在变成过程中加以注意。

x=-1:

0.1:

1;

n=length(x);

fori=1:

n

y(i)=1/(1+25*x(i)*x(i));

end

fori=1:

n-1

h(i)=x(i+1)-x(i);

end

fori=1:

n-2

u(i)=h(i)/(h(i+1)+h(i));

r(i)=1-u(i);

end

G=zeros(n-2,n-2);

fori=1:

n-2

G(i,i)=2;

end

fori=2:

n-2

G(i,i-1)=u(i-1);

G(i,i+1)=r(i-1);

end

d=zeros(1,n-2);

fori=1:

n-2

d(i)=6*((y(i+2)-y(i+1))/h(i+1)-(y(i+1)-y(i))/h(i))/(h(i+1)+h(i));

end

d=d';

M=G\d;

M=[0;M;0];

fori=1:

n-1

z=[x(i):

0.01:

x(i+1)];

m=length(z);

forj=1:

m

s(j)=M(i)*(x(i+1)-z(j))^3/0.6+M(i+1)*(z(j)-x(i))^3/0.6+(y(i)-M(i)*0.01/6)*(x(i+1)-z(j))/0.1+(y(i+1)-M(i+1)*0.01/6)*(z(j)-x(i))/0.1;

end

plot(z,s,'*r','MarkerSize',3)

holdon

end

holdon

z=-1:

0.01:

1;

fori=1:

201

f(i)=1/(1+25*z(i)*z(i));

end

plot(z,f,'b')

 

2.对函数:

在区间[-1,1]作下列插值逼近,并和被插值函数的图像进行比较,并对结果进行分析。

(1)以

为节点,Newton插值

首先对函数进行简要分析,函数f(x)是分段函数,并且在x=0处不连续,对于插值计算,只需要函数值,所以除了函数作图和计算函数值有所不同以外,程序的主体部分没有明显改动,所以将本题程序统一放在最后。

本小题中

图7[-1,1]上的Newton插值图8[-0.7,0.7]上的Newton插值

由上图可以看出,在区间[-0.7,0.7]上,插值多项式可以已经无法较好地逼近被插值函数了,而当区间改为[-1,1]时,边界附近插值多项式与被插值函数的差别迅速扩大。

即出现了Runge现象。

由于边界接近1000的误差,图像中间部分的变化几乎不可见。

相比于第一题Runge现象更为明显。

主要原因是被插值函数不连续,导致其插值余项

可能无穷大。

插值多项式不能收敛到被插值函数。

(2)以

为节点,Lagrange插值

图9以Chebyshev多项式零点为插值点

如图所示,使用Chebyshev多项式零点构造的Lagrange插值多项式比较接近原函数,没有出现Runge现象,并且可以看出,在不连续点位置插值效果一般,但是在函数两端的拟合效果明显要好,说明使用Chebyshev多项式零点构造的Lagrange插值多项式在连续函数上的应用效果更佳。

(3)以

为节点,分段线性插值

图1021个插值点线性插值图11201个插值点线性插值

如下图所示,分段线性插值多项式比较接近原函数,没有出现Runge现象。

此例中我们看到了线性插值的强大优势,当原函数较为光滑,曲率较小,即使是分段函数对线性插值的影响也极为有限,当插值点个数扩大10倍达到201个时,可以明显的看出线性插值的优势所在。

(4)以

为节点,三次自然样条插值

图12三次自然样条插值函数图像

由上图可以看出,三次样条插值函数的曲线及其光滑,但是与其他多项式拟合一样在不连续点处存在较大的误差,但是与第一二小问中的Lagrange插值多项式相比,三次样条插值可以更快的脱离不连续点的影响,并在其他位置上表现出很好的拟合效果。

 

综合以上2题我们可以初步得出这样的结论:

当函数连续光滑,使用Chebyshev多项式零点构造的Lagrange插值多项式可以有效地避免Runge现象,但三次样条插值函数的曲线更为优秀。

但是当函数出现不连续点时,分段线性插值的优势明显,可以在不连续段处达到很好的拟合效果,并且可以迅速脱离不连续点的影响,所以在做函数插值时在斜率很大的部分可以考虑使用分段线性插值,其他部分采用三次样条效果最好。

 

牛顿插值

x=-1:

0.1:

1;

n=length(x);

fori=1:

10

y(i)=sin(pi*x(i));

end

fori=11:

15

y(i)=cos(pi*x(i));

end

fori=15:

n

y(i)=0;

end

N=zeros(n,n);

N(:

1)=y';

forj=2:

n

fork=j:

n

N(k,j)=(N(k,j-1)-N(k-1,j-1))/(x(k)-x(k-j+1));

end

end

fort=1:

n

c(t)=N(t,t);

end

z=-0.1:

0.01:

0.1;

m=length(z);

fori=1:

m

nd(i)=niudun(z(i),N,n);

end

v=linspace(-1,0,100);

u=sin(pi*v);

plot(v,u,'k')

holdon

v=linspace(0,0.5,50);

u=cos(pi*v);

plot(v,u,'k')

holdon

v=linspace(0.5,1,50);

u=0;

plot(v,u,'k')

holdon

plot(z,nd,'r')

 

以Chebyshev多项式零点为插值点

fori=1:

21

x(22-i)=cos((2*i-1)*pi/42);

end

fori=1:

21

ifx(i)<0

y(i)=sin(pi*x(i));

elseifx(i)>0.5

y(i)=0;

else

y(i)=cos(pi*x(i));

end

end

z=-1:

0.001:

1;

m=length(z);

fori=1:

m

lag(i)=lagrange(z(i),x,y);

end

v=linspace(-1,0,100);

u=sin(pi*v);

plot(v,u,'k')

holdon

v=linspace(0,0.5,50);

u=cos(pi*v);

plot(v,u,'k')

holdon

v=linspace(0.5,1,50);

u=0;

plot(v,u,'k')

holdon

plot(z,lag,'r')

 

线性插值

x=-1:

0.01:

1;

fori=1:

201

ifx(i)<0

y(i)=sin(pi*x(i));

elseifx(i)>0.5

y(i)=0;

else

y(i)=cos(pi*x(i));

end

end

z=-1:

0.001:

1;

n=length(z);

m=floor((z+1)/0.01)+1;

fori=1:

n-1

l(i)=y(m(i))+(y(m(i)+1)-y(m(i)))/(x(m(i)+1)-x(m(i)))*(z(i)-x(m(i)));

end

l(2001)=y(201);

f(2001)=y(201);

v=linspace(-1,0,100);

u=sin(pi*v);

plot(v,u,'k')

holdon

v=linspace(0,0.5,50);

u=cos(pi*v);

plot(v,u,'k')

holdon

v=linspace(0.5,1,50);

u=0;

plot(v,u,'k')

holdon

plot(z,l,'r')

 

三次样条插值

x=-1:

0.1:

1;

n=length(x);

fori=1:

21

ifx(i)<0

y(i)=sin(pi*x(i));

elseifx(i)>0.5

y(i)=0;

else

y(i)=cos(pi*x(i));

end

end

fori=1:

n-1

h(i)=x(i+1)-x(i);

end

fori=1:

n-2

u(i)=h(i)/(h(i+1)+h(i));

r(i)=1-u(i);

end

G=zeros(n-2,n-2);

fori=1:

n-2

G(i,i)=2;

end

fori=2:

n-2

G(i,i-1)=u(i-1);

G(i,i+1)=r(i-1);

end

d=zeros(1,n-2);

fori=1:

n-2

d(i)=6*((y(i+2)-y(i+1))/h(i+1)-(y(i+1)-y(i))/h(i))/(h(i+1)+h(i));

end

d=d';

M=G\d;

M=[0;M;0];

fori=1:

n-1

z=[x(i):

0.01:

x(i+1)];

m=length(z);

forj=1:

m

s(j)=M(i)*(x(i+1)-z(j))^3/0.6+M(i+1)*(z(j)-x(i))^3/0.6+(y(i)-M(i)*0.01/6)*(x(i+1)-z(j))/0.1+(y(i+1)-M(i+1)*0.01/6)*(z(j)-x(i))/0.1;

end

plot(z,s,'*r','MarkerSize',3)

holdon

end

v=linspace(-1,0,100);

u=sin(pi*v);

plot(v,u,'k')

holdon

v=linspace(0,0.5,50);

u=cos(pi*v);

plot(v,u,'k')

holdon

v=linspace(0.5,1,50);

u=0;

plot(v,u,'k')

holdon

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1