#python #scipy #scipy-optimize-minimize
Вопрос:
У меня есть кое-какая функция:
def V(x):
a = 0
g = 0
return 1/6*(3*x[0]**2 3*x[1]**2 6*x[0]**2*x[1]-2*x[1]**3) a*(2*x[0]**6*(x[1] 1) x[0]**4*x[1]**2*(2*x[1] 1) x[0]**2*x[1]**4*(2*x[1] 1) 2*x[1]**6*(x[1] 1)) g*(x[0]**4*(x[1]-1) x[0]**2*(x[1]-2)*x[1]**2-x[1]**4*(x[1] 1))
и я хочу посмотреть, когда частные производные по x и y от V равны 0. ( x[0]
есть x и x[1]
есть y). Я решил использовать для этого функцию минимизации scipy, поэтому я придумал эту функцию:
def LBFGS(x, y):
x0 = np.array([x, y])
res = minimize(V, x0, method='L-BFGS-B').x.tolist()
return res[0], res[1]
Это принимает начальные значения и выводит координаты x и y, где V сведено к минимуму. Теперь проблема возникла, когда я начал тестировать эту функцию. Можно легко проверить, что (0, 0) — это место, где частные производные по x и y от V равны 0. Когда я подключился LBFGS(0, 0)
, это сработало. Однако , когда я подключился LBFGS(0, 0.1)
, я получил (-4.9999383996738455e-09, 8.936905459196604e-08)
. Почему я получаю странные ответы, когда я должен получать (0, 0)?
Другой пример-когда я подключаюсь, LBFGS(0, 1.01)
что должно вывести (0, 1), но я получаю
RuntimeWarning: overflow encountered in double_scalars
return 1/6*(3*x[0]**2 3*x[1]**2 6*x[0]**2*x[1]-2*x[1]**3) a*(2*x[0]**6*(x[1] 1) x[0]**4*x[1]**2*(2*x[1] 1) x[0]**2*x[1]**4*(2*x[1] 1) 2*x[1]**6*(x[1] 1)) g*(x[0]**4*(x[1]-1) x[0]**2*(x[1]-2)*x[1]**2-x[1]**4*(x[1] 1))
RuntimeWarning: invalid value encountered in double_scalars
return 1/6*(3*x[0]**2 3*x[1]**2 6*x[0]**2*x[1]-2*x[1]**3) a*(2*x[0]**6*(x[1] 1) x[0]**4*x[1]**2*(2*x[1] 1) x[0]**2*x[1]**4*(2*x[1] 1) 2*x[1]**6*(x[1] 1)) g*(x[0]**4*(x[1]-1) x[0]**2*(x[1]-2)*x[1]**2-x[1]**4*(x[1] 1))
(-138.778, 1.3510798882111488e 26)
Комментарии:
1. Как далеко это на самом деле от 0? Это (несколько точное) приближение (0,0). Все итерационные решатели (не решения замкнутой формы) обычно имеют только приближенные решения. И ваш даже использовал числовое дифференцирование, чтобы приземлиться там- > не очень помогает сохранить > точность , хотя у решателя есть критерии завершения, чтобы рассуждать об этом (статус и журналы решателя могут выдать выбранную критерий завершения: то, что заставляет решателя думать, что это правильное решение).
2. Относительно 0,1, -5e-9 РАВНО нулю.
3. Подождите также, может ли кто-нибудь объяснить, что происходит во втором примере?
4. Второй пример-численные проблемы / нестабильность, нередкие при наличии быстрорастущих функций в сочетании с не настроенным числовым дифференцированием. Я бы включил ведение журнала и проверил значения в обратном вызове. Это также может помочь обеспечить границы переменных, которые поддерживает этот решатель.