最近在做债券收益率曲线绘制的相关项目,会涉及到一些插值方法的实现。为了弄清楚不同插值方法之间的差异,自己查询了一些相关的资料,但发现网上的资料不够系统,零零散散,便想着做一个读书笔记之类的东西以做留存。其中的疏漏在所难免,欢迎各位指正。
本文主要通过代码实现来加深大家对不同插值方法之间差异的理解,具体的推导过程网上很容易搜索到相关资料,这里就不再赘述。
常见的插值方法:
- 多项式插值
- Lagrange 插值
- 线性插值
- 抛物线插值
- ...
- Newton 插值
- Lagrange 插值
- 分段插值
- Constant
- Linear
- Hermite
- Cubic Spline
- Natural Spline
- Clamped Spline
- Periodic Spline
- ....
一、多项式插值(Polynomial Interpolation)
多项式插值,顾名思义,即以一个多项式的形式来刻画经过一系列点的曲线。为了更加严谨一些,这里参考Wiki的定义。
给定一组
>> 拉格朗日插值(Lagrange Interpolation)
设
当n=1和2时,即为线性插值多项式和抛物线插值多项式。
def lagrange(x_val, y_val, x):
assert len(x_val) > 1 and (len(x_val) == len(y_val))
def basis(i):
l_i = [(x - x_val[j]) / (x_val[i] - x_val[j]) for j in range(len(x_val)) if j != i]
return reduce(operator.mul, l_i) * y_val[i]
return sum(basis(i) for i in range(len(x_val)))
拉格朗日插值虽然简单易用,但是有个很大的局限,即每增加一个新的插值点时,整个基函数就需要重新构建,这大大增加了运算量。为此,我们需要寻找一种新的基函数,其能够在节点增加时,只需要在原有的基函数上增加一些新的基函数即可,而无需对原始的基函数进行重构。
>> 牛顿插值(Newton Interpolation)
设插值节点为
其中