具有python

时间:2016-07-06 21:56:16

标签: python matlab scipy interpolation

我想做一些分段立方Hermite插值并获得多项式的。 (我曾经在matlab中这样做,但现在想在python 3.4中实现这个。) 我试图使用scipy PchipInterpolator。插值是可以的但是当我试图检索根时我得到了这个错误...
我现在被困在这里,无法找到任何解决方法。这是一个简单的代码,重现了我的工作和确切的错误信息......

import matplotlib.pyplot as plt
from scipy import interpolate, __version__
import numpy as np

print('numpy : ' + np.__version__)
print('scipy :' + __version__)

x = np.arange(10)
y = [1., 1., 3., 2., 1., 1., 1.5, 2., 8., 1.]
f = interpolate.PchipInterpolator(x, y, axis=0, extrapolate=None)
print(f.roots()) # this produces an error !

xnew = np.arange(0, 9, 0.1)
ynew = f(xnew)   # use interpolation function returned by `PchipInterpolator`
plt.plot(x, y, 'o', xnew, ynew, '-')
plt.show()

错误消息:

numpy : 1.10.1
scipy :0.17.1
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    print(f.roots()) # this produces an error !
  File "/usr/local/lib/python3.4/dist-packages/scipy/interpolate/_monotone.py", line 105, in roots
    return (PPoly.from_bernstein_basis(self._bpoly)).roots()
AttributeError: 'PchipInterpolator' object has no attribute '_bpoly'

Process finished with exit code 1

然而,scipy docs说:“roots()返回插值函数的根。”

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

这是scipy中的一个错误。

(请在https://github.com/scipy/scipy/issues上报告)

作为解决方法,您可以手动转换为电源基础:

In [1]: from scipy.interpolate import pchip

In [2]: import numpy as np

In [3]: x = np.arange(10)

In [4]: y = [1., 1., 3., 2., 1., 1., 1.5, 2., 8., 1.]

In [5]: s = pchip(x, y)

In [6]: from scipy.interpolate import PPoly

In [7]: pp = PPoly.from
PPoly.from_bernstein_basis  PPoly.from_spline

In [7]: pp = PPoly.from_bernstein_basis(s)

In [8]: pp.roots()
Out[8]: array([  9.07179677,  22.92820323])

编辑:如果使用此解决方法并且您具有非默认axis,请最好检查转换时是否处理轴。如果不是,请报告。