【数学建模算法】(26)插值和拟合:埃尔米特(Hermite)插值和样条插值 |
您所在的位置:网站首页 › 样条插值函数 › 【数学建模算法】(26)插值和拟合:埃尔米特(Hermite)插值和样条插值 |
1.埃尔米特(Hermite)插值
1.1.Hermite插值多项式
如果对插值函数,不仅要求它在节点处与函数同值,而且要求它与函数有相同的一阶、二阶甚至更高阶的导数值,这就是 Hermite 插值问题。本节主要讨论在节点处插值函数与函数的值及一阶导数值均相等的 Hermite 插值。 设已知函数 Hermite 插值多项式为:
Matlab 中没有现成的 Hermite 插值函数,必须编写一个 M 文件实现插值。
设 许多工程技术中提出的计算问题对插值函数的光滑性有较高要求,如飞机的机翼外形,内燃机的进、排气门的凸轮曲线,都要求曲线具有较高的光滑程度,不仅要连续,而且要有连续的曲率,这就导致了样条插值的产生。 2.1.样条函数的概念所谓样条(Spline)本来是工程设计中使用的一种绘图工具,它是富有弹性的细木条或细金属条。绘图员利用它把一些已知点连接成一条光滑曲线(称为样条曲线),并使连接点处有连续的曲率。 数学上将具有一定光滑性的分段多项式称为样条函数。具体地说,给定区间 二次样条函数:
对于 三次样条函数:
对于 利用样条函数进行插值,即取插值函数为样条函数,称为样条插值。例如分段线性插值是一次样条插值。下面我们介绍二次、三次样条插值。 2.2.二次样条函数插值首先,我们注意到 问题(1):
已知插值节点 问题(2):
已知插值节点 事实上,可以证明这两类插值问题都是唯一可解的。
对于问题(1)有:
引入记号 于是,问题转化为求方程组 由于 常用的三次样条函数的边界条件有 3 种类型:
(1) (2) (3) 在 Matlab 中数据点称之为断点。如果三次样条插值没有边界条件,最常用的方法,就是采用非扭结(not-a-knot)条件。这个条件强迫第 1 个和第 2 个三次多项式的三阶导数相等。对最后一个和倒数第 2 个三次多项式也做同样地处理。 Matlab 中三次样条插值也有现成的函数: y=interp1(x0,y0,x,'spline'); y=spline(x0,y0,x); pp=csape(x0,y0,conds),y=ppval(pp,x); 其中 x0,y0 是已知数据点,x 是插值点,y 是插值点的函数值。 对于三次样条插值,我们提倡使用函数 csape,csape 的返回值是 pp 形式,要求插值点的函数值,必须调用函数 ppval。 pp=csape(x0,y0):使用默认的边界条件,即 Lagrange 边界条件。 pp=csape(x0,y0,conds)中的 conds 指定插值的边界条件,其值可为: conds 作用 'complete' 边界为一阶导数,即默认的边界条件 'not-a-knot' 非扭结条件 'periodic' 周期条件 'second' 边界为二阶导数,二阶导数的值[0,0]对于一些特殊的边界条件,可以通过 conds 的一个 pp=csape(x0,y0_ext,conds) 其中 y0_ext=[left, y0, right],这里 left 表示左边界的取值,right 表示右边界的取值。
conds(i)=j 的含义是给定端点 例:机床加工
待加工零件的外形根据工艺要求由一组数据 利用Matlab编程,使用Lagrange,分段线性和三次样条三种插值方法计算。 clc,clear x0=[0 3 5 7 9 11 12 13 14 15]; y0=[0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6]; x=0:0.1:15; y1=lagrange(x0,y0,x); %调用前面编写的Lagrange插值函数 y2=interp1(x0,y0,x); y3=interp1(x0,y0,x,'spline'); pp1=csape(x0,y0); y4=ppval(pp1,x); pp2=csape(x0,y0,'second'); y5=ppval(pp2,x); fprintf('比较一下不同插值方法和边界条件的结果:\n') fprintf('x y1 y2 y3 y4 y5\n') xianshi=[x',y1',y2',y3',y4',y5']; fprintf('%f\t%f\t%f\t%f\t%f\t%f\n',xianshi') subplot(2,2,1), plot(x0,y0,'+',x,y1), title('Lagrange') subplot(2,2,2), plot(x0,y0,'+',x,y2), title('Piecewise linear') subplot(2,2,3), plot(x0,y0,'+',x,y3), title('Spline1') subplot(2,2,4), plot(x0,y0,'+',x,y4), title('Spline2') dyx0=ppval(fnder(pp1),x0(1)) %求x=0处的导数 ytemp=y3(131:151); index=find(ytemp==min(ytemp)); xymin=[x(130+index),ytemp(index)](Lagrange函数请参见我的简书文章【数学建模算法】(23)插值和拟合:拉格朗日插值) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |