第六章 计算方法简介
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
94 第六章 计算方法简介
§1 数值逼近
1.1
插值
许多实际问题都要用函数)(x f y =来表示某种内在规律的数量关系,其中相当一部分函数虽然可能在某个区间上具有很好的性质(连续、光滑等),但没有函数的表达式信息,我们只能通过实验或者观测得到函数在一些点i x 上的函数值
)(i i x f y =),2,1,0(n i =,这是一张函数表.有些函数虽然有解析式,但由于计算
复杂,使用不方便,我们通常也造一个函数表,例如三角函数表、平方根表等.
为了研究函数的性质,往往还需要求出不在函数表上的函数值,因此我们希望根据给定的函数表构造一个既能反映函数)(x f y =的性质、又便于计算的简单函数
)(x P ,用)(x P 来近似)(x f .这就是插值所要研究的问题.
)(x P 称为)(x f 的插值函数.常用的插值函数是代数多项式或分段代数多项式.
1.1 Lagrange 插值 1.1.1 方法介绍
Lagrange 插值方法即,给定n 个插值节点以及对应的函数值信息,
)(i i x f y =),2,1,0(n i =,利用n 次Lagrange 插值多项式公式,则对插值区间内
任意x 的函数值y 可通过下式近似求得:
)()(1
1
∏
∑≠==--=n
k
j j j
k j n k k x x x x y x y .
其中
∏≠=--n
k
j j j
k
j
x x
x x 1称为插值基函数.可见,在Lagrange 插值中,对应1+n 个节点的
插值基函数一共有1+n 个,每个基函数是一个n 次多项式. 1.1.2 MATLAB 实现 Lagrange.m
% y=lagrange(x0,y0,x),表示对x0,y0的节点信息使用Lagrange插值所得的多项式在x点的取值.
function y=lagrange(x0,y0,x)
n=length(x0);m=length(x);
for i=1:m
z=x(i);
s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
>> x=[0.4:0.1:0.8];
>> clear
>> x=[0.4:0.1:0.8];
>> y=[-0.9 -0.6 -0.5 -0.35 -0.22];
>> lagrange(x,y,0.54)
ans =
-0.5572
1.2分段低次插值
1.2.1 方法介绍
95
96 利用给出的节点信息使用多项式插值,一般认为插值多项式的次数越高,对原
函数的近似越好,但事实并非如此.19世纪Runge给出了一个反例,说明了插值多项式次数高并不意味着近似程度好.
为了避免误差大的缺点,通常采用分段低次插值的做法.所谓分段低次插值,就是先把插值区间分成若干段,在每一段上进行低次多项式插值.
1.2.2 MATLAB实现
MATLAB自身提供了用于插值的内部函数interp1.该命令的使用方法为y=interp1(x,y,xi,’method’),其中(x,y)是已知的一组节点信息,xi表示插值函数在xi点取值,method表示所使用的插值方法,可选的方法有:
● nearest 线性最近项插值;
● linear 线性插值;
● spline 三次样条插值;
● cubic 三次插值.
例:正弦函数的插值.
>> x=[0:0.1:10];
>> y=sin(x);
>> xi=0:.25:10;
>> yi=interp1(x,y,xi);
>> plot(x,y,'o',xi,yi)
97
1.3 Hermite 插值 1.3.1 方法介绍
不少实际问题中不但要求在节点上函数值相等,还要求导数值也相等,甚至要求高阶导数值也相等,满足这一要求的插值多项式是Hermite 插值多项式.以下只给出函数值与一阶导数值个数相等且已知的情形.
已知n 个插值节点n x x x ,,,21 及其对应的函数值n y y y ,,,21 和一阶导数值
'
'2'1,,,n
y y y .则计算插值区域内任意x 的函数值y 的Hermite 插值公式为 ∑=+--=n
i i i i i i i y y y a x x h x y 1
'])2)([()(,
其中
∑
≠=≠=-=--=n
j
i i j
i i n
i
j j j
i j i x x a x x x x h 12
1
1
,)(
.
1.3.2 MATLAB 实现 hermite.m
% 使用方法 y=hermite(x0,y0,y1,x),其中x0表示已知节点,
% y0表示已知节点上的函数值信息,y1表示已知节点上的函数导数值信息, % x 表示插值多项式在x 上取值. function y=hermite(x0,y0,y1,x) n=length(x0),m=length(x); for k=1:m yy=0.0; for i=1:n h=1.0; a=0.0; for j=1:n if j~=i