Python 三次样条插值求系数

Python 三次样条插值求系数,python,scipy,cubic-spline,Python,Scipy,Cubic Spline,假设我有两个python数组,我希望得到(并实际使用)这些点之间的三次样条插值。(即:我希望整合该功能)。我非常喜欢使用numpy scipy的方式 我知道。然而,这只允许我评估这些点,例如非常简单的功能: 现在我可以做一些简单的事情,比如: import numpy as np import scipy.interpolate import matplotlib.pyplot as plt y = np.array([0,2,3,4,8,10,12,12,12,10,9,8,7,1,0,0,

假设我有两个python数组,我希望得到(并实际使用)这些点之间的三次样条插值。(即:我希望整合该功能)。我非常喜欢使用numpy scipy的方式

我知道。然而,这只允许我评估这些点,例如非常简单的功能:

现在我可以做一些简单的事情,比如:

import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt

y = np.array([0,2,3,4,8,10,12,12,12,10,9,8,7,1,0,0,1,2])
x = np.array(range(len(y)))
xvals = np.linspace(0, len(y)-1, len(y)*100, endpoint = False)
func = scipy.interpolate.interp1d(x, y, kind = "cubic")
yvals = func(xvals)
plt.plot(xvals,yvals)
plt.plot(x,y, "o")
然而,我希望进一步处理这个三次样条曲线(即我需要得到积分)。。对于手动操作,我需要获得系数,因此:

a_i * x^3 + b_i * x^2 + c_i * x + d_i where i goes from 0 to n/3 
(n=元素数-这只是第i个立方的定义)

因此,我希望有一个元组列表(或2d数组)来描述所有样条曲线。-或者是一种得到第i个三次方的方法,真的,真的很想得到一个方便的“x-to-i”来找到我现在在哪条样条曲线上


(当然,后一个问题是简单地搜索排序列表中大于引用的第一个值-如果需要,我可以手动轻松完成)。

对于插值,可以使用
scipy.interpolate.UnivariateSpline(…,s=0)

除其他外,它还有一种方法

编辑:
s=0
参数到单变量样条线构造函数强制样条线通过所有数据点。结果是在B样条基础上,您可以使用
get_coefs()
get_knots()
方法获得节点和系数。格式与netlib上FITPACK、dierckx中使用的格式相同。请注意,
interp1d
(依赖于
splmake
ATM)和
UnivariateSpline
(或者,
splrep
/
splev
)内部使用的tck格式不一致


EDIT2:你可以用---得到样条曲线的分段多项式表示,但这与iterp1d不一致。使用splrep(…,s=0)获得插值样条曲线,然后转换结果。

这可能会有所帮助,您可以通过不同的方式获得三次样条插值,这可能有助于您:

import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt

y = np.array([0,2,3,4,8,10,12,12,12,10,9,8,7,1,0,0,1,2])
x = np.array(range(len(y)))
xvals = np.linspace(0, len(y)-1, len(y)*100, endpoint = False)
func = scipy.interpolate.splrep(x, y, s=0)
yvals = scipy.interpolate.splev(xvals, func, der=0)

# display original vs cubic spline representation for security...
plt.figure()
plt.plot(x, y, 'x', xvals, yvals, x, y, 'b')
plt.legend(['Linear', 'Cubic Spline'])
plt.axis([-0.05, 20, -2, 20])
plt.title('Cubic-spline interpolation')
plt.show()
这使您可以通过

pp = scipy.interpolate.spltopp(func[0][1:-1],func[1],func[2])

#Print the coefficient arrays, one for cubed terms, one for squared etc
print(pp.coeffs)
本页还提供了如何使用此三次样条线表示进行积分的示例(我希望更改常量以适应您的情况-您的里程可能会有所不同):


该函数返回具有镜像对称边界条件的b样条项的系数。如果你需要在系数中执行额外的过滤,这是有用的

单变量样条线不是三次样条线,而是所谓的“b样条线”,这是完全不同的事情,与我希望实现的目标几乎没有关系。-首先,它不通过点进行曲线拟合。三次样条曲线定义为一系列三阶多项式,每个多项式拟合两个点,附加的约束条件是,在每个端点,样条曲线具有相同的导数。interp1d with kind=cubic也适用于b样条曲线基础。如果你想在scipy中使用一个局部插值,可以使用BPoly.from_derivativesAren样条曲线不是通常以b样条曲线的形式构建的吗?@Dux这是两个完全不同的数学领域。三次样条曲线是插值的一种形式。b样条曲线是一种近似形式。三次样条曲线将通过所有点,B样条曲线不能保证这一点。当然,您可以在B样条曲线的基础上表示三次插值样条曲线@Dux查看我编辑的答案。您可以使用
scipy.integrate.quad
来集成插值函数。
def integ(x, tck, constant=0):
    x = np.atleast_1d(x)
    out = np.zeros(x.shape, dtype=x.dtype)
    for n in xrange(len(out)):
        out[n] = scipy.interpolate.splint(0, x[n], tck)
    out += constant
    return out

const_of_integration = 0
yint = integ(xvals, func, const_of_integration)