本文简要介绍 python 语言中 scipy.interpolate.CubicSpline
的用法。
用法:
class scipy.interpolate.CubicSpline(x, y, axis=0, bc_type='not-a-knot', extrapolate=None)#
三次样条数据插值器。
使用两次连续可导的分段三次多项式对数据进行插值 [1]。结果表示为
PPoly
实例,其中断点与给定数据匹配。- x: 数组, 形状 (n,)
包含自变量值的一维数组。值必须是实数、有限且严格递增的。
- y: array_like
包含因变量值的数组。它可以有任意数量的维度,但沿
axis
的长度(见下文)必须与x
的长度匹配。值必须是有限的。- axis: 整数,可选
沿哪个轴y假设是变化的。这意味着对于
x[i]
对应的值为np.take(y, i, axis=axis)
.默认值为 0。- bc_type: 字符串或 2 元组,可选
边界条件类型。需要由边界条件给出的两个附加方程来确定每个段 [2] 上多项式的所有系数。
如果bc_type 是字符串,则指定的条件将应用于样条曲线的两端。可用条件为:
‘not-a-knot’(默认):曲线末端的第一段和第二段是相同的多项式。当没有关于边界条件的信息时,这是一个很好的默认值。
‘periodic’:假设插值函数是周期性的
x[-1] - x[0]
.的第一个和最后一个值y必须相同:y[0] == y[-1]
.这个边界条件将导致y'[0] == y'[-1]
和y''[0] == y''[-1]
.‘clamped’:曲线末端的一阶导数为零。假设一维y,
bc_type=((1, 0.0), (1, 0.0))
是相同的条件。‘natural’:曲线末端的二阶导数为零。假设一维y,
bc_type=((2, 0.0), (2, 0.0))
是相同的条件。
如果bc_type 是一个二元组,则第一个和第二个值将分别应用于曲线的起点和终点。元组值可以是前面提到的字符串之一(‘periodic’ 除外)或允许在曲线末端指定任意导数的元组(顺序,deriv_values):
order:导数顺序,1 或 2。
deriv_value: 数组 包含导数值,形状必须相同y, 不包括
axis
方面。例如,如果y是一维的,那么deriv_value必须是标量。如果y是 3-D,形状为 (n0, n1, n2) 且轴 = 2,则deriv_value必须是二维的并且具有 (n0, n1) 的形状。
- extrapolate: {bool,‘periodic’,无},可选
如果是布尔值,则确定是根据第一个和最后一个间隔外推到越界点,还是返回 NaN。如果‘periodic’,使用周期性外推。如果 None (默认),
extrapolate
设置为 ‘periodic’ 用于bc_type='periodic'
,否则设置为 True。
参数 ::
注意:
参数bc_type和
extrapolate
独立工作,即前者仅控制样条的构造,而后者仅控制评估。当边界条件为“not-a-knot”且 n = 2 时,将其替换为一阶导数等于线性插值斜率的条件。当两个边界条件均为“not-a-knot”且 n = 3 时,求解作为通过给定点的抛物线寻求。
当 'not-a-knot' 边界条件应用于两端时,生成的样条曲线将与
splrep
(使用s=0
)和InterpolatedUnivariateSpline
返回的样条曲线相同,但这两种方法使用 B-spline 基础中的表示.参考:
[1]Cubic Spline Interpolation 在维基学院。
[2]Carl de Boor,“样条曲线实用指南”,Springer-Verlag,1978 年。
例子:
在此示例中,三次样条用于内插采样的正弦曲线。您可以看到样条连续性属性适用于一阶和二阶导数,仅违反三阶导数。
>>> import numpy as np >>> 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 在区间 0 <= x<= 1 上的插值。三次样条可以精确地表示这个函数。为了实现这一点,我们需要在区间的端点处指定值和一阶导数。请注意,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
- x: ndarray,形状(n,)
断点。传递给构造函数的相同
x
。- c: ndarray,形状(4,n-1,...)
每个段上多项式的系数。尾随尺寸与y, 不包括
axis
.例如,如果y是一维,那么c[k, i]
是一个系数(x-x[i])**(3-k)
在之间的段x[i]
和x[i+1]
.- axis: int
插值轴。传递给构造函数的同一轴。
属性 ::
相关用法
- Python SciPy interpolate.CloughTocher2DInterpolator用法及代码示例
- Python SciPy interpolate.make_interp_spline用法及代码示例
- Python SciPy interpolate.krogh_interpolate用法及代码示例
- Python SciPy interpolate.InterpolatedUnivariateSpline用法及代码示例
- Python SciPy interpolate.BSpline用法及代码示例
- Python SciPy interpolate.LSQSphereBivariateSpline用法及代码示例
- Python SciPy interpolate.griddata用法及代码示例
- Python SciPy interpolate.splder用法及代码示例
- Python SciPy interpolate.LinearNDInterpolator用法及代码示例
- Python SciPy interpolate.PPoly用法及代码示例
- Python SciPy interpolate.NdBSpline用法及代码示例
- Python SciPy interpolate.pade用法及代码示例
- Python SciPy interpolate.barycentric_interpolate用法及代码示例
- Python SciPy interpolate.RegularGridInterpolator用法及代码示例
- Python SciPy interpolate.NdPPoly用法及代码示例
- Python SciPy interpolate.interp2d用法及代码示例
- Python SciPy interpolate.approximate_taylor_polynomial用法及代码示例
- Python SciPy interpolate.RectSphereBivariateSpline用法及代码示例
- Python SciPy interpolate.sproot用法及代码示例
- Python SciPy interpolate.splantider用法及代码示例
- Python SciPy interpolate.interp1d用法及代码示例
- Python SciPy interpolate.BPoly用法及代码示例
- Python SciPy interpolate.BarycentricInterpolator用法及代码示例
- Python SciPy interpolate.splrep用法及代码示例
- Python SciPy interpolate.make_smoothing_spline用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.interpolate.CubicSpline。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。