LSQUnivariateSpline#
- class scipy.interpolate.LSQUnivariateSpline(x, y, t, w=None, bbox=[None, None], k=3, ext=0, check_finite=False)[source]#
带显式内部结点的 1-D 样条。
遗留
此类别被视为遗留类别,将不再接收更新。虽然我们目前没有计划将其删除,但我们建议新代码使用更现代的替代方案。具体来说,我们建议使用
make_lsq_spline
。将 k 次样条 y = spl(x) 拟合到提供的 x, y 数据。t 指定样条的内部结点
- 参数:
- x(N,) 类数组对象
数据点的输入维度 – 必须是递增的
- y(N,) 类数组对象
数据点的输入维度
- t(M,) 类数组对象
样条的内部结点。必须按升序排列,并且
bbox[0] < t[0] < ... < t[-1] < bbox[-1]
- w(N,) 类数组对象, 可选
样条拟合的权重。必须为正。如果为 None(默认值),则所有权重都为 1。
- bbox(2,) 类数组对象, 可选
指定近似区间边界的 2 元素序列。如果为 None(默认值),则
bbox = [x[0], x[-1]]
。- kint, 可选
平滑样条的次数。必须介于 1 和 5 之间(含)。默认值为 k = 3,即三次样条。
- extint 或 str, 可选
控制结点序列定义区间之外元素的外推模式。
如果 ext=0 或 ‘extrapolate’,则返回外推值。
如果 ext=1 或 ‘zeros’,则返回 0
如果 ext=2 或 ‘raise’,则引发 ValueError
如果 ext=3 或 ‘const’,则返回边界值。
默认值为 0。
- check_finitebool, 可选
是否检查输入数组只包含有限数。禁用此功能可能会提高性能,但如果输入包含无穷大或 NaN,则可能导致问题(崩溃、无法终止或无意义的结果)。默认值为 False。
方法
__call__
(x[, nu, ext])在位置 x 处评估样条(或其 nu 次导数)。
antiderivative
([n])构造一个表示此样条反导数的新样条。
derivative
([n])构造一个表示此样条导数的新样条。
derivatives
(x)返回样条在点 x 处的所有导数。
返回样条系数。
返回样条内部结点的位置。
返回样条近似的残差平方加权和。
integral
(a, b)返回样条在给定两点之间的定积分。
roots
()返回样条的零点。
使用给定的平滑因子 s 和上次调用时找到的结点继续样条计算。
validate_input
- 引发:
- ValueError
如果内部结点不满足 Schoenberg-Whitney 条件
另请参阅
UnivariateSpline
用于拟合给定数据集的平滑单变量样条。
InterpolatedUnivariateSpline
用于给定数据集的插值单变量样条。
splrep
一个查找 1-D 曲线的 B 样条表示的函数
splev
一个评估 B 样条或其导数的函数
sproot
一个查找三次 B 样条根的函数
splint
一个评估 B 样条在给定两点之间的定积分的函数
spalde
一个评估 B 样条所有导数的函数
备注
数据点的数量必须大于样条次数 k。
结点 t 必须满足 Schoenberg-Whitney 条件,即必须存在数据点
x[j]
的一个子集,使得t[j] < x[j] < t[j+k+1]
,对于j=0, 1,...,n-k-2
。示例
>>> import numpy as np >>> from scipy.interpolate import LSQUnivariateSpline, UnivariateSpline >>> import matplotlib.pyplot as plt >>> rng = np.random.default_rng() >>> x = np.linspace(-3, 3, 50) >>> y = np.exp(-x**2) + 0.1 * rng.standard_normal(50)
使用预定义内部结点拟合平滑样条
>>> t = [-1, 0, 1] >>> spl = LSQUnivariateSpline(x, y, t)
>>> xs = np.linspace(-3, 3, 1000) >>> plt.plot(x, y, 'ro', ms=5) >>> plt.plot(xs, spl(xs), 'g-', lw=3) >>> plt.show()
检查结点向量
>>> spl.get_knots() array([-3., -1., 0., 1., 3.])
使用另一个样条的结点构造最小二乘样条
>>> x = np.arange(10) >>> s = UnivariateSpline(x, x, s=0) >>> s.get_knots() array([ 0., 2., 3., 4., 5., 6., 7., 9.]) >>> knt = s.get_knots() >>> s1 = LSQUnivariateSpline(x, x, knt[1:-1]) # Chop 1st and last knot >>> s1.get_knots() array([ 0., 2., 3., 4., 5., 6., 7., 9.])