Hallo allerseits,
Ich versuche, die Minimierungsfunktion in JSL zu verwenden, um die Werte von zwei (oder mehr) Variablen zu erhalten, die den mittleren Fehlerquadrat eines großen Modells minimieren. Ich kann es nicht zur Konvergenz bringen, obwohl ich weiß, zu welchem Wert es konvergieren soll (durch Versuch und Irrtum).
Die grundlegende Syntax, die ich verwendet habe, ist:
minfun = Minimize( min_test, {kD( 0.4, 0.8 ), wshc( 0.1, 1.5 )}, <<DETAILS></DETAILS>Ich habe verschiedene Nachrichten ausprobiert, aber sie ändern nichts.
Das Ziel hier besteht darin, die Werte von kD und wshc zu finden und den Ausdruck min_test zu minimieren, der selbst eine Folge ausgewerteter Ausdrücke wie in ist
min_test = Expr(
Eval( light );
Eval( parafile );
Eval( runprg );
Eval( reshandling2 );
Eval( SSE2 );
);
Die geänderten kD- und wshc-Werte ändern die Ausdrücke „light“ und „parafile“, die dann eine ausführbare Programmdatei (im runprg-Ausdruck) ausführen, deren Ergebnisse manipuliert werden und von der der mittlere quadratische Fehler (MSE) als letztes abhängt im SSE2-Ausdruck ausgewertet. Für den Kontext übermittelt der Ausdruck „runprg“ mehrere erstellte Dateien an eine eigenständige ausführbare Datei, die die thermische Entwicklung von Seen simuliert. Jeder Durchlauf des „runprg“-Ausdrucks erfordert etwa 10–20 Sekunden Rechenzeit, deren Ergebnisse wieder in JSL eingelesen werden, um den MSE zu berechnen.
Der Prozess selbst scheint insofern korrekt zu funktionieren, als er den Zielfunktionswert bei jedem Schritt korrekt liest und die Werte der Parameter korrekt an den Ausdruck zu übergeben scheint. Das Problem besteht darin, dass der Algorithmus die kD- und wshc-Parameter so geringfügig (nur in der 5. Dezimalstelle) relativ zu den Anfangswerten, die ich ihnen gegeben habe, „verschiebt“, dass die Konvergenz fehlschlägt. Wenn ich beispielsweise mit Anfangswerten von 0,8 bzw. 0,5 beginne, erhalte ich normalerweise etwas wie „
0,8
0,49999945654133
bei der nächsten Iteration und hat daher keinen wesentlichen Einfluss auf die resultierende MSE. Mit den Parametergrenzen, die ich in der Minimierungsfunktion angegeben habe, gibt es viel Platz zum Verschieben der Parameter. Ich verstehe, dass mein Fall ziemlich weit von der typischen einfachen differenzierbaren Funktion entfernt ist. Durch die „manuelle“ Ausführung des Programms mit unterschiedlichen Parameterwerten weiß ich jedoch, dass die Zielfunktion in Bezug auf die Parameter ziemlich konvex ist, und dachte daher, dass die Minimierungsfunktion gut funktionieren würde, insbesondere bei Verwendung der <
Irgendwelche Vorschläge für eine Problemumgehung, die in dieser Situation hilfreich sein könnten?
Vielen Dank im Voraus, Yves