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.

Solución temporal para limitar la longitud máxima de las ecuaciones en APmonitor.

Estoy usando GEKKO para encontrar los coeficientes de Fourier 2D de una función desconocida u expandida en términos de vectores 2D g. Para lograr esto, he establecido diccionarios y necesito calcular muchos términos de la forma:

u{ u_fourier_i_j: [m.Var(),m.Var()] ....}
g{ g_i_j : [gx_i_j, gy_i_j].....}
m.Minimize(m.cos(sup.function()))

donde sup.función se define como:

dummy = 0
for i in fourier_x:
for j in fourier_y:
dummy += u_fourier_i_j * np.cos(np.dot(g_i_j,[x,y]))
return dummy

Ahora me gustaría usar muchos coeficientes de Fourier, pero Gekko me da el error:

APM model error: string > 15000 characters
Considere dividir la línea en varias ecuaciones

El problema también puede deberse a que solo se usa el carácter de nueva línea CR en lugar de CR LF (para Windows) o LF (para MacOS / Linux) para solucionar este problema, guarde el archivo APM con los caracteres de nueva línea apropiados.

¿Existe una forma de aumentar el tamaño máximo de cadena en el modelo APM o una forma de evitar este error en su totalidad estructurando el programa de manera diferente? Los recursos computacionales no deberían ser un problema.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de aumentar el tamaño máximo de cadena en el modelo APM estableciendo la opción apm.max_chars en un valor más alto. Por ejemplo, puedes agregar la siguiente línea antes de configurar tu modelo GEKKO:

    from gekko import APM
    APM(remote=False, max_chars=50000)  # establécelo en 50000
    

    Como alternativa, puedes dividir la larga ecuación en múltiples ecuaciones más pequeñas para evitar un error. Por ejemplo, puedes definir una ecuación separada para cada término u_fourier_i_j:

    eqns = [m.cos(np.dot(g_i_j, [x, y])) * u_fourier_i_j[0] for u_fourier_i_j in u.values()]
    eqns += [m.cos(np.dot(g_i_j, [x, y])) * u_fourier_i_j[1] for u_fourier_i_j in u.values()]
    m.Minimize(sum(eqns))
    

    Esto creará 2 * len(u) ecuaciones, pero cada ecuación será más corta y más fácil de manejar para GEKKO.

Comments are closed.