NMinimize Mathematica中的功能

时间:2011-10-17 21:46:45

标签: wolfram-mathematica mathematical-optimization

我尝试使用NMinimize函数来查找以下函数的全局最小值。

f = {s1 - Log[1000/{Norm[{2.83, 0, 2} - {u, v, w}]}^3]}^2 + {s2 - 
      Log[1000/{Norm[{0, 2.83, -2} - {u, v, w}]}^3]}^2 + {s3 - 
      Log[1000/{Norm[{-2.83, 0, 2} - {u, v, w}]}^3]}^2 + {s4 - 
      Log[1000/{Norm[{0, -2.83, -2} - {u, v, w}]}^3]}^2;
NMinimize[f, {u, v, w}, Method -> {"DifferentialEvolution"}].

优化是一种无约束的优化。以下是我每次运行时得到的错误。

  

“NMinimize :: nnum:”函数值{{2.67476}}不是数字   {u,v,w} = {0.673558,0.659492,0.0861047}“

我不确定我哪里出错了。还有一种方法可以设置停止规则,并在出现此类错误时从NMinimize输出中提取值。 请帮我调试这段代码。 提前感谢您的帮助 琴。

1 个答案:

答案 0 :(得分:5)

Curly括号表示Mathematica中的列表,因此您的函数输出的是单元素矩阵,而不是标量。将用于分组的{}对更改为正常括号。你得到双花括号的事实表明有两种级别的大括号​​可以转换。

f = (s1 - Log[1000./(Norm[{2.83, 0, 2} - {u, v, w}])^3])^2 + (s2 - 
      Log[1000./(Norm[{0, 2.83, -2} - {u, v, w}])^3])^2 + (s3 - 
      Log[1000./(Norm[{-2.83, 0, 2} - {u, v, w}])^3])^2 + (s4 - 
      Log[1000./(Norm[{0, -2.83, -2} - {u, v, w}])^3])^2;

作为进一步的评论,我将Integer值(1000)更改为实数(1000.),因为输入的其余部分是机器精度实数。正如Brett在评论中提醒我的那样,输出不会有任何不同,但是如果你进行了大量的重复计算,你可能会注意到性能提升很快,你可以更轻松Compile这个功能如果你想进一步提高性能。

(当我意识到它是1 * 1矩阵输出而不是矢量输出时编辑。)