NMinimize Mathematica中的功能

use*_*022 2 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"}].
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ver*_*eia 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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • "1000"与"1000"在这里不应该有任何区别 - 无论如何它都将被强制转换为机器精度. (3认同)
  • 使用`1000.而不是'1000`在我的机器上加速约0.2%(使用s1,s2,s3,s4的随机值.)如果我使用`h = Simplify [f,则速度提高35%]元素[u | v | w,Reals]]`摆脱规范和相关的绝对值(得到平方......) (2认同)