scipy.interpolate.CubicSpline¶
- class scipy.interpolate.CubicSpline(x, y, axis=0, bc_type='not-a-knot', extrapolate=None)[源代码]¶
三次样条数据插值器。
用两次连续可微的分段三次多项式插值数据 [1]. 结果表示为
PPoly
具有与给定数据匹配的断点的。- 参数
- x类似数组,形状(n,)
包含自变量的值的一维数组。值必须是实数、有限且严格递增。
- yarray_like
包含因变量值的数组。它可以有任意数量的维度,但沿
axis
(见下文)必须与的长度匹配x
。值必须是有限的。- axis整型,可选
轴线,沿着该轴线 y 假设是变化的。意思是说,对于
x[i]
相应的值为np.take(y, i, axis=axis)
。默认值为0。- bc_type字符串或二元组,可选
边界条件类型。由边界条件给出的两个附加方程需要确定每个线段上的所有多项式的系数 [2].
如果 bc_type 为字符串,则指定的条件将应用于样条曲线的两端。可用条件包括:
“不是一个结”(默认):曲线末端的第一个和第二个线段是相同的多项式。当没有关于边界条件的信息时,这是一个很好的默认值。
‘周期性’:假定插值函数为周期周期函数
x[-1] - x[0]
。的第一个和最后一个值 y 必须相同:y[0] == y[-1]
。此边界条件将导致y'[0] == y'[-1]
和y''[0] == y''[-1]
。“CLAMPPED”:曲线端点处的一阶导数为零。假设1D y ,
bc_type=((1, 0.0), (1, 0.0))
都是一样的情况。‘Natural’:曲线末端的二阶导数为零。假设1D y ,
bc_type=((2, 0.0), (2, 0.0))
都是一样的情况。
如果 bc_type 是二元组,则第一个和第二个值将分别应用于曲线起点和终点。元组值可以是前面提到的字符串之一(“周期”除外)或元组 (order, deriv_values) 允许在曲线端点处指定任意导数:
order :导数阶,1或2。
deriv_value :ARRAY_LIKE包含导数值,形状必须与 y ,不包括
axis
尺寸标注。例如,如果 y 是一维的,那么 deriv_value 一定是标量。如果 y 是形状为(N0,N1,N2)且轴=2的三维,则 deriv_value 必须是二维的,并且具有形状(N0,N1)。
- extrapolate{bool,‘周期性’,无},可选
如果为bool,则确定是根据第一个和最后一个间隔外推到越界点,还是返回NAN。如果为‘PERIONAL’,则使用周期性外推。如果无(默认值),
extrapolate
设置为“周期性”,用于bc_type='periodic'
否则就是真的。
参见
Akima1DInterpolator
Akima一维插值器。
PchipInterpolator
PCHIP一维单调三次插值器。
PPoly
关于系数和断点的分段多项式。
注意事项
参数 bc_type 和
interpolate
独立工作,即前者仅控制样条线的构造,后者仅控制求值。当边界条件为‘非结点’且n=2时,用一阶导数等于线性插值斜率的条件代替。当两个边界条件都不是一个结,且n=3时,求解为通过给定点的抛物线。
当‘Not-a-Not’边界条件应用于两端时,生成的样条线将与由返回的样条线相同
splrep
(带s=0
)和InterpolatedUnivariateSpline
,但这两种方法均采用B样条基表示。0.18.0 新版功能.
参考文献
- 1
Cubic Spline Interpolation 在维基大学上。
- 2
卡尔·德布尔,“样条实用指南”,斯普林格-维拉格出版社,1978年。
示例
在本例中,三次样条用于插值采样的正弦曲线。您可以看到,样条连续性属性适用于一阶和二阶导数,并且仅与三阶导数相冲突。
>>> from scipy.interpolate import CubicSpline >>> import matplotlib.pyplot as plt >>> x = np.arange(10) >>> y = np.sin(x) >>> cs = CubicSpline(x, y) >>> xs = np.arange(-0.5, 9.6, 0.1) >>> fig, ax = plt.subplots(figsize=(6.5, 4)) >>> ax.plot(x, y, 'o', label='data') >>> ax.plot(xs, np.sin(xs), label='true') >>> ax.plot(xs, cs(xs), label="S") >>> ax.plot(xs, cs(xs, 1), label="S'") >>> ax.plot(xs, cs(xs, 2), label="S''") >>> ax.plot(xs, cs(xs, 3), label="S'''") >>> ax.set_xlim(-0.5, 9.5) >>> ax.legend(loc='lower left', ncol=2) >>> plt.show()
在第二个示例中,使用样条曲线对单位圆进行插值。采用周期边界条件。您可以看到,周期点(1,0)处的一阶导数值ds/dx=0,ds/dy=1被正确计算。请注意,三次样条曲线不能精确表示圆。要提高精度,将需要更多断点。
>>> theta = 2 * np.pi * np.linspace(0, 1, 5) >>> y = np.c_[np.cos(theta), np.sin(theta)] >>> cs = CubicSpline(theta, y, bc_type='periodic') >>> print("ds/dx={:.1f} ds/dy={:.1f}".format(cs(0, 1)[0], cs(0, 1)[1])) ds/dx=0.0 ds/dy=1.0 >>> xs = 2 * np.pi * np.linspace(0, 1, 100) >>> fig, ax = plt.subplots(figsize=(6.5, 4)) >>> ax.plot(y[:, 0], y[:, 1], 'o', label='data') >>> ax.plot(np.cos(xs), np.sin(xs), label='true') >>> ax.plot(cs(xs)[:, 0], cs(xs)[:, 1], label='spline') >>> ax.axes.set_aspect('equal') >>> ax.legend(loc='center') >>> plt.show()
第三个例子是多项式y=x的插值 3 on the interval 0 <= x<= 1. A cubic spline can represent this function exactly. To achieve that we need to specify values and first derivatives at endpoints of the interval. Note that y' = 3 * x 2,因此y‘(0)=0,y’(1)=3。
>>> cs = CubicSpline([0, 1], [0, 1], bc_type=((1, 0), (1, 3))) >>> x = np.linspace(0, 1) >>> np.allclose(x**3, cs(x)) True
- 属性
- xndarray,形状(n,)
断点。一样的
x
它被传递给构造函数。- cndarray,形状(4,n-1,.)
每段上多项式的系数。尾部尺寸与的尺寸匹配 y ,不包括
axis
。例如,如果 y 是一维的,那么c[k, i]
是一个系数,用于(x-x[i])**(3-k)
在这两个线段之间的线段上x[i]
和x[i+1]
。- axis集成
插值轴。与传递给构造函数的轴相同。
方法:
__call__
\(X[, nu, extrapolate] )计算分段多项式或其导数。
derivative
\([nu] )构造一个新的分段多项式来表示导数。
antiderivative
\([nu] )构造一个新的分段多项式来表示该反导数。
integrate
\(a,b[, extrapolate] )计算分段多项式上的定积分。
roots
\([discontinuity, extrapolate] )求分段多项式的实根。