scipy.minimize con dos ecuaciones devuelve solo los valores iniciales.
Me gustaría obtener una solución óptima para el siguiente conjunto de ecuaciones:
xw * 1010 + xm * dm = 1017
xw + xm = 1
Mi código es el siguiente:
from scipy.optimize import minimize
import numpy as np
def f1(p):
x_w, x_m, d_m = p
return (x_w*1010 + x_m*d_m) - 1017.7
def f2(p):
x_w, x_m, d_m = p
return x_w + x_m - 1
bounds =[(0,1), (0,1), (1000, 10000)]
x0 = np.array([0.5, 0.5, 1500])
res = minimize(lambda p: f1(p)+f2(p), x0=x0, bounds=bounds)
Sin embargo, todo lo que obtengo de vuelta (res.x) son los valores iniciales (x0).
¿Cómo puedo hacer que funcione? ¿Existe un mejor enfoque? Solo hay estas dos ecuaciones para las tres variables.
davy.ai
Un enfoque para resolver este problema es utilizar el método de los multiplicadores de Lagrange. Este método permite optimizar una función sujeta a restricciones. En este caso, la función a optimizar es:
f(x) = x_w * 1010 + x_m * d_m
Y la restricción es:
g(x) = x_w + x_m – 1 = 0
La función lagrangiana es:
L(x, λ) = f(x) – λ * g(x)
donde λ es el multiplicador de Lagrange. El problema de optimización se resuelve encontrando los valores de x y λ que minimizan la función lagrangiana.
En Python, esto se puede hacer con el siguiente código:
Aquí, definimos la función lagrangiana que toma un vector de tres parámetros (x_w, x_m y λ) y devuelve el valor de la función lagrangiana. También definimos los límites para x_w y x_m, y establecemos los valores iniciales para cada parámetro. Luego utilizamos la función
minimize
para encontrar los valores de los parámetros que minimizan la función lagrangiana, sujetos a los límites dados.Al ejecutar este código, debería devolver la solución óptima para x_w y x_m, así como el valor de la función lagrangiana en la solución óptima:
En este caso, la solución óptima es x_w = 0.429 y x_m = 0.571, con un valor de la función lagrangiana de -6.0. Observa que la solución óptima cumple con la restricción x_w + x_m = 1.