自然三次样条
三次样条:
三次样条是使用满足给定m 个控制点的三次多项式的样条。为了推导出三次样条的解,我们假设端点处的第二个推导为 0,这反过来提供了一个边界条件,将两个方程添加到m-2方程以使其可解。一维三次样条的方程组可由下式给出:
我们为函数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 个区间和 4 个系数,因此我们需要4n 个参数来求解样条,我们可以从每个三次样条方程都满足两端值的事实得到 2n 个方程:
上述三次样条方程不仅应该是连续的和可微的,而且还定义了在控制点上也是连续的一阶和二阶导数。
和
对于1, 2, 3…n-1提供2n -2方程约束。因此,我们还需要 2 个方程来求解上述三次样条。为此,我们将使用一些自然边界条件。
自然三次样条:
在自然三次样条中,我们假设样条在边界点处的二阶导数为 0:
现在,由于 S(x) 是一个三阶多项式,我们知道 S”(x) 是一个插值的线性样条。因此,首先,我们构造 S”(x),然后对其进行两次积分以获得 S(x)。
现在,让我们假设 t_i = x_i for i= 0, 1,…n,并且并且从自然边界条件
.二次微分三次样条给出线性样条,可以写成:
在哪里,
现在,等式变为:
将该方程积分两次以获得三次样条:
在哪里,
现在,检查 t_i 处导数的连续性,即 S^{'}_{i}(t_i) = S^{'}_{i-1}(t_{i})。我们首先需要找到导数并设置条件:
在哪里,
将上述方程用于连续性并求解它给出以下方程:
取,v_i = 6(b_i – b_{i-1}) 上面的等式可以写成矩阵的形式:
执行
- 在这个实现中,我们将使用满足自然边界条件的三次样条对函数f(x) = 1/x的点 b/w 2-10 执行样条插值。
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(2,10)
y = 1/(x)
# apply cubic spline interpolation
cs = CubicSpline(x, y, extrapolate=True)
# apply natural cubic spline interpolation
ns = CubicSpline(x, y,bc_type='natural', extrapolate=True)
# Apply Linear interpolation
linear_int = interp1d(x,y)
xs = np.arange(2, 9, 0.1)
ys = linear_int(xs)
# plot linear interpolation
plt.plot(x, y,'o', label='data')
plt.plot(xs,ys, label="interpolation", color='green')
plt.legend(loc='upper right', ncol=2)
plt.title('Linear Interpolation')
plt.show()
# define a new xs
xs = np.arange(1,15)
#plot cubic spline and natural cubic spline
plt.plot(x, y, 'o', label='data')
plt.plot(xs, 1/(xs), label='true')
plt.plot(xs, cs(xs), label="S")
plt.plot(xs, ns(xs), label="NS")
plt.plot(xs, ns(xs,2), label="NS''")
plt.plot(xs, ns(xs,1), label="NS'")
plt.legend(loc='upper right', ncol=2)
plt.title('Cubic/Natural Cubic Spline Interpolation')
plt.show()
# check for boundary condition
print("Value of double differentiation at boundary conditions are %s and %s"
%(ns(2,2),ns(10,2)))
输出:
Value of double differentiation at boundary conditions are -1.1102230246251565e-16 and -0.00450262550915248
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/Natural_Cubic_spline_17.jpg)
线性插值
![](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/Natural_Cubic_spline_18.jpg)
三次/自然样条插值
参考:
- 自然三次样条 NTNU 大学