2017-02-06 17 views
0

У меня есть Numpy массив поплавки, которые, когда печатная выглядеть следующим образом: enter image description herescipy.optimise.bisect на Numpy массива

красных кругов являются первоначальными значениями, синие кресты линейной интерполяции с использованием numpy.interp.

Я хотел бы найти абсцисс нулевого пересечения этого массива numpy (красный круг), используя scipy.optimize.bisect (например). Поскольку это массив 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 массива? Специально, когда я собираюсь сделать это 10^6 раз при разных наборах значений numpy.
  • если принуждение к линейной интерполяции не влияет на результаты , что bisect собирается найти, и если да, есть ли лучший выбор?

Вот два 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]) 

ответ

0

Я думаю, что вы делаете это правильно. Однако есть более сжатый способ.

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 вернуть функцию. Также я интерполирую обратную функцию так, чтобы абсцисса была легко рассчитана. Конечно, вы можете сделать тот же трюк с np.interp, мне просто нравится scipy.interpolate.interp1d, потому что он возвращает функцию, поэтому я могу рассчитать значение x от любого заданного значения y.

+0

спасибо. Он работает отлично. Какой алгоритм используется в scipy.interpolate.interp1d? – gregory

+0

@gregory 'scipy.interpolate.interp1d' поддерживает различные методы интерполяции. Значение по умолчанию является линейным, вы также можете указать сплайн-интерполятор более высокого порядка с помощью аргумента 'kind'. Более подробную информацию вы найдете в [документации] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html). –

Смежные вопросы