【问题标题】:NMinimize seems to be on crackNMinimize 似乎正在破解
【发布时间】:2011-09-10 00:02:53
【问题描述】:

假设我有一个疯狂的函数,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]

现在我像这样打电话给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(或某些此类功能)以提交?

【问题讨论】:

    标签: wolfram-mathematica mathematical-optimization


    【解决方案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
    

    因此,您确实必须确定适合您的顺序,以及您真正想要选择的解决方案。

    【讨论】:

    • 哇,用 NSolve 发现这个问题真是太好了!谢谢列昂尼德!
    • @dreeves Daniel,很高兴我能提供帮助。有一段时间,我很困惑——之前不知道这可能会发生。
    • 仅供参考,In[1400] 中的 51 和 49 是倒退的(但无论如何你都会得到相同的结果!)
    • @JxB 谢谢!我注意到了,但没有时间更正。很快就会做。
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多