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.
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矩阵输出而不是矢量输出时编辑.)