您的当前位置:首页正文

实验一 插值方法实验

2023-12-08 来源:客趣旅游网


《计算方法》

实验报告

学 院: 信息学院

专 业: 计算机科学与技术

指导教师:

班级学号:

姓 名:

计算机科学与工程系

实验一 插值方法

一. 实验目的

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

的理解。

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

二. 实验要求

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

三. 实验内容

1. 实验题目

(1)已知概率积分y

i x y 20e0 xx2dx的数据表

1 047 2 0.48 3 0.49 0.46 0.4846555 0.4937452 0.5027498 0.5116683 构造适合该数据表的一次、二次和三次Lagrange插值公式,输出公式及其图形,并计算x=0.472时的积分值。

(2)将区间[-5,5]分为10等份,求作f(x)1的分段线性插值函数,输出函数1x2表达式及其图形,并计算x=3.3152时的函数值。

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

f(x)xsintdt在x=0.462的值,并比较它们的结果。 tx y 0.3 0.29850 0.4 0.39646 0.5 0.49311 0.6 0.58813 0.7 0.68122

(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 if 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 end 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)+(-a2/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插值的综合与推广,,为了保证插值函数能更好地密合原来的函数,要求“过点”,即两者在节点上有相同的函数值,而且要求“相切”,即在节点上还具有相同的导数值。这就保证了有较高的精度。

因篇幅问题不能全部显示,请点此查看更多更全内容