2011-09-10 3 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のために+1 – Verbeia

答えて

17

確かにあなたの関数に関係しているようです。f数値引数に加えて、NMinimizeによって実行される記号的な前処理に限定されません。署名を変更した後

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

結果は期待通りですが、取得にはかなり時間がかかります。

EDIT

私たちは本当の理由を明らかにすることを深く掘ることができます。

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 

真犯人は2つの命じたソリューションを与える、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])}} 

問題があるまず、あなたのf(argsを無制限元1は、)かなり機能であることに注意してください注文とは何ですか?シンボリックと数値の引数が異なる場合は、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でその問題を浮かべるのがいいね!レオニードありがとう! – dreeves

+0

@dreeves Daniel、私は助けることができてうれしい。しばらくの間、私は非常に困惑していました - これが起こる前に全く考えていなかった。 –

+0

FYI、51と49は 'In [1400]'の後ろにあります(ただし、関係なく同じ結果が得られます)。 – JxB

関連する問題