Python 反转插值以给出与所需插值函数值相关的变量
我正在尝试使用scipy的插值函数反转插值函数。假设我创建了一个插值函数Python 反转插值以给出与所需插值函数值相关的变量,python,scipy,interpolation,Python,Scipy,Interpolation,我正在尝试使用scipy的插值函数反转插值函数。假设我创建了一个插值函数 import scipy.interpolate as interpolate interpolatedfunction = interpolated.interp1d(xvariable,data,kind='cubic') 当我指定一个: interpolatedfunction(x) == a 换句话说,“我希望我的插值函数等于;xvariable的值是多少,这样我的函数等于?” 我很感激我可以用一些数值格式来做
import scipy.interpolate as interpolate
interpolatedfunction = interpolated.interp1d(xvariable,data,kind='cubic')
当我指定一个:
interpolatedfunction(x) == a
换句话说,“我希望我的插值函数等于;xvariable的值是多少,这样我的函数等于?”
我很感激我可以用一些数值格式来做这件事,但是有没有更直接的方法呢?如果插值函数在xvariable中是多值的呢?创建插值函数
interp\u fn
后,您可以通过函数的根找到x
的值,其中interp\u fn(x)==a
interp_fn2 = lambda x: interp_fn(x) - a
在scipy.optimize
中有许多选项可以查找根。例如,要使用初始值为10的牛顿法:
from scipy import optimize
optimize.newton(interp_fn2, 10)
实例 创建一个插值函数,然后找到根,其中
fn(x)=5
import numpy as np
from scipy import interpolate, optimize
x = np.arange(10)
y = 1 + 6*np.arange(10) - np.arange(10)**2
y2 = 5*np.ones_like(x)
plt.scatter(x,y)
plt.plot(x,y)
plt.plot(x,y2,'k-')
plt.show()
有专门的方法来寻找三次样条曲线的根。最简单的使用方法是对象的
.roots()
方法:
这将查找所有根,而不仅仅是一个根,就像通用解算器(fsolve
,brentq
,newton
,对分
等)所做的那样
输出数组([1.56669456,4.71145244,7.85321627,10.99554642,14.13792756,17.28271674])
但是,您希望将样条线等同于某个任意数字a,而不是0。一个选项是重建样条曲线(不能从中减去a
):
请注意,interp1d
返回的函数不支持这些操作;它没有根
方法。对于该函数,可以选择使用像fsolve
这样的通用方法,但一次只能从中获得一个根。在任何情况下,当有更强大的方法可以进行相同类型的插值时,为什么要对三次样条曲线使用interp1d
非面向对象方法
可以直接从样条曲线系数中减去a
,而不是在从数据中减去a
后重建样条曲线。这就要求我们转而使用非面向对象的插值方法。具体而言,接收由准备的tck元组,如下所示:
tck = splrep(x, y, k=3, s=0)
tck_mod = (tck[0], tck[1] - a, tck[2])
solutions = sproot(tck_mod)
我不确定在这里处理
tck
是否值得,因为不管怎样,大部分计算时间都可能在根查找中。但最好有其他选择。如果您的数据是单调的,您也可以尝试以下方法:
inversefunction = interpolated.interp1d(data, xvariable, kind='cubic')
所以你想要
x
其中插值函数(x)=a
?这是正确的。是否有一个内置函数可以做这样的事情?一个很好的替代方法,比如.root()可以找到所有的根(如果它们存在的话)。这太棒了。特别适用于从自定义分布进行采样。
x = np.arange(20)
y = np.cos(np.arange(20))
spl = InterpolatedUnivariateSpline(x, y)
print(spl.roots())
solutions = InterpolatedUnivariateSpline(x, y - a).roots()
tck = splrep(x, y, k=3, s=0)
tck_mod = (tck[0], tck[1] - a, tck[2])
solutions = sproot(tck_mod)
inversefunction = interpolated.interp1d(data, xvariable, kind='cubic')