分段三次Hermite插值及其与三次样条的比较

分段三次 Hermite 插值多项式 (PCHIP)

语法

p = pchip(x,y,xq)
pp = pchip(x,y)
 

说明

p = pchip(x,y,xq) 返回与 xq 中的查询点对应的插值 p 的向量。p 的值由 x 和 y 的保形分段三次插值确定。

pp = pchip(x,y) 返回一个分段多项式结构体以用于 ppval 和样条实用工具 unmkpp

例1

使用 spline 和 pchip 插入数据

将 spline 和 pchip 为两个不同函数生成的插值结果进行比较。

创建由 x 值、点 y 处的函数值以及查询点 xq 组成的向量。使用 spline和 pchip 计算查询点处的插值。绘制查询点处的插值函数值以进行比较。

clc;clear;
x = -3:3; %插值点x坐标
y = [-1 -1 -1 0 1 1 1]; %插值点y坐标
xq1 = -3:.01:3; %查询点
p = pchip(x,y,xq1); %返回查询点的y坐标
s = spline(x,y,xq1); %返回查询点的y坐标
plot(x,y,'o',xq1,p,'-',xq1,s,'-.')
legend('Sample Points','pchip','spline','Location','SouthEast')

注:蓝色圆圈是被插值样本点。

可以看到:样条曲线(其实也是分段多项式)在两边有轻微震荡现象,但更加光滑,因为它要求在插值点处插值函数连续,

插值函数一阶导连续,插值函数二阶导连续,而三次分段Hermite插值函数则比价稳定,但不如样条标线的那样光滑,因为

它只要求在插值点处插值函数连续,插值函数的一阶导连续。

例2

x = -5:5;
y = [1 1 1 1 0 0 1 2 2 2 2];
p = pchip(x,y);
xq = -5:0.2:5;
pp = ppval(p,xq); %返回插值函数的查询点处的y坐标
plot(x,y,'o',xq,pp,'-.')
ylim([-0.2 2.2])

例3

x = -5:5;
y = [1 1 1 1 0 0 1 2 2 2 2];
p = pchip(x,y);
s = spline(x,y);
xq = -5:0.1:5;
pp = ppval(p,xq); %返回插值函数的查询点处的y坐标
ss = ppval(s,xq); %返回插值函数的查询点处的y坐标
figure(1);hold on;plot(x,y,'o',xq,pp,'-.',xq,ss,'b-')
ylim([-0.2 2.2])
figure(1);hold on ;legend('Sample Points','分段三次Hermite','分段三次样条','Location','SouthEast')


PCHIP是分段三次hermit插值,但书中的该方法必须知道点的值和导数值,为什么PCHIP的变量只有函数值而没有导数值?

在用pchip插值的过程中,matlab会基于所给的函数值来帮你估算各导数值。估算的原则是保证导数值能够正确的反映散点图的形状和变化趋势。比如在散点图是单调递增的区间内,相应点的导数值就会是正的;在散点图表现出存在局部极值点的区间,相应的导数也会产生正负的变化。
在matlab的帮助里可以找到详细的解释,但要了解算法的细节,就要看pchip的函数文件了。

来源:https://zhidao.baidu.com/question/573024605.html

原文地址:https://www.cnblogs.com/yibeimingyue/p/11174069.html