Wolfram mathematica NMinimize似乎有点疯狂

Wolfram mathematica NMinimize似乎有点疯狂,wolfram-mathematica,mathematical-optimization,Wolfram Mathematica,Mathematical Optimization,假设我有一个疯狂的函数,f,定义如下: 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, li

假设我有一个疯狂的函数,
f
,定义如下:

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]
现在我这样调用
n最小化

NMinimize[{f[50, 50, k, j], k >= 49, k <= 51, j >= 49, j <= 51}, {j, k}]
但是如果我真的检查一下什么是
f[50,50,49,51]
,它是这样的:

0.489033
这与NMinimize所说的-21.0465有很大不同。 这与NMinimize的课程相称吗? 浮点错误是复合还是什么?
有什么想法可以让nmimimize(或某些类似的函数)提交吗?

这显然与您的函数
f
不局限于数值参数,以及
nmimimimize
执行的符号预处理有关。一旦您将签名更改为

f[x_?NumericQ, y_?NumericQ, a_?NumericQ, b_?NumericQ]:=...
结果与预期一样,尽管需要相当长的时间才能实现

编辑

我们可以深入挖掘以揭示真正的原因。首先,请注意,您的
f
(原始参数,args unrestricted)是一个非常重要的函数:

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
,它给出了两种有序的解决方案:

问题是,顺序是什么。对于
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

因此,您必须确定什么是适合您的订单,以及您真正想要选择的解决方案。

哇,用NSolve发现这个问题真是太棒了!谢谢你,莱昂尼德@丹尼尔,很高兴我能帮上忙。有一段时间,我很困惑——之前不知道会发生这种情况。仅供参考,51和49在[1400]
中的
中是向后的(但不管怎样,您都会得到相同的结果!)@JxB谢谢!我注意到了,但没有时间纠正。很快就可以了。
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])}}
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