【问题标题】:NMinimize function in MathematicaMathematica 中的 NMinimize 函数
【发布时间】:2011-10-17 21:46:44
【问题描述】:

我尝试使用 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 输出中提取值。 请帮助我调试此代码。 预先感谢您的帮助 库姆。

【问题讨论】:

  • @rcollyer - 你真的进入了语法高亮,我明白了:)
  • @Verbeia,我想如果我要编辑它,我不妨让它更具可读性。它并不完美,但已经足够了。

标签: wolfram-mathematica mathematical-optimization


【解决方案1】:

花括号表示 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 在 cmets 中提醒我的那样,输出不会有任何不同,但如果您进行大量重复计算,您可能会注意到性能略有提升,如果您可以更轻松地Compile 该函数希望进一步提高性能。

(当我意识到它是 1*1 矩阵输出,而不是矢量输出时进行了编辑。)

【讨论】:

  • 10001000. 在这里不应该有任何区别——无论如何它都会被强制转换为机器精度。
  • @BrettChampion - 你说得对,输出将是相同的,但性能会有所提高,这就是我的意思,但设法省略了编辑。我会在答案中说得更清楚。
  • 使用 1000. 而不是 1000 在我的机器上加快了大约 0.2%(使用 s1、s2、s3、s4 的随机值。)而如果我使用它会快 35% h = Simplify[f, Element[u|v|w, Reals]] 摆脱规范和相关的绝对值(被平方了......)
  • @Verbeia 非常感谢您的帮助!!!!更改为普通括号确实有助于它现在的工作:)
  • @BrettChampion 如前所述,简化功能确实让事情进展得更快。 :) 再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多