2011-01-12 44 views
3

我正在嘗試做一些數值計算,並且難以確定解決問題和尋找反饋的合適方法。關於優化的建議例程/限制條件使用

到目前爲止,我已經完成了Mathematica的所有工作,但是我相信現在已經到了需要對算法進行更多控制的時候了。

我不能發佈圖片,所以這裏是link他們 其中H是heaviside stepfunciton。 C(k)只是C(r)m=4的金融時報。 N在我的情況是2000所以你可以看到歐米茄是大量指數的總和。 rho只是densitiy。您可以看到C(r),因爲m=4針對不同的a係數。 IRISM最終是a係數的函數。

我有這三個方程正常工作我認爲在Mathematica內,但我想盡量減少IRISM並找到4 a值。我遇到的問題是,由於顯而易見的原因,當積分中的記錄等於零時會出現不連續性。我似乎無法找到修改Mathematica算法的方法(它們是黑匣子就是正確的術語?),以便檢查試驗值a。我正在使用Nelder-Meade和差異進化並嘗試不同的約束條件。然而,我似乎只得到想象的結果,顯然來自負Log,或者如果我受到足夠的限制,以避免顯然只有局部最小值,因爲我的結果與「正確」結果不匹配。我嘗試了幾次使用漸變的最小化算法,但是我沒有太多的運氣。

我認爲我最好的辦法是從頭開始寫一個最小化例程,或者修改其他代碼,以便在集成之前檢查IRISM以獲得不連續性。我已經閱讀了一些關於懲罰函數,對數邏輯等的內容,但是對編程有點新意,希望有人能夠讓我知道一個好的方法是從什麼時候開始的。我覺得比任何事情都要好得多,我發現很難知道從哪裏開始。

編輯:這裏是原始輸入。如果我需要以其他方式發佈,請告訴我。

OverHat[c][a1_, a2_, a3_, a4_, k_] := (a1*(4*Pi*(Sin[k] - k*Cos[k])))/k^3 + 
    (a2*(4*Pi*(k*Sin[k] + 2*Cos[k] - 2)))/k^4 + 
    (a3*(8*Pi*(2*k - 3*Sin[k] + k*Cos[k])))/k^5 + 
    (a4*(-(24*Pi*(k^2 + k*Sin[k] + 4*Cos[k] - 4))))/k^6 

Subscript[OverHat[\[Omega]], \[Alpha]\[Gamma]][k_, \[Alpha]\[Gamma]_, n_] := 
    Exp[(-k^2)*\[Alpha]\[Gamma]*((n - \[Alpha]\[Gamma])/(6*n))] 

OverHat[\[Omega]][k_] := Sum[Subscript[OverHat[\[Omega]], \[Alpha]\[Gamma]][k, \[Alpha]\[Gamma], n], 
    {\[Alpha]\[Gamma], 1, n}] /. n -> 2000 

IRISM[a1_, a2_, a3_, a4_, \[Rho]_, kmax_] := 
    \[Rho]^2*(1/15)*(20*a1 - 5*a2 + 2*a3 - a4)*Pi - 
    (1/(8*Pi^3))*NIntegrate[(\[Rho]*OverHat[\[Omega]][k]*OverHat[c][a1, a2, a3, a4, k] + 
     Log[1 - \[Rho]*OverHat[\[Omega]][k]*OverHat[c][a1, a2, a3, a4, k]])*4*Pi*k^2, 
    {k, 0, kmax}, WorkingPrecision -> 80] 

NMinimize[IRISM[a1, a2, a3, a4, 0.9, 30], {a1, a2, a3, a4}, 
    Method -> "DifferentialEvolution"] 
+0

您可以發佈您的Mma代碼。我添加了Mma標籤,以便這裏的Mma社區可以幫助您。 – 2011-01-12 20:06:47

+0

我已經添加了Mathematica代碼。我正在使用80的工作精度,以避免k值小的k^6產生的數值噪聲。我正在尋找一種方法來以這種方式發佈「正確」的答案。這是一張來自舊報紙的圖表,我用DataThief進行了轉換。我相信這個代碼可以大大提高。我想我可能會降低精度和精度目標,並可能嘗試內插omegahat函數,因爲它是2000年指數的總和。但這只是一些想法。 – user573214 2011-01-13 01:30:23

回答

1

Mathematica的FindMinimum如果它看到一個虛數,就會中止。即使您的目標在約束條件內是實值,也會發生這種情況,因爲默認的Barrier方法是因爲它的準確性控制不佳,偶爾會超出邊界。最簡單的方法是將你的目標包裹在Re之內。如果您發佈完整的代碼,您可能會得到更好的答案

一些普遍性的建議:

它很容易嘗試簡化您的目標的數學比重新實現優化算法。原因是一個算法失敗通常意味着這是一個難題,其他算法也會失敗。

我曾經有一個問題,即FindMinimum給予警告,並沒有收斂糾正最低,這點我可以分析判斷,它的發生與不同的方法,這是有道理的,當我繪製的目標表面,下面

http://yaroslavvb.com/upload/save/so-plateau.png

在這種情況下,您可以看到問題在最低限度情況下非常嚴重(幾乎是高原),最低限度難以本地化。

當你有不平等約束時,默認方法是Barrier方法,這是昂貴的,並提供較差的精度控制。非常低效的做法是將等式約束指定爲不等式對,即代替a=b,具有a>=ba<=b。這可能會慢3-10倍,而且在數值上更差 - 在結果中,a和b可能只是大致相等。

理想情況下,目標是獲得一個凸的問題,不存在任何不等式約束條件且條件良好。