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。
我在想:
- 如果这是在 scipy.optimize.bisect 上使用的正确技术方法
一个 numpy 数组?特别是当我要对不同的 numpy 值集执行 10^6 次时。
- 如果执行线性插值不影响结果
那对分会找到,如果是,还有更好的选择吗?
这是两个 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
值值。
我有一个 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。
我在想:
- 如果这是在 scipy.optimize.bisect 上使用的正确技术方法 一个 numpy 数组?特别是当我要对不同的 numpy 值集执行 10^6 次时。
- 如果执行线性插值不影响结果 那对分会找到,如果是,还有更好的选择吗?
这是两个 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
值值。