gpt4 book ai didi

python - 反转插值以给出与所需插值函数值关联的变量

转载 作者:太空狗 更新时间:2023-10-29 22:14:47 25 4
gpt4 key购买 nike

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

import scipy.interpolate as interpolate
interpolatedfunction = interpolated.interp1d(xvariable,data,kind='cubic')

当我指定 a 时,是否有一些函数可以找到 x:

interpolatedfunction(x) == a

换句话说,“我希望我的插值函数等于 a;xvariable 的值是多少才能使我的函数等于 a?”

我很感激我可以用一些数字方案来做到这一点,但是有没有更直接的方法?如果插值函数在 xvariable 中是多值的怎么办?

最佳答案

有专门的方法可以求三次样条的根。使用最简单的是InterpolatedUnivariateSpline对象的.roots()方法:

spl = InterpolatedUnivariateSpline(x, y)
roots = spl.roots()

作为通用求解器(fsolvebrentqnewtonbisect 等)做。

x = np.arange(20)
y = np.cos(np.arange(20))
spl = InterpolatedUnivariateSpline(x, y)
print(spl.roots())

输出 array([ 1.56669456, 4.71145244, 7.85321627, 10.99554642, 14.13792756, 17.28271674])

但是,您想将样条曲线等同于某个任意数字 a,而不是 0。一种选择是重建样条曲线(您不能只从中减去 a):

solutions = InterpolatedUnivariateSpline(x, y - a).roots()

请注意,这些都不适用于 interp1d 返回的函数;它没有 roots 方法。对于该函数,可以选择使用 fsolve 等通用方法,但您一次只能从中获得一个根。无论如何,既然有更强大的方法可以执行相同类型的插值,为什么还要对三次样条使用 interp1d

非面向对象方式

我们可以直接从样条系数中减去a,而不是在从数据中减去a 后重建样条。这就需要我们下降到非面向对象的插值方法。具体来说,sproot 接收一个由 splrep 准备的 tck 元组,如下:

tck = splrep(x, y, k=3, s=0)
tck_mod = (tck[0], tck[1] - a, tck[2])
solutions = sproot(tck_mod)

我不确定在这里乱用 tck 是否值得,因为大部分计算时间可能无论如何都用于求根。但有其他选择是件好事。

关于python - 反转插值以给出与所需插值函数值关联的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47275957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com