1

我試圖用一些線性約束來最小化四個變量的非線性函數。 Mathematica 8無法找到一個好的解決方案,在迭代的某個時間點給出函數的複數值。這意味着在這個過程中沒有啓用一個或一些限制條件。這是優化功能的缺陷還是限制?一些線性約束在函數NMinimize中用Mathematica 8似乎被忽略

函數以最小化是

ff[lxw_, lwz_, c_, d_] := - J1 (lxw + lwz) - 2 J2 c + 
T (-Log[2] - 1/2 (1 - lxw) Log[(1 - lxw)/4] - 
1/2 (1 + lxw) Log[(1 + lxw)/4] - 
1/2 (1 - lwz) Log[(1 - lwz)/4] - 
1/2 (1 + lwz) Log[(1 + lwz)/4] + 1/2 (1 - d) Log[(1 - d)/16] + 
1/8 (1 + 2 c + d - 2 lwz - 2 lxw) Log[ 
    1/16 (1 + 2 c + d - 2 lwz - 2 lxw)]) 

其中

T = 10; 
J1 = 1; 
J2 = -0.2; 

是恆定參數。然後我嘗試

NMinimize[{ff[lxw, lwz, c, d], 
2 c + d - 2 lwz - 2 lxw >= -0.999 && 
-0.999 <= lxw <= 0.999 && 
-0.999 <= lwz <= 0.999 && 
-0.999 <= c <= 0.999 && 
     d <= 0.9999}, {lxw, lwz, c, d}] 

其結果

NMinimize :: nrnum:「功能值5.87777 [VeryThinSpace] -4.87764 \我的\ n 不在{C,d爲實數, LWZ,長x寬} = {-0.718817,-1.28595,0.69171,-0.932461}

我將不勝感激,如果有人能夠給在這裏發生了什麼暗示

回答

0

試試這個:

Clear[ff]; 
    ff[lxw_, lwz_, c_, d_] /; 2 c + d - 2 lwz - 2 lxw >= -0.999 := 
    < your function def > 

這將導致該函數未被評估的情況,以防NMinimize使得偏移超出界限。對不起,我不能在這裏測試這個..如果那不試試請詢問mathematica.stackexchange.com

另外,爲什麼用< = .999而不是簡單的< 1? 它,如果你解決這個問題太(使用整數1,而不是1)

0

的警告出現,因爲在ff警告中的最後一項給出的值是複雜的,由於採取的日誌可能只是幫助負數,即

{c, d, lwz, lxw} = { 
    -0.7188174745559741`, 
    -1.2859482844800894`, 
    0.6917100913968041`, 
    -0.9324611085040573`}; 

Log[1/16 (1 + 2 c + d - 2 lwz - 2 lxw)] 

-2.5558 + 3.14159我

1/16 (1 + 2 c + d - 2 lwz - 2 lxw) 

-0.0776301

數學 9的結果被除了警告產生: -

{-4.90045, {c -> 0.94425, d -> -0.315633, lwz -> 0.900231, lxw -> -0.191476}} 

{c, d, lwz, lxw} = { 
    0.9442497691706085`, 
    -0.31563295950647885`, 
    0.900230825707721`, 
    -0.1914760216875171`}; 

ff[lxw, lwz, c, d] 

-4.90045

+0

謝謝@george和克里斯的幫助。第一項提案沒有奏效。我仍然不知道爲什麼算法似乎超出界限,但在[(http://mathematica.stackexchange)中提出了令人滿意的解決方法。com/questions/42999/nimimize-out-of-bounds-on-some-linear-constraints)] Daniel Lichtblau。 – danielstariolo

+0

@danielstariolo - 感謝您的後續信息。 –