2011-09-10 30 views
12

說我有一個瘋狂的功能,f,像這樣定義的:NMinimize似乎是裂紋

util[x_, y_, c_] := 0.5*Log[c-x] + 0.5*Log[c-y] 
cost[x_, y_, l_] := c /. First[NSolve[util[x, y, c+l] == Log[10+l], c]] 
prof[x_, y_] := 0.01*Norm[{x,y}, 2] 
liquid[x_, y_] := 0.01*Norm[{x,y}, 2] 
f[x_, y_, a_, b_] := cost[a, b, liquid[x,y] + liquid[a-x, b-y]] - Max[a,b] 
     - cost[0,0,0] + prof[x,y] + liquid[x,y] + prof[a-x, b-y] + liquid[a-x, b-y] 

現在我打電話NMinimize這樣的:

NMinimize[{f[50, 50, k, j], k >= 49, k <= 51, j >= 49, j <= 51}, {j, k}] 

,它告訴我:

{-21.0465, {j -> 51., k -> 49.}} 

但是,如果我真的檢查什麼f[50,50,49,51]是,它是這樣的:

0.489033 

這與NMinimize說的-21.0465有很大的不同。 這與NMinimize的課程是否相同? 浮點錯誤複合或什麼? 任何打算NMinimize(或某些此類功能)提交的想法?

+4

+1爲標題 – Verbeia

回答

17

它似乎與您的函數f不僅限於數值參數相關,而且還與NMinimize執行的符號預處理有關。一旦您將簽名更改爲

f[x_?NumericQ, y_?NumericQ, a_?NumericQ, b_?NumericQ]:=... 

結果與預期的一樣,但需要相當長的時間才能得到它。

編輯

我們可以深入挖掘,揭示的真正原因。首先,請注意您的f(原單,ARGS無限制)是一個相當功能:

In[1423]:= f[50,50,49.,51.] 
Out[1423]= 0.489033 

In[1392]:= f[50,50,k,j]/.{j->51.`,k->49.`} 
Out[1392]= -21.0465 

真正的罪魁禍首是NSolve,這給兩個有序的解決方案

In[1398]:= NSolve[util[x,y,c+l]==Log[10+l],c] 
Out[1398]= {{c->0.5 (-2. l+1. x+1. y-2. Sqrt[100.+20. l+1. l^2+0.25 x^2-0.5 x y+0.25 y^2])}, 
{c->0.5 (-2. l+1. x+1. y+2. Sqrt[100.+20. l+1. l^2+0.25 x^2-0.5 x y+0.25 y^2])}} 

的問題是,什麼是排序。對於NSolve的符號和數字參數會變得不同,因爲在後一種情況下,我們周圍沒有任何符號。這可以被看作:

In[1399]:= 
Block[{cost}, 
    cost[x_,y_,l_]:=c/.Last[NSolve[util[x,y,c+l]==Log[10+l],c]]; 
    f[50,50,k,j]/.{j->51.,k->49.}] 

Out[1399]= 0.489033 

所以你真的必須解決什麼是你正確的順序,你真的要選擇哪個解決方案。

+1

哇,很好的發現NSolve的問題!謝謝Leonid! – dreeves

+0

@dreeves丹尼爾,很高興我能幫上忙。有一段時間,我很困惑 - 在這之前不知道這可能發生。 –

+0

僅供參考,51和49在'In [1400]'中倒退(但是無論您得到的結果如何) – JxB