实验一-插值方法实验

实验一-插值方法实验
实验一-插值方法实验

《计算方法》实验报告

学院:信息学院

专业:计算机科学与技术

指导教师:

班级学号:

姓名:

计算机科学与工程系

实验一 插值方法

一. 实验目的

(1)熟悉数值插值方法的基本思想,解决某些实际插值问题,加深对数值插值方法

的理解。

(2)熟悉Matlab 编程环境,利用Matlab 实现具体的插值算法,并进行可视化显示。

二. 实验要求

用Matlab 软件实现Lagrange 插值、分段线性插值、三次Hermite 插值、Aitken 逐步插值算法,并用实例在计算机上计算和作图。

三. 实验容

1. 实验题目

(1)已知概率积分dx e

y x x ?-=02

2

π

的数据表

构造适合该数据表的一次、二次和三次Lagrange 插值公式,输出公式及其图形,并计算x =0.472时的积分值。

(2)将区间[-5,5]分为10等份,求作2

11

)(x

x f +=

的分段线性插值函数,输出函数表达式及其图形,并计算x =3.3152时的函数值。

(3)仿照附录C 中“文件1.2 逐步插值”程序(Neville 算法,课本227页)编写相应的Aitken 逐步插值算法的程序,根据下表所给数据分别利用上述两种算法求正弦积分?

∞-=x

dt t

t

x f sin )(在x =0.462的值,并比较它们的结果。

(4)运行C 中“文件1.3 分段三次Hermite 插值”程序(课本228页),要求自行选择实验数据

2. 设计思想

(1)Lagrange 插值:

Lagrange 具有累加的嵌套结构,容易编制其计算程序。事实上,在逻辑上表现为二重循环,循

环(j循环)累乘求得系数,然后再通过外循环(i循环)累加得出插值结果y。

(2)分段线性插值:

分段插值是将被插值函数逐步多项式化。分段插值的处理过程分两步,将区间分成几个子段,并在每个子段上构造插值多项式装配在一起,作为整个区间的插值函数。在分化的每个节点给出数据,连接相邻节点得一折线,该折线函数可以视作插值问题的解。

(3)Neville插值:

Neville插值的基本思想和Aitken插值一样,不同的是Neville插值每次选取的两个插值节点都是上一步相邻节点插值后得到的,而不是新的插值节点,这样得到的插值函数和原函数更加接近。

Atiken逐步插值:

Aitken插值是对三步插值转化为两步插值的重复,先将前两个插值点插值生成新的数据,然后与第三个插值点进行新的两点插值,不断重复这个插值过程,每一步增加一个新的节点,直到遍历所有节点为止,最终获得与原函数更加接近的插值函数。

(4)Hermite插值:

Hermite插值是Lagrange插值的综合与推广,,为了保证插值函数能更好地密合原来的函数,要求“过点”,即两者在节点上有相同的函数值,而且要求“相切”,即在节点上还具有相同的导数值。

3. 对应程序

(1)Lagrange插值

function [y0,N]=Lagrange_eval(X,Y,x0)

%X,Y是已知的差值点坐标点

%x0是插值点

%y0是Lagrange多项式在x0处的值

%N是Lagrange插值函数的权系数

m=length(X);

N=zeros(m,1);

y0=0;

for i=1:m

N(i)=1;

for j=1:m

if j~=i

N(i)=N(i)*(x0-X(j))/(X(i)-X(j));

end

end

y0=y0+Y(i)*N(i);

end

(2)分段插值

syms f x;

f=1/(1+x^2);

N=input('请输入插值节点数N=');

X=-5:10/N:5;

Y=zeros(1,length(X));

for i=1:(N+1)

x=X(i);

Y(i)=eval(f);

end

M = -5:0.01:5;

y = zeros(1,length(M));

n=1;

for i=1:N

for x=-5:0.01:5

i f x=X(i)

y(n)=Y(i)*(x-X(i+1))/(X(i)-X(i+1))+Y(i+1)*(x-X(i))/(X(i+1)-X(i)); n=n+1;

end

e nd

end

ezplot(f,[-5,5])

hold on

x =-5:0.01:5;

plot(x,y,'r');

(3)Neville逐步插值

function y0=Neville_eval(X,Y,x0)

%X,Y是已知的插值点的坐标

%x0是插值点

%y0是多项式在x0处的值

m=length(X);

P=zeros(m,1);

P1=zeros(m,1);

P=Y;

for i=1:m

P1=P;

k=1;

for j=i+1:m

k=k+1;

P(j)=P1(j-1)+(P1(j)-P1(j-1))*(x0-X(k-1))/(X(j)-X(k-1));

end

if abs(P(m)-P(m-1))<10^-6;

y0=P(m);

return;

end

end

y0=P(m);

Atiken逐步插值

function y0=Aitken_eval(X,Y,x0)

%X,Y是已知的插值点的坐标

%x0是插值点

%y0是多项式在x0处的值

m=length(X);

P=zeros(m,1);

P1=zeros(m,1);

P=Y;

for i=1:m

P1=P;

k=1;

for j=i+1:m

k=k+1;

P(j)=P1(j-1)+(P1(j)-P1(1))*(x0-X(k-1))/(X(j)-X(1)); end

if abs(P(m)-P(m-1))<10^-6;

y0=P(m);

return;

end

end

y0=P(m);

(4)Hermite插值

function y0=Hermite_interp(X,Y,DY,x0)

% X,Y是已知插值点向量序列

% DY是插值点处的导数值

% x0是插值点横坐标

% y0是待求的分段三次Hemite插值多项式在x0处的值

% N表示向量长度

N=length(X);

for i=1:N

if x0>=X(i)&x0<=X(i+1)

k=i;

break;

end

end

a1=x0-X(k+1);

a2=x0-X(k);

a3=X(k)-X(k+1);

y0=(a1/a3)^2*(1-2*a2/a3)*Y(k)+(-a2/a3)^2*(1+2*a1/a3)*Y(k+1)+(a1/a3)^2*a2*DY(k)+(-a 2/a3)^2*a1*DY(k+1);

4. 实验结果

列出相应的运行结果。如果要求可视化,则同时需要给出相应的图形。

(1)Lagrange插值

一次Lagrange插值:

运行结果:

>> X=[0.46,0.47];

>> Y=[0.4846555,0.4937452];

>> x0=0.472;

>> [y0,N]=Lagrange_eval(X,Y,x0)

y0 =

0.49556314000000

N =

-0.20000000000000

1.20000000000000

插值系数与作图:

>> x1=0;

>> [y1,N]=Lagrange_eval(X,Y,x1);

>> x2=1;

>> [y2,N]=Lagrange_eval(X,Y,x2);

>> k=(y2-y1)/(x2-x1)

k =

0.90897000000001

>> x=[x1,x2];

>> y=[y1,y2];

>> plot(x,y)

二次Lagrange插值

差值结果:

>> X=[0.46,0.47,0.48];

>> Y=[0.4846555,0.4937452,0.5027498]; >> x0=0.472;

>> [y0,N]=Lagrange_eval(X,Y,x0)

y0 =

0.49555292800000

N =

-0.08000000000000

0.96000000000000

0.12000000000000

插值系数与作图:

>> x1=0;

>> [y1,N]=Lagrange_eval(X,Y,x1);

>> x2=1;

>> [y2,N]=Lagrange_eval(X,Y,x2);

>> k=(y2-y1)/(x2-x1)

k =

0.87918499999967

>> x=[x1,x2];

>> y=[y1,y2];

>> plot(x,y)

三次Lagrange插值

差值结果:

>> X=[0.46,0.47,0.48,0.49];

>> Y=[0.4846555,0.4937452,0.5027498,0.5116683];>> x0=0.472;

>> [y0,N]=Lagrange_1(X,Y,x0)

>> [y0,N]=Lagrange_eval(X,Y,x0)

y0 =

0.49555296000000

N =

-0.04800000000000

0.86400000000000

0.21600000000000

-0.03200000000000

插值系数与作图

>> x1=0;

>> [y1,N]=Lagrange_eval(X,Y,x1);

>> x2=1;

>> [y2,N]=Lagrange_eval(X,Y,x2);

>> k=(y2-y1)/(x2-x1)

k =

0.83708499999011

>> x=[x1,x2];

>> y=[y1,y2];

>> plot(x,y)

(2)分段差值

差值结果:

>> Y=interp1(x,y,3.3152,'spline')

Y =

0.08342312935731

作图:(原函数:蓝色,插值函数:红色)

>> fenduan_eval

请输入插值节点数N=6

(3)Neville逐步插值

>> X=[0.3,0.4,0.5,0.6,0.7];

>> Y=[0.29850,0.39646,0.49311,0.58813,0.68122];

>> x0=0.462;

>> y0=Neville_eval(X,Y,x0)

y0 =

0.45655811276280

Aitken逐步插值

>> X=[0.3,0.4,0.5,0.6,0.7];

>> Y=[0.29850,0.39646,0.49311,0.58813,0.68122];

>> x0=0.462;

>> y0=Aitken_eval(X,Y,x0)

y0 =

0.77480886915945

(4)分段三次Hermite插值

>> X=[0.3,0.4,0.5,0.6,0.7];

>> Y=log(X);

>> DY=1./X;

>> x0=0.462;

>> y0=Hermite_interp(X,Y,DY,x0)

y0 =

-0.7722

四.实验体会

通过本次课程设计,我初步掌握了MATLAB运用,了解了matlab的基本编程思想,学会了matlab的基本语法与常用操作命令,加深了对于Lagrange插值、分段线性插值、Neville逐步插值、Aitken逐步插值、Hermite插值的理解;培养了独立工作能力和创造力;更加精进了编程的能力;综合运用专业及基础知识,解决实际数学问题的能力;深入的了解和体会了计算方法—算法设计及其matlab实现的基本原理与学习思路;在本次课程设计中,在老师的精心指导下,收益匪浅。同时对数学的研究有了更深入的认识,并对以往所掌握的数学及编程知识有了回顾及更深入的探索。

对于各种插值方法的精度分析也有了清晰的认识,并对各种插值算法有了深刻的的理解;

Lagrange插值在高次插值时同原函数插值偏差大,拉格朗日插值模型简单,结构紧凑,是经典的插值法。但是由于拉格朗日的插值多项式和每个节点都有关,当改变节点个数时,需要重新计算。且当增大插值阶数时容易出现龙格现象。分段线性插值是将整个区间分成许多小段,运用低次插值,从而提高精度。分段线性插值算法简单,计算量小,但精度不高。Neville插值的基本思想和Aitken插值一样,不同的是Neville插值每次选取的两个插值节点都是上一步相邻节点插值后得到的,而不是新的插值节点,这样得到的插值函数和原函数更加接近。Aitken插值是对三步插值转化为两步插值的重复,先将前两个插值点插值生成新的数据,然后与第三个插值点进行新的两点插值,不断重复这个插值过程,每一步增加一个新的节点,直到遍历所有节点为止,最终获得与原函数更加接近的插值函数。Hermite插值是Lagrange插值的综合与推广,,为了保证插值函数能更好地密合原来的函数,要求“过点”,即两者在节点上有相同的函数值,而且要求“相切”,即在节点上还具有相同的导数值。这就保证了有较高的精度。

相关主题
相关文档
最新文档