wolfram-mathematica - Mathematica 中的 NMinimize 函数

标签 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: "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/

相关文章:

machine-learning - 如何使用 Wolfram Mathematica 修改列中的数据?

wolfram-mathematica - 在 Mathematica 的某个级别应用 EuclideanDistance

math - 如何实现自适应步长 Runge-Kutta Cash-Karp?

python - CVXPY:如何高效解决一系列类似问题

mathematical-optimization - 如何确定蚁群优化中的 Ant 数量

python - 如何在 Python 程序中使用 Mathematica 函数?

wolfram-mathematica - 数学 : help solving a system of non-linear equations with inequality constraints

wolfram-mathematica - 与某些图案不同的匹配头

javascript - 如何归一化罗盘输入?

r - R中的约束优化设置约束