埃尔米特插值
埃尔米特插值(Hermite interpolation)在插值节点处同时匹配函数值和指定导数值。与只匹配高度的拉格朗日插值相比,导数条件进一步规定曲线穿过节点时的切线。下文重点讨论两个端点的函数值和一阶导数,它们唯一确定一个次数至多三的多项式。
取区间 ,要求 。曲线从零出发时斜率为一,到一处逐渐变平。满足要求的多项式为 ,而不是仅凭两个函数值选择的直线 ,因为后者在右端斜率仍为一。
四个端点基函数
对一般端点 ,令 、。定义 这四个名字依次对应左端点函数值、左端点导数、右端点函数值和右端点导数,可直接核对它们对四个端点条件的贡献。 在左端值为一,其余两个端点值与导数条件都为零; 只在左端对 的导数为一;另外两者分别对应右端函数值和右端导数。
若端点值为 ,对原变量 的导数为 ,则 导数项乘 是链式法则要求:,乘上 才让对 的端点导数恰为 。若忽略此因子,在长度不是一的区间上就会给错斜率。[1]
存在唯一性的证明
将 代入四个基函数及其导数,可逐项核对上式满足全部条件,因此解存在。若另有一个次数至多三的多项式 同样满足,差 在两个端点都满足 ,所以 都是至少二重零点。于是 能被四次多项式 整除;但 次数至多三,只能恒为零。这就证明唯一。
更一般地, 个不同节点各给函数值和一阶导数,共 个条件,可唯一确定次数至多 的插值多项式。唯一性的同一论证使用 个二重零点;更高阶导数数据则对应更高重数。这里不是用“方程个数等于未知数个数”直接代替可解性证明。
主例与斜率变式
主例的 ,所以 在中点 得 。导数为 ,在区间内非负,符合由零升至一的直观要求。
变式。 保持端点值不变,将两端斜率都改为一。代入四基函数得到 ,中点为二分之一。若只把左端斜率改为六、右端仍为零,则得到 ,中点为 。因此即使两个节点值递增,任意给定斜率也不能保证插值单调或始终落在端点值范围内;形状保持插值需要额外限制。
误差中的四次零点因子
若数据来自 ,则对每个内部非节点点 ,存在 使 证明固定这个 ,令 ,并考察 它在两个端点有二重零点,在固定的内部点还有一个零点。反复应用罗尔定理四次,计入端点导数为零提供的重数,可找到 使 。由于三次多项式的四阶导为零,最后一项四阶导为 ,故 ,得到公式。节点处误差直接为零。
这也给出 ,因为区间内 。没有四阶光滑性或准确端点导数时,这个余项结论的条件就不满足。
可运行的双端点实现
下列函数仅计算已给四个端点条件对应的三次片段。输入有限实数,要求端点递增;不改写任何数据。数学公式也可用于区间外求值,但上述区间内误差界不因此变成外推保证。
from math import isfinite
def hermite_segment(x0, x1, y0, y1, m0, m1, x):
x0, x1, y0, y1, m0, m1, x = map(float, (x0, x1, y0, y1, m0, m1, x))
if not all(isfinite(z) for z in (x0, x1, y0, y1, m0, m1, x)) or x1 <= x0:
raise ValueError("finite data and increasing endpoints required")
h = x1 - x0
t = (x - x0) / h
h00 = 2*t**3 - 3*t**2 + 1
h10 = t**3 - 2*t**2 + t
h01 = -2*t**3 + 3*t**2
h11 = t**3 - t**2
return h00*y0 + h10*h*m0 + h01*y1 + h11*h*m1
assert hermite_segment(0, 1, 0, 1, 1, 0, 0.5) == 5/8
assert hermite_segment(0, 1, 0, 1, 1, 1, 0.5) == 0.5
assert hermite_segment(0, 1, 0, 1, 6, 0, 0.5) == 5/4
assert hermite_segment(2, 4, 3, 7, 2, 2, 3) == 5
assert hermite_segment(0, 1, 0, 1, 1, 0, 1) == 1
print(hermite_segment(0, 1, 0, 1, 1, 0, 0.5))
每次求值只进行固定数量的多项式运算,时间与额外空间均为 。程序的正确性直接由基函数满足四个端点条件和唯一性定理保证;非单位长度的线性变式检验了导数前面的区间长度因子。
参考文献
- ↑ SciPy开发团队:CubicHermiteSpline,分段三次Hermite插值、数据值与一阶导数条件及严格递增节点。访问日期:2026-10-22。