我正在嘗試做一些數值計算,並且難以確定解決問題和尋找反饋的合適方法。關於優化的建議例程/限制條件使用
到目前爲止,我已經完成了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"]
您可以發佈您的Mma代碼。我添加了Mma標籤,以便這裏的Mma社區可以幫助您。 – 2011-01-12 20:06:47
我已經添加了Mathematica代碼。我正在使用80的工作精度,以避免k值小的k^6產生的數值噪聲。我正在尋找一種方法來以這種方式發佈「正確」的答案。這是一張來自舊報紙的圖表,我用DataThief進行了轉換。我相信這個代碼可以大大提高。我想我可能會降低精度和精度目標,並可能嘗試內插omegahat函數,因爲它是2000年指數的總和。但這只是一些想法。 – user573214 2011-01-13 01:30:23