我尝试使用 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: "The function value {{2.67476}} is not a number at {u,v,w} = {0.673558,0.659492,0.0861047}"
我不知道我哪里出了问题。还有一种方法可以设置停止规则并在出现此类错误时从 NMinimize 输出中提取值。 请帮助我调试这段代码。 预先感谢您的帮助 库姆。
最佳答案
花括号表示 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 矩阵输出,而不是矢量输出时进行编辑。)
关于wolfram-mathematica - Mathematica 中的 NMinimize 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7799979/