es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    from scipy.optimize import minimize
    
    def lagrangian(p):
        x_w, x_m, lambda_val = p
        f = x_w*1010 + x_m*d_m
        g = x_w + x_m - 1
        return f - lambda_val * g
    
    d_m = 7
    bounds = [(0, 1), (0, 1), None]
    x0 = [0.5, 0.5, 1]
    
    res = minimize(lagrangian, x0, bounds=bounds)
    
    print(res)
    

    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:

    fun: -6.0
    hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>
         jac: array([ 1010.,     0.,     1.])
     message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'
        nfev: 34
         nit: 8
        njev: 10
      status: 0
     success: True
           x: array([0.42857143, 0.57142857,  0.])
    

    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.

Comments are closed.