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.

Optimización dinámica de GEKKO con variable retrasada en el objetivo.

Estoy tratando de optimizar la siguiente función objetivo utilizando GEKKO:

Objetivo = sum[(Y(t)/Y(t-1)) – G(t)]^2

donde la función objetivo se suma en el tiempo t = 0 a 10.
Y(t) es la variable de elección/control en el período de tiempo t y G(t) es el valor dado para cada período de tiempo t. Las restricciones son: (1) Y(0) = 5.64 (2) Y(10)= 3.

Soy muy nuevo en la optimización en python. Y el siguiente código probablemente tenga muchos errores. ¿Alguien puede ayudarme, por favor? Gracias.

python

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos errores en el código de Python proporcionado. Consulte el código corregido a continuación con anotaciones que explican las correcciones:

    # Problema 2
    
    from gekko import GEKKO
    import numpy as np
    
    # inicializar modelo
    m = GEKKO()
    
    # puntos de tiempo (digamos que tenemos 10 puntos de tiempo)
    nt = 11  # Hay 11 puntos de tiempo de 0 a 10 inclusive
    m.time = np.linspace(0, 1, nt)
    
    # variables (el valor inicial de y en t=0 se da como 5.64)
    y_init = np.array([5.64] * nt)
    yo = [m.Var(value=y_init[i]) for i in range(nt)]
    
    # parámetro
    g_init = np.array([-0.025751073, -0.026431718, -0.027149321, -0.025581395,
                       -0.026252983, -0.022058824, -0.020050125, -0.015345269,
                       -0.015584416, -0.01055409])
    g = [m.Param(value=g_init[i]) for i in range(nt)]
    
    # ecuaciones
    a1 = 5.64
    a2 = 3.0  # La descripción del problema dice que Y(10) = 3, no 3.1
    m.Equation(yo[0] == a1)
    m.Equation(yo[nt - 1] == a2)  #Utilice nt - 1 en lugar de 9
    
    # función objetivo
    t = m.Param(m.time)  # Agregue un parámetro para el tiempo
    m.Obj(sum(((yo[i] / yo[i - 1]) - g[i]) ** 2 for i in range(1, nt)))  # Utilice range(1, nt ) para excluir i=0
    
    # establecer opciones globales
    m.options.IMODE = 6
    m.solve(disp=True)
    

    Explicación de los cambios:

    • La variable nt se establece en 11 para incluir el punto de tiempo en t = 10.
    • Se agrega un parámetro t para el tiempo usando m.Param(m.time) para su uso en la función objetivo.
    • La función range se modifica para excluir el índice i=0 en la función objetivo.
    • El punto de tiempo final se indexa como yo[nt - 1] en lugar de yo[9].
    • El valor Y en t=10 se corrige a 3 en lugar de 3.1.

Comments are closed.