scipy.optimize.curve_fit с условиями - PullRequest
2 голосов
/ 12 января 2020

Я использую 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 применим для большего числа условий?

1 Ответ

1 голос
/ 15 января 2020

Это полностью решает проблему: https://docs.scipy.org/doc/numpy/reference/generated/numpy.piecewise.html

...