Это не ожидаемое поведение или, по крайней мере, есть ошибка сообщения.
Выполняя вывод статистики для оптимизации через options
параметры:
minimize(obj_jac, -100, method='bfgs', jac=True, tol=1e-7, options={'disp': True})
SciPy выводит следующее:
[-100.]
[-100.]
[-98.99]
[-94.95]
[-78.79]
[-30.17904355]
[-3.55271368e-15]
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 3
Function evaluations: 6
Gradient evaluations: 6
, где указанное число функций и оценок градиента, безусловно, отключено на один .
Так что в SciPy для BFGS определенно есть ошибка в отчете о статистике.
Я также подозреваю, что внутри SciPy есть неэффективность, которая будет иметь следующий характер. Перед циклом итерации оцените функцию и ее градиент. Затем запустите цикл и начните с оценки функции и ее градиента. Это добавило бы дополнительную оценку функции для 0-й итерации и, конечно, этого можно избежать путем небольшой реорганизации кода (возможно, с некоторым компромиссом по сравнению с читаемостью алгоритма).
Уместно следующее:
Не будучи экспертом в SciPy, я бы сказал, что либо старая ошибка обнаружена из ниоткуда (о ней следует сообщать), либо она никогда не была исправлена, несмотря на то, что я понял из обсуждений на GitHub.