当前位置:文档之家› 《数值分析》教案5

《数值分析》教案5

1.6.4 分段三次Hermite 插值为了利用多项式插值方法而又克服高次插值多项式的缺陷,便引入了分段插值的概念。

它的基本思想是把函数整个区间上分成许多段,每段都选用适当的低次插值多项式代替函数,整体上按一定的要求连接起来,构成一个分段的插值函数。

为此,把函数)(x f 的自变量x 在区间],[b a 上用)1(+n 个节点分割成n 段:b x x x x x a n n =<<<<<=-1210根据这些节点的取值i x ,)(x f 在节点上的函数值i i y x f =)(和导数值i i m x f =')(),,2,1,0(n i =,可以构造一个分段三次插值函数)(x H ,它满足下述条件:①i i y x H =)(,i i y x H '=')(),,2,1,0(n i =。

② 在每个小区间],[1+i i x x ),,2,1,0(n i =上,都是一个三次多项式:332210)(xa x a x a a x H i i i i i +++=把这样构成的分段三次函数)(x H 称为分段三次Hermite 插值函数,它的各小段均为三次多项式,而整体上具有一阶连续导数。

由式(1-34)可直接写出分段三次Hermite 插值函数的分段表达式1211211121112111)()(2121)(++++++++++++'⎪⎪⎭⎫⎝⎛---+'⎪⎪⎭⎫ ⎝⎛---+⎪⎪⎭⎫⎝⎛--⎪⎪⎭⎫ ⎝⎛--++⎪⎪⎭⎫ ⎝⎛--⎪⎪⎭⎫ ⎝⎛--+=i i i ii i i i i i i i i ii i i i i i i i i iy xx x x x x y x x x x x x y xx x x x x x x y x x x x xx x x x H也可通过构造基函数给出分段三次Hermite 插值函数的表达式。

参照分段线性插值与Hermite 插值基函数公式(1-31)和式(1-32),可得出分段三次Hermite 插值的基函数为⎪⎩⎪⎨⎧∈∈⎪⎪⎭⎫⎝⎛--⎪⎪⎭⎫ ⎝⎛--+=],[0],[21)(11021010100n x x x x x x x x x x x x x x x h)1,,1(],(),[0],(21],[21)(1101211112111-=⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧∈∈⎪⎪⎭⎫ ⎝⎛--⎪⎪⎭⎫ ⎝⎛--+∈⎪⎪⎭⎫ ⎝⎛--⎪⎪⎭⎫ ⎝⎛--+=+-++++----n i x x x x x x x x x x x x x x x x x x x x x x x x x x x x h n i i i i i i i i i i i i i i i i i i i (1-38)⎪⎩⎪⎨⎧∈∈⎪⎪⎭⎫ ⎝⎛--⎪⎪⎭⎫ ⎝⎛--+=-----],[0],[21)(1012111n n n n nn n n n n x x x x x x x x x x x x x x x h⎪⎩⎪⎨⎧∈∈⎪⎪⎭⎫⎝⎛---=],[0],[)()(110210100n x x x x x x x x x x x x x H)1,,1(],(),[0],[)(],[)()(11012111211-=⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧∈∈⎪⎪⎭⎫ ⎝⎛---∈⎪⎪⎭⎫ ⎝⎛---=+-+++---n i x x x x x x x x x x x x x x x x x x x x x x x x H n i i i i i i i i i i i i i i i (1-39)⎪⎩⎪⎨⎧∈∈⎪⎪⎭⎫⎝⎛---=----],[0],[)()(101211n n n n nn n n x x x x x x x x x x x x x H分段三次Hermite 插值函数为])()([)(0∑='+=ni i i i i x H y x h y x H (1-40)由余项公式(1-37)可以导出,分段三次Hermite 插值的误差有如下估计)(max 384)()()()4(4x f h x H x f x R b x a ≤≤≤-= (1-41)其中)(max 110i i n i x x h -=+-≤≤。

分段三次Hermite 插值函数是插值区间上的光滑函数,它与函数)(x f 在节点处密合程度较好。

1.6.5 分段三次Hermite 插值的MATLAB 实现【例1-18】给定函数55,11)(2≤≤-+=x xx f ,取插值节点k x k +-=5,10,,1,0 =k ,用分段Hermite 插值计算)(x ϕ,并画出)(x ϕ与)(x f 的图形。

解:在编辑窗口输入以下命令: a=-5;b=5;n=10;h=(b-a)/n x=a:h:b;y=1./(1+x.^2); xx=a:0.01:b;yy=1./(1+xx.^2); m=length(xx);z=zeros(1,m);for i=1:mz(i)=Hermite_wise(x,y,[],xx(i)); endplot(x,y,'bo',xx,yy,'r-',xx,z,'-','linewidth',2);grid 命令执行后得到如图1-10所示图形:分段三次Hermite 插值函数是插值区间上的光滑函数,它与函数)(x f 在节点处密合程度较好。

图1-10 分段Hermite 插值图形上例中分段三次Hermite 调用函数如下。

function yi=Hermite_wise(x,y,ydot,xi) % Hermite 分段三次插值的MATLAB 实现 % 分段Hermite 插值公式,其中 % x 为向量,全部的插值节点; % y 为向量,插值节点处的函数值; % ydot 为向量,插值节点处的导数值, % 如果此处值缺省,则用均差代替导数, % 端点用向前、向后均差,中间点用中心均差; % xi 为标量,自变量x ; % yi 为xi 处的函数估计值;% 如果没有给出y的导数值,则用均差代替导数。

if isempty(ydot)==1ydot=gradient(y,x);endn=length(x);m1=length(y);m2=length(ydot);% 输入x,y和y的导数的个数必须相同.if n~=m1|n~=m2|m1~=m2error('The length of X,Y and Ydot must be equal!');return;endfor k=1:n-1% 插值节点必须互异if abs(x(k)-x(k+1))<epserror('The DATA is error!');return;endif x(k)<=xi&xi<=x(k+1)yi=y(k)*(1-2*(xi-x(k))/(x(k)-x(k+1)))...*(xi-x(k+1))^2/(x(k)-x(k+1))^2+...y(k+1)*(1-2*(xi-x(k+1))/(x(k+1)-x(k)))...*(xi-x(k))^2/(x(k+1)-x(k))^2+...ydot(k)*(xi-x(k))*(xi-x(k+1))^2/(x(k)-x(k+1))^2+... ydot(k+1)*(xi-x(k+1))*(xi-x(k))^2/(x(k+1)-x(k))^2;return;endend1.7 有关插值的MATLAB 命令1.7.1 三次插值和三次样条插值的MATLAB 命令对于三次插值(Hermite 插值)和三次样条插值,MATLAB 中都设有专有命令。

三次插值命令调用格式为:)x y,pchip(x,y k k =三次样条插值命令调用格式为:)x y,spline(x,y k k =参数k k y x y x ,,,的意义及要求与interp1中的完全一样,插值效果与interp1中参数"method"分别选用'pchip'和'spline'等价。

它允许k x 在区间max(x)][min(x),外的附近取近似值,因为程序设计中在两个端点处,都使用了由内部外推的方法。

【例1-19】已知)(x f y =的函数关系中,当x=[-6.2 -5 -3 -1.7 0 1 3 5 6.2 7.5 8.2]时,y=[1 0 -1 0 1 0 -1 0 0.5 -1 0 ]。

用“线性插值”、“最近插值”分别求出当xi=-6.2:0.2:8.2时所对应的函数值,并画出曲线图。

解:在编辑窗口输入:x=[-6.2 -5 -3 -1.7 0 1 3 5 6.2 7.5 8.2]; y=[1 0 -1 0 1 0 -1 0 0.5 -1 0 ]; xi=-6.2:0.2:8.2;y1=interp1(x,y,xi,'linear'); y2=interp1(x,y,xi,'nearest');plot(x,y,'ro',xi,y1,xi,y2,'-', 'linewidth',2); legend('数据节点','线性插值','最近插值'); 执行命令后得到如图1-11所示图形。

图1-11 线性插值与最近插值比较图【例1-20】已知)(x f y 的函数关系中,当x=[0 2 3 4 5 6]时,y=[-4 1 -2 -4 -4 -5 ]。

用“分段三次插值”和“三次样条插值”分别求出当xi=-0.3:0.3:6.8时所对应的函数值,并画出曲线。

解:在编辑窗口输入: x=[0 2 3 4 5 6]; y=[-4 1 -2 -4 -4 -5 ]; xi=-0.3:0.3:6.8;y1=interp1(x,y,xi,'pchip') y2=interp1(x,y,xi,'spline')plot(x,y,'ro',xi,y1,'r',xi,y2,'-','linewidth',2); legend('样本点','分段三次插值','三次样条插值');grid;图1-12 三次插值与三次样条插值比较图执行命令得到如图1-12所示的结果。

从图形上看,用三次样条插值时曲线的光滑度要好一些。

相关主题