Сципион Минимизирует дает странные ответы

#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. Второй пример-численные проблемы / нестабильность, нередкие при наличии быстрорастущих функций в сочетании с не настроенным числовым дифференцированием. Я бы включил ведение журнала и проверил значения в обратном вызове. Это также может помочь обеспечить границы переменных, которые поддерживает этот решатель.