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.

GEKKO: Tamaño del array como una variable del modelo

Soy bastante nuevo en Gekko. ¿Es posible variar el tamaño de una matriz de modelo como parte de una optimización? Estoy ejecutando un problema simple donde varios números de resortes torsionales se enganchan en diferentes ángulos, y me gustaría permitir que el modelo cambie el número de ángulos de enganche. Cada resorte tiene varias variables de componente, que también estoy intentando definir como matrices de variables. Sin embargo, la definición de tamaño de la matriz thetaengage, a continuación, no ha aceptado int(nengage.value). Obtengo el siguiente error:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'GK_Value'

Código relevante:

n_engage = m.Var(2, lb=1, ub=10, integer=True)

theta<em>engage = m.Array(m.Var, (int(n</em>engage.value)))
theta<em>engage[0].value = 0.0
theta</em>engage[0].lower = 0.0
theta<em>engage[0].upper = 85.0
theta</em>engage[1].value = 15.0
theta<em>engage[1].lower = 0.0
theta</em>engage[1].upper = 85.0

Si intento definir el tamaño de thetaengage únicamente mediante nengage.value, obtengo este error:

TypeError: expected sequence object with len >= 0 or a single integer

Supongo que podría definir la matriz en el tamaño máximo que estoy dispuesto a aceptar y permitir que el número de resortes tenga un límite inferior de 0, pero tendría que hacer cumplir un número mínimo de resortes totales de alguna manera en las restricciones. Si Gekko es capaz de variar el tamaño de las matrices de esta manera, me parece la solución más elegante.

Cualquier ayuda es muy apreciada.

Tags:  

Answer

  1. Avatar for davy.ai

    Sí, es posible variar el tamaño de un arreglo de modelos como parte de una optimización en Gekko. Sin embargo, el problema con el código proporcionado es que int(n_engage.value) es un objeto GK_Value y no un entero, lo que resulta en TypeError.

    Para dimensionar dinámicamente un arreglo basado en una variable, puedes usar la función m.Array() sin proporcionar el argumento de tamaño. Luego, puedes redimensionar el arreglo usando la función m.resize() dentro del modelo Gekko.

    Aquí tienes un código actualizado que debería funcionar:

    n_engage = m.Var(2, lb=1, ub=10, integer=True)
    
    theta_engage = m.Array(m.Var)
    theta_engage.resize(int(n_engage.value))
    
    for i in range(int(n_engage.value)):
        theta_engage[i].value = 0.0
        theta_engage[i].lower = 0.0
        theta_engage[i].upper = 85.0
    

    Este código creará un arreglo de variables theta_engage con un tamaño que coincida con el valor de n_engage. Para redimensionar el arreglo, puedes llamar a theta_engage.resize(nuevo_tamaño) en cualquier parte del modelo Gekko para cambiar el tamaño del arreglo.

    También ten en cuenta que puedes usar theta_engage.shape para obtener el tamaño actual del arreglo.

    ¡Espero que esto te ayude!

Comments are closed.