Hola a todos,
Estoy intentando utilizar la función de minimizar en JSL para obtener los valores de dos (o más) variables que minimizan el error cuadrático medio de un modelo grande. No puedo lograr que converja aunque sé a qué valor debería converger (por prueba y error).
La sintaxis básica que utilicé es:
minfun = Minimize( min_test, {kD( 0.4, 0.8 ), wshc( 0.1, 1.5 )}, <<DETAILS></DETAILS>He probado diferentes mensajes pero no cambian nada.
El objetivo aquí es encontrar los valores de kD y wshc minimizando la expresión min_test que es en sí misma una secuencia de expresiones evaluadas como en
min_test = Expr(
Eval( light );
Eval( parafile );
Eval( runprg );
Eval( reshandling2 );
Eval( SSE2 );
);
Los valores alterados de kD y wshc modifican las expresiones "light" y "parafile" que luego ejecuta un programa ejecutable (en la expresión runprg) cuyos resultados se manipulan y del cual el error cuadrático medio (MSE) es lo último que se evaluado en la expresión SSE2. Para contextualizar, la expresión "runprg" envía múltiples archivos creados a un ejecutable independiente que simula la evolución térmica de los lagos. Cada paso en la expresión "runprg" requiere entre 10 y 20 segundos de cálculo, cuyos resultados se reingieren en JSL para calcular el MSE.
El proceso en sí parece funcionar correctamente porque lee correctamente el valor de la función objetivo en cada paso y parece pasar los valores de los parámetros correctamente a la expresión. El problema es que el algoritmo "mueve" los parámetros kD y wshc tan ligeramente (sólo en el quinto decimal) en relación con los valores iniciales que les he dado que no logra converger. Por ejemplo, si empiezo con valores iniciales de 0,8 y 0,5, respectivamente, normalmente obtendré algo como
0,8
0.49999945654133
en la siguiente iteración y por lo tanto no afecta significativamente el MSE resultante. Con los límites de parámetros que he proporcionado en la función de minimizar, hay mucho espacio para que se muevan los parámetros. Entiendo que mi caso dista bastante de la típica función diferenciable simple. Sin embargo, al ejecutar "manualmente" el programa con diferentes valores de parámetros, sé que la función objetivo es bastante convexa con respecto a los parámetros y pensé que la función de minimización funcionaría bien, especialmente usando el mensaje <
¿Alguna sugerencia de solución alternativa que pueda ayudar en esta situación?
Muchas gracias de antemano, Yves.