实验一插值方法实验.docx
《实验一插值方法实验.docx》由会员分享,可在线阅读,更多相关《实验一插值方法实验.docx(12页珍藏版)》请在冰豆网上搜索。
实验一插值方法实验
实验一-插值方法实验
《计算方法》
实验报告
学院:
信息学院
专业:
计算机科学与技术
指导教师:
班级学号:
姓名:
计算机科学与工程系
实验一插值方法
一.实验目的
(1)熟悉数值插值方法的基本思想,解决某些实际插值问题,加深对数值插值方法的理解。
(2)熟悉Matlab编程环境,利用Matlab实现具体的插值算法,并进行可视化显示。
二.实验要求
用Matlab软件实现Lagrange插值、分段线性插值、三次Hermite插值、Aitken逐步插值算法,并用实例在计算机上计算和作图。
三.实验内容
1.实验题目
i
0
1
2
3
x
0.46
047
0.48
0.49
y
0.4846555
0.4937452
0.5027498
0.5116683
(1)已知概率积分
的数据表
构造适合该数据表的一次、二次和三次Lagrange插值公式,输出公式及其图形,并计算x=0.472时的积分值。
(2)将区间[-5,5]分为10等份,求作
的分段线性插值函数,输出函数表达式及其图形,并计算x=3.3152时的函数值。
(3)仿照附录C中“文件1.2逐步插值”程序(Neville算法,课本227页)编写相应的Aitken逐步插值算法的程序,根据下表所给数据分别利用上述两种算法求正弦积分
在x=0.462的值,并比较它们的结果。
x
0.3
0.4
0.5
0.6
0.7
先将前两个插值点插值生成新的数据,然后与第三个插值点进行新的两点插值,不断重复这个插值过程,每一步增加一个新的节点,直到遍历所有节点为止,最终获得与原函数更加接近的插值函数。
(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;
fori=1:
m
N(i)=1;
forj=1:
m
ifj~=i
N(i)=N(i)*(x0-X(j))/(X(i)-X(j));
end
end
y0=y0+Y(i)*N(i);
end
(2)分段插值
symsfx;
f=1/(1+x^2);
N=input('请输入插值节点数N=');
X=-5:
10/N:
5;
Y=zeros(1,length(X));
fori=1:
(N+1)
x=X(i);
Y(i)=eval(f);
end
M=-5:
0.01:
5;
y=zeros(1,length(M));
n=1;
fori=1:
N
forx=-5:
0.01:
5
ifx=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])
holdon
x=-5:
0.01:
5;
plot(x,y,'r');
(3)Neville逐步插值
functiony0=Neville_eval(X,Y,x0)
%X,Y是已知的插值点的坐标
%x0是插值点
%y0是多项式在x0处的值
m=length(X);
P=zeros(m,1);
P1=zeros(m,1);
P=Y;
fori=1:
m
P1=P;
k=1;
forj=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
ifabs(P(m)-P(m-1))<10^-6;
y0=P(m);
return;
end
end
y0=P(m);
Atiken逐步插值
functiony0=Aitken_eval(X,Y,x0)
%X,Y是已知的插值点的坐标
%x0是插值点
%y0是多项式在x0处的值
m=length(X);
P=zeros(m,1);
P1=zeros(m,1);
P=Y;
fori=1:
m
P1=P;
k=1;
forj=i+1:
m
k=k+1;
P(j)=P1(j-1)+(P1(j)-P1
(1))*(x0-X(k-1))/(X(j)-X
(1));
end
ifabs(P(m)-P(m-1))<10^-6;
y0=P(m);
return;
end
end
y0=P(m);
(4)Hermite插值
functiony0=Hermite_interp(X,Y,DY,x0)
%X,Y是已知插值点向量序列
%DY是插值点处的导数值
%x0是插值点横坐标
%y0是待求的分段三次Hemite插值多项式在x0处的值
%N表示向量长度
N=length(X);
fori=1:
N
ifx0>=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=
.0834********
作图:
(原函数:
蓝色,插值函数:
红色)
>>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插值的综合与推广,,为了保证插值函数能更好地密合原来的函数,要求“过点”,即两者在节点上有相同的函数值,而且要求“相切”,即在节点上还具有相同的导数值。
这就保证了有较高的精度。