Я использую Python + NumPy + SciPy, чтобы определить коэффициенты уравнения на основе данных. Уравнение определяется следующим образом:
def func (x, a,b,c,d):
if x < d:
return 0
else:
return a * ( 1 - np.exp( - b * (x - c) ** d)
Из того, что я обнаружил, традиционное представление функции не будет работать в соответствии с этим обсуждением и должно быть заменено на:
def func (x, a,b,c,d):
return np.where ( x < c,
0 ,
a * ( 1 - np.exp( - b * (x - c) ** d) )
)
Этот вызывает ошибку RuntimeWarning: invalid value encountered in power a * ( 1 - np.exp( - b * (x - c) ** d)
.
Из того, что я понимаю, это происходит из-за попытки создать 2 массива чисел (в данном случае):
- первый заполнен 0
- второй заполнен результатами
a * ( 1 - np.exp( - b * (x - c) ** d) )
А затем создайте результирующий массив на основе условного выбора этих двух. Создание второго массива в интервале x < c
в некоторой комбинации с дробными значениями d
приводит к укоренению отрицательных чисел. И это вызывает проблему.
Мой обходной путь для этого:
def func (x, a,b,c,d):
return np.where ( x < c,
0 ,
a * ( 1 - np.exp( - b * np.abs( x - c) ** d) )
)
Работает нормально, поскольку диапазон значений, где x < c
определяется условием, но есть ли лучший способ сделать это?
В идеале, который даже предотвращает вычисление a * ( 1 - np.exp( - b * (x - c) ** d)
, если x < c
и неверсально, make применим для большего числа условий?