scipy.optimise.bisect 在 numpy 数组上

scipy.optimise.bisect on a numpy array

我有一个 numpy 浮点数数组,打印出来时如下所示:

红色圆圈是原始值,蓝色十字是使用 numpy.interp 的线性插值。

我想使用 scipy.optimize.bisect(例如)找到这个 numpy 数组(红色圆圈)的过零横坐标。因为这是一个 numpy 数组(而不是函数),所以我不能将它直接传递给 scipy.optimize.bisect。所以我想传递一个函数,该函数将 numpy 数组内插为二等分。这是我目前使用的代码:

def Inter_F(x,xp,fp):
    return np.interp(x,xp,fp)
Numpyroot = scp.optimize.bisect(Inter_F,0,9,args=(XNumpy,YNumpy)) 

我找到一个看起来正确的值,Numpyroot = 3.376425289196618。
我在想:

这是两个 numpy 数组:

XNumpy = array([ 0.   ,  1.125,  2.25 ,  3.375,  4.5  ,  5.625,  6.75 ,  7.875,  9.   ])
YNumpy = array([ -2.70584242e+04,  -2.46925289e+04,  -1.53211676e+04,
        -2.30000000e+01,   1.81312104e+04,   3.41662461e+04,
         4.80466863e+04,   5.75113178e+04,   6.41718009e+04])

我觉得你做的是对的。不过,还有更简洁的方法。

import numpy as np
from scipy.interpolate import interp1d


XNumpy = np.array([0., 1.125, 2.25, 3.375, 4.5, 5.625, 6.75, 7.875, 9.])
YNumpy = np.array([
    -2.70584242e+04, -2.46925289e+04, -1.53211676e+04,
    -2.30000000e+01, 1.81312104e+04, 3.41662461e+04,
    4.80466863e+04,   5.75113178e+04,   6.41718009e+04
]) 

invf = interp1d(YNumpy, XNumpy)
print(invf(0))

结果:

array(3.376425289199028)

这里我用scipy.interpolate.interp1d来return一个函数。我还插入了反函数,以便很容易计算出横坐标。当然你可以用 np.interp 做同样的事情,我喜欢 scipy.interpolate.interp1d 因为它 return 是一个函数所以我可以从任何给定的 y 计算 x 值值。