大家好,
我嘗試使用 JSL 中的最小化函數來獲取兩個(或更多)變數的值,以最小化大型模型的誤差均方。 即使我知道它應該收斂到哪個值(透過反覆試驗),我也無法讓它收斂。
我使用的基本語法是:
minfun = Minimize( min_test, {kD( 0.4, 0.8 ), wshc( 0.1, 1.5 )}, <<DETAILS></DETAILS>我嘗試過不同的訊息,但它們沒有改變任何東西。
這裡的目標是找到 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 秒的計算,其結果會重新引入 JSL 中以計算 MSE。
這個過程本身似乎工作正常,因為它在每一步都正確讀取目標函數值,並且似乎將參數值正確傳遞給表達式。 問題在於,該演算法相對於我給定的初始值,對 kD 和 wshc 參數的「移動」幅度非常小(僅小數點後第五位),以至於無法收斂。 例如,如果我分別從 0.8 和 0.5 的初始值開始,我通常會得到類似的結果
0.8
0.49999945654133
在下一次迭代中,因此不會顯著影響生成的 MSE。 根據我在最小化函數中給出的參數界限,參數有足夠的移動空間。 我知道我的情況與典型的簡單可微函數相差甚遠。 然而,透過「手動」運行具有不同參數值的程序,我知道目標函數相對於參數來說非常凸,因此認為最小化函數可以正常工作,特別是使用 <
在這種情況下有什麼建議可以幫助解決問題嗎?
預先非常感謝,伊夫