Да, вызов любого из fmin_bfgs fmin_cg fmin_powell
как
fmin_xx( func, x0, fprime=None, epsilon=.001 ... )
оценивает градиент на x
на (func( x + epsilon I ) - func(x)) / epsilon
.
Что «лучше» для вашего приложения, хотя сильно зависит отнасколько гладкая ваша функция и сколько переменных.
Обычный Nelder-Mead, fmin
, хороший выбор - медленно, но верно;к сожалению, скучный Nelder-Mead начинается с симплекса фиксированного размера, .05 / .00025 независимо от масштаба x.
Я слышал, что fmin_tnc
в scipy.optimize.tnc
- это хорошо:
fmin_tnc( func, x0, approx_grad=True, epsilon=.001 ... ) or
fmin_tnc( func_and_grad, x0 ... ) # func, your own estimated gradient
(fmin_tnc - это ~ fmin_ncg со связанными ограничениями, приятные сообщения о том, что происходит, несколько иные аргументы.)