Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 反转插值以给出与所需插值函数值相关的变量_Python_Scipy_Interpolation - Fatal编程技术网

Python 反转插值以给出与所需插值函数值相关的变量

Python 反转插值以给出与所需插值函数值相关的变量,python,scipy,interpolation,Python,Scipy,Interpolation,我正在尝试使用scipy的插值函数反转插值函数。假设我创建了一个插值函数 import scipy.interpolate as interpolate interpolatedfunction = interpolated.interp1d(xvariable,data,kind='cubic') 当我指定一个: interpolatedfunction(x) == a 换句话说,“我希望我的插值函数等于;xvariable的值是多少,这样我的函数等于?” 我很感激我可以用一些数值格式来做

我正在尝试使用scipy的插值函数反转插值函数。假设我创建了一个插值函数

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')