2011-10-17 77 views
2

我試過使用NMinimize函數來查找以下函數的全局最小值。NMheimize Mathematica函數

f = {s1 - Log[1000/{Norm[{2.83, 0, 2} - {u, v, w}]}^3]}^2 + {s2 - 
     Log[1000/{Norm[{0, 2.83, -2} - {u, v, w}]}^3]}^2 + {s3 - 
     Log[1000/{Norm[{-2.83, 0, 2} - {u, v, w}]}^3]}^2 + {s4 - 
     Log[1000/{Norm[{0, -2.83, -2} - {u, v, w}]}^3]}^2; 
NMinimize[f, {u, v, w}, Method -> {"DifferentialEvolution"}]. 

優化是一個無約束的優化。以下是我每次運行它時遇到的錯誤。

「NMinimize :: nnum道: 「函數值{{2.67476}}不是數字在 {U,V,W} = {} 0.673558,0.659492,0.0861047」

我我不知道哪裏出了問題,還有一種方法可以設置停止規則,並在出現這種錯誤時從NMinimize輸出中提取值 請幫我調試此代碼 謝謝提前尋求幫助 Kum。

+0

@rcollyer - 你真的進入了語法高亮,我看到:) – Verbeia

+0

@Verbeia,我圖如果我正在編輯它,我可能會讓它更具可讀性。這並不完美,但它足夠有效。 – rcollyer

回答

5

大括號表示在Mathem atica,所以你的函數輸出一個單元矩陣,而不是標量。更改您正用於分組爲正常括號的{}對。你得到雙花括號的事實表明,有兩個級別的大括號​​來轉換。

f = (s1 - Log[1000./(Norm[{2.83, 0, 2} - {u, v, w}])^3])^2 + (s2 - 
     Log[1000./(Norm[{0, 2.83, -2} - {u, v, w}])^3])^2 + (s3 - 
     Log[1000./(Norm[{-2.83, 0, 2} - {u, v, w}])^3])^2 + (s4 - 
     Log[1000./(Norm[{0, -2.83, -2} - {u, v, w}])^3])^2; 

作爲進一步的備註,我會改變Integer值(1000)成實數(1000.)中,由於輸入的其餘部分在機器精度實數。正如Brett在評論中提醒我的那樣,輸出結果不會有任何不同,但是如果您正在進行大量重複的計算,您可能會注意到性能提升很小,如果您想進一步更方便地使用Compile函數性能改進。

(當我意識到這是一個1 * 1矩陣輸出,而不是一個矢量輸出編者)

+3

'1000'與'1000.'在這裏不應該有任何區別 - 無論如何它們都會被強制爲機器精度。 –

+1

@BrettChampion - 你說得很對,輸出結果是一樣的,但是會有一個小的性能加速,這就是我的意思,但是設法離開了編輯。我會在答案中更清楚一點。 – Verbeia

+2

使用'1000.'而不是'1000'在我的機器上加速了0.2%(使用s1,s2,s3,s4的隨機值)。而如果我使用'h = Simplify [f ,元素[u | v | w,Reals]]'擺脫規範和相關的絕對值(即擺脫了......) –