Если я попытаюсь найти (мелкий) максимум функции Химмельблау с отправной точкой даже немного вдали от ее истинного местоположения, scipy.minimize
(с его алгоритмом BFGS по умолчанию) утверждает, что он был успешным , но фактически потерял крутые стороны функции:
def f(X):
x, y = X
return (x**2 + y - 11)**2 + (x + y**2 - 7)**2
from scipy.optimize import minimize
minimize(lambda X: -f(X), (0.2, 0.2))
возвращает:
fun: -1.317411760934999e+34
hess_inv: array([[ 0.38662039, -0.49347889],
[-0.49347889, 0.70730156]])
jac: array([0., 0.])
message: 'Optimization terminated successfully.'
nfev: 64
nit: 2
njev: 16
status: 0
success: True
x: array([ 2.32731520e+08, -3.18111266e+08])
Почему он не смог обнаружить сбой здесь? В этой точке градиент, безусловно, не равен нулю.