《计算方法》
实验报告
学 院: 信息学院
专 业: 计算机科学与技术
指导教师:
班级学号:
姓 名:
计算机科学与工程系
实验一 插值方法
一. 实验目的
(1)熟悉数值插值方法的基本思想,解决某些实际插值问题,加深对数值插值方法
的理解。
(2)熟悉Matlab编程环境,利用Matlab实现具体的插值算法,并进行可视化显示。
二. 实验要求
用Matlab软件实现Lagrange插值、分段线性插值、三次Hermite插值、Aitken逐步插值算法,并用实例在计算机上计算和作图。
三. 实验内容
1. 实验题目
(1)已知概率积分y
i x y 20e0 xx2dx的数据表
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的分段线性插值函数,输出函数1x2表达式及其图形,并计算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 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插值的综合与推广,,为了保证插值函数能更好地密合原来的函数,要求“过点”,即两者在节点上有相同的函数值,而且要求“相切”,即在节点上还具有相同的导数值。这就保证了有较高的精度。 因篇幅问题不能全部显示,请点此查看更多更全内容