三次样条插值
插值:
我们通过绘制一条穿过x i的平滑曲线来估计任意x 的f(x) 。如果所需的x介于x i的最大值和最小值之间,则称为插值,否则称为外插。
线性插值:
线性插值是一种利用线性多项式(如直线方程)对点进行曲线拟合的方法。这类似于通过在数据集中的两个点画一条线来连接点。
多项式插值:
多项式插值是通过创建更高次多项式来连接这些点来拟合曲线的方法。
样条插值:
与多项式插值x'类似的样条插值在每个区间中使用低次多项式,并选择多项式段以使它们平滑地组合在一起。结果函数称为样条。
三次样条插值
三次样条插值是一种寻找连接度数为 3 或更少的数据点的曲线的方法。样条是多项式,在给定的图中平滑且连续,并且在它们连接的地方也是连续的一阶和二阶导数。
我们为函数y = f(x)取一组点[x i , y i ] for i = 0, 1, ..., n 。三次样条插值是一条分段连续曲线,通过表中的每个值。
- 以下是K=3 次样条的条件:
- s 的域在[a, b] 的区间内。
- S, S', S"都是 [a, b] 上的连续函数。
这里S i (x)是将在子区间[x i , x i+1 ]上使用的三次多项式。
样条的主要因素是它结合了不同的多项式,而不是使用单个n次多项式一次拟合所有点,它避免了高次多项式,从而避免了潜在的过度拟合问题。这些低次多项式需要使得它们形成的样条不仅连续而且平滑。
但要使样条平滑且连续,两个连续多项式和S i (x)和S i+1 (x)必须在x i 处连接。
或者, S i (x) 必须通过两个端点:
假设,S” (x) = M i (i = 0,1,2, …, n)。由于 S(x) 是三次多项式,所以 S” (x) 是[x i , x i+1 ] 中的线性多项式,那么S”' (x)将是:
通过应用泰勒级数:
让,x = x i+1 :
类似地,我们应用上述等式 b/w range [x i-1 , x i ] :
设 h i = x i – x i-1
现在,我们有n-1 个方程,但有n+1 个变量,即 M 0 , M 1 , M 2 ,...M n-1 , M n 。因此,我们还需要得到 2 个等式。为此,我们将使用额外的边界条件。
让我们考虑我们知道S' (x 0 ) = f 0 ' 和 S' (x n ) = f n ' ,特别是如果S' (x 0 )和S' (x n )都是 0。这被称为钳制边界条件。
类似地,对于 M n
或者
将上述方程组合成矩阵形式,我们得到以下矩阵:
执行
- 我们将使用 Scipy 来执行线性样条插值。我们将使用 Cubic Spline 和 scipy 的 interp1d函数来执行函数f(x) =1/(1+x^2) 的插值。
Python3
#imports
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import CubicSpline, interp1d
plt.rcParams['figure.figsize'] =(12,8)
x = np.arange(-10,10)
y = 1/(1+x**2)
# apply cubic spline interpolation
cs = CubicSpline(x, y)
# Apply Linear interpolation
linear_int = interp1d(x,y)
xs = np.arange(-10, 10)
ys = linear_int(xs)
# plot linear interpolation
plt.plot(x, y, 'o', label='data')
plt.plot(xs,ys, label="S", color='green')
plt.legend(loc='upper right', ncol=2)
plt.title('Linear Interpolation')
plt.show()
# plot cubic spline interpolation
plt.plot(x, y, 'o', label='data')
plt.plot(xs, 1/(1+(xs**2)), label='true')
plt.plot(xs, cs(xs), label="S")
plt.plot(xs, cs(xs, 1), label="S'")
plt.plot(xs, cs(xs, 2), label="S''")
plt.plot(xs, cs(xs, 3), label="S'''")
plt.ylim(-1.5, 1.5)
plt.legend(loc='upper right', ncol=2)
plt.title('Cubic Spline Interpolation')
plt.show()
参考:
- Wikidiversity 三次样条插值