将 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