Ответ 1
Конечно, это связано с тем, что ваша функция 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
Итак, вам действительно нужно решить, что вам нужно, и какое решение вы действительно хотите выбрать.