MATLAB里做插值,你是不是只会用spline?2026年了,PCHIP(保形分段三次Hermite插值)这个函数被严重低估了。它跟spline的核心区别就一句话:spline追求光滑,PCHIP追求保形。数据有尖峰、有平台、有单调区间,用spline一插就出震荡,用PCHIP就老老实实跟着数据走。这篇把PCHIP的原理和实操全部拆开。
PCHIP全称Piecewise Cubic Hermite Interpolating Polynomial,翻译过来就是保形分段三次Hermite插值。名字很长,但原理不复杂。
普通的三次插值在每个子区间上构造一个三次多项式,要求函数值和一阶导数都连续。听起来没问题对吧?但问题出在节点处的导数怎么选。选得不好,插值曲线就会在数据点之间"过冲"(overshoot),明明数据是单调递增的,插出来的曲线中间鼓个包,这在工程上是不能接受的。
PCHIP的核心就是一套选导数的规则,确保插值曲线不会产生过冲。具体来说:数据单调的区间,插值结果也单调;数据有局部极值的点,插值结果也保留极值。这就是"保形"(shape-preserving)的含义。
2026年的MATLAB里,pchip函数的输入很简单:pchip(x, y, xx),x是节点横坐标,y是节点纵坐标,xx是你要插值的点。输出就是xx处的插值结果。底层返回的是一个分段多项式结构(pp form),可以用ppval求值,也可以用unmkpp拆开看系数。

PCHIP跟spline最大的区别,就在于节点处的一阶导数(斜率)怎么算。
spline用的是让二阶导数连续的方法,结果曲线非常光滑,二阶导数处处连续。但代价是什么?数据如果不够光滑,spline就会在数据点之间产生振荡。你拿一组阶梯状的数据去跑spline,中间一定会出现波浪。
PCHIP不追求二阶导数连续,只保证一阶导数连续。它用的是Fritsch-Carlson算法(1980年提出的),核心逻辑是这样的:
先算每个区间的一阶差商del(k) = (y(k+1) - y(k)) / (x(k+1) - x(k))。这就是相邻两点连线的斜率。
然后看相邻两个差商del(k-1)和del(k)的符号。如果符号相同,说明数据在这个节点附近是单调的,那节点处的斜率就取这两个差商的加权平均。权重跟区间长度有关:区间短的权重大,区间长的权重小。公式是d(k) = (w1 * del(k-1) + w2 * del(k)) / (w1 + w2),其中w1 = h(k) + hs,w2 = hs + h(k+1),hs = h(k) + h(k+1)。
如果符号相反,或者其中一个为0,说明这个节点附近数据有极值,直接把斜率设为0。斜率为0意味着曲线在这里是平的,极值就保住了。
端点处的斜率用的是三点公式,不是中心差分。左端点:d(1) = ((2*h1 + h2) * del1 - h1 * del2) / (h1 + h2)。右端点类似。然后再做一次保形检查:如果算出来的斜率跟差商符号不一致,或者绝对值超过3倍差商,就强制修正。
这套规则保证了一件事:插值曲线永远不会在单调区间里出现极值,永远不会过冲。
光说原理没用,跑个例子你就明白了。
拿这组数据:x = -3:3,y = [-1 -1 -1 0 1 1 1]。这是一个典型的阶梯加斜坡的形状,左边平台-1,中间从-1升到1,右边平台1。
用spline插值,曲线在-1到0和0到1的过渡区会出现明显的过冲,峰值超过1,谷值低于-1。用PCHIP插值,曲线老老实实从-1升到1,中间不会超出数据范围,平台就是平台,斜坡就是斜坡。
2026年我做过一个实际项目,处理传感器采集的温度数据。数据有明显的平台段(恒温区间)和尖峰(启动瞬间)。用spline插出来的曲线在恒温段出现了0.3度的虚假波动,直接导致后续的控制算法误判。换成PCHIP,平台段完全平坦,尖峰处也没有过冲,问题就解决了。
什么时候用spline?数据本身就是光滑函数的采样值,比如正弦波、高斯曲线,spline的二阶导数连续会让曲线更漂亮,精度也更高。
什么时候用PCHIP?数据有平台、有尖峰、有单调区间,你不希望插值曲线"自作聪明"地加震荡。工程数据、金融数据、传感器数据,大部分情况下PCHIP比spline更靠谱。
还有一个性能差异:PCHIP建模的计算量比spline小,因为不用解三对角方程组。数据量超过10万个点的时候,PCHIP的速度优势就很明显了。

别光看原理,动手跑一遍。
第一步,准备数据。x = linspace(0, 10, 11),y = [0 0 0 0 1 2 3 3 3 3 3]。这组数据有平台、有斜坡、有平台。
第二步,定义插值点。xx = linspace(0, 10, 200),密度拉高一点,曲线更平滑。
第三步,分别跑PCHIP和spline。yy_pchip = pchip(x, y, xx),yy_spline = spline(x, y, xx)。
第四步,画图对比。plot(x, y, 'o', xx, yy_pchip, xx, yy_spline),legend('原始数据', 'PCHIP', 'Spline')。
你会看到spline在y=0到y=1的过渡区有一个明显的下冲,最低点大概到-0.15。PCHIP完全没有,曲线从0直接升到1,干干净净。
再试一个端点场景。x = [0 1 2 3],y = [0 1 0 1]。数据在上下震荡。spline会在1到2之间画出一个光滑的下凹曲线,最低点大概0.4。PCHIP呢?在x=1和x=2处斜率直接设为0,曲线在中间是平的,保持了数据的极值特征。
这就是保形的意义。你的数据长什么样,插值结果就什么样,不多不少。
PCHIP这个函数在MATLAB里藏得不深,但真正理解它的人不多。2026年了,数据插值不是只有spline一条路。保形分段三次Hermite插值的核心价值就一句话:不制造数据里不存在的特征。平台就是平台,极值就是极值,单调就是单调。下次拿到工程数据不知道用什么插值方法的时候,先跑一遍PCHIP,大概率比spline更适合你的场景。
武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。