やあみんな、
JSL の minimum 関数を使用して、大規模なモデルの誤差平均二乗を最小化する 2 つ (またはそれ以上) の変数の値を取得しようとしています。 どの値に収束すべきかはわかっているのに、収束させることができません(試行錯誤)。
私が使用した基本的な構文は次のとおりです。
minfun = Minimize( min_test, {kD( 0.4, 0.8 ), wshc( 0.1, 1.5 )}, <<DETAILS></DETAILS>さまざまなメッセージを試しましたが、何も変わりません。
ここでの目標は、式 min_test を最小化する kD と wshc の値を見つけることです。式 min_test は、次のように評価された式のシーケンスです。
min_test = Expr(
Eval( light );
Eval( parafile );
Eval( runprg );
Eval( reshandling2 );
Eval( SSE2 );
);
変更された kD 値と wshc 値は、「light」式と「parafile」式を変更します。これにより、(runprg 式内で) プログラム実行可能ファイルが実行され、その結果が操作され、そこから平均二乗誤差 (MSE) が最終的に計算されます。 SSE2 式で評価されます。 コンテキストとして、「runprg」式は、湖の熱進化をシミュレートするスタンドアロンの実行可能ファイルに作成された複数のファイルを送信します。 「runprg」式の各パスには約 10 ~ 20 秒の計算が必要で、その結果は MSE を計算するために JSL に再取り込まれます。
プロセス自体は、各ステップで目的関数の値を正しく読み取り、パラメーターの値を式に正しく渡すため、正しく動作しているようです。 問題は、アルゴリズムが kD パラメーターと wshc パラメーターを、与えた初期値に対してわずかに (小数点第 5 位のみ) 移動させるため、収束しないことです。 たとえば、それぞれ 0.8 と 0.5 の初期値から始めると、通常は次のような結果が得られます。
0.8
0.49999945654133
次の反復で実行されるため、結果として生じる MSE には大きな影響はありません。 minimum 関数でパラメータの範囲を指定すると、パラメータを移動するための十分なスペースが確保されます。 私の場合は、典型的な単純な微分可能関数とはかなりかけ離れていることを理解しています。 ただし、異なるパラメーター値を使用してプログラムを「手動で」実行すると、目的関数がパラメーターに関してかなり凸であることがわかり、特に <
この状況で役立つ可能性のある回避策の提案はありますか?
よろしくお願いします、イヴ