slsqp - scipy.optimize python
Estructura de los insumos para minimizar la función. (1)
He heredado un código que intenta minimizar una función usando scipy.optimize.minimize
. Tengo problemas para entender algunos de los aportes a los argumentos de fun
y jac
La llamada a minimizar se ve algo como esto:
result = minimize(func, jac=jac_func, args=(D_neg, D, C), method = ''TNC'' ...other arguments)
func
parece a la siguiente:
def func(G, D_neg, D, C):
#do stuff
jac_func
tiene la siguiente estructura:
def jac_func(G, D_neg, D, C):
#do stuff
Lo que no entiendo es de dónde viene la entrada G a func
y jac_func
. ¿Está eso especificado de alguna manera en la función de minimize
, o por el hecho de que el method
está especificado como TNC
? Intenté investigar la estructura de esta función de optimización, pero tengo problemas para encontrar la respuesta que necesito. Cualquier ayuda es muy apreciada
La respuesta corta es que G
es mantenido por el optimizador como parte del proceso de minimización, mientras que los (D_neg, D, and C)
se pasan como están desde la tupla de args
.
De forma predeterminada, scipy.optimize.minimize
toma una función fun(x)
que acepta un argumento x
(que podría ser una matriz o similar) y devuelve un escalar. scipy.optimize.minimize
luego encuentra un valor de argumento xp
tal que fun(xp)
es menos fun(x)
para otros valores de x
. El optimizador es responsable de crear valores de x
y pasarlos a la fun
para su evaluación.
Pero, ¿qué sucede si tiene una función fun(x, y)
que tiene algún parámetro adicional y
que debe pasarse por separado (pero se considera una constante a los efectos de la optimización)? Esto es para lo que es la tupla de args
. La documentation intenta explicar cómo se usa la tupla args, pero puede ser un poco difícil de analizar:
Args: tuple, opcional
Argumentos extra pasados a la función objetivo y sus derivados (jacobiano, hessiano).
Efectivamente, scipy.optimize.minimize
pasará todo lo que esté en args
como el resto de los argumentos para fun
, usando la notación de argumentos de asterisco: la función se llama como fun(x, *args)
durante la optimización. El optimizador pasa la parte x
, y la tupla args
se presenta como los argumentos restantes.
Por lo tanto, en su código, el optimizador mantiene el valor del elemento G
mientras evalúa los valores posibles de G
, y la (D_neg, D, C)
se pasa como está.