我尝试使用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输出中提取值。 请帮我调试这段代码。 提前感谢您的帮助 琴。
答案 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矩阵输出而不是矢量输出时编辑。)