【问题标题】:Mathematica calls NMinimize with symbols rather than numbers?Mathematica 用符号而不是数字调用 NMinimize?
【发布时间】:2011-04-27 21:06:17
【问题描述】:

我在 Mathematica 中使用 NMinimize 时注意到以下行为。目标函数的第一次调用是使用变量名,而不是像人们所期望的那样使用来自空间的点。

因此,例如,如果我的目标函数是一个模块,则该模块仅被调用一次,进行符号计算,然后在进一步的迭代中,使用变量空间中的点计算该符号表达式。

对于大型表达式,此行为可能会显着减慢计算速度。 有没有办法解决这个问题?有没有其他人经历过这个?那么有什么方法可以加快NMinimize 的速度吗?

例子:

dummy[x_] := Module[
  {},
  Print["x=", x ];
  4 x^4 - 4 x^2 + 1
  ]

In: NMinimize[dummy[x], x]
Out:x=x
{0., {x -> 0.707107}}

【问题讨论】:

  • 欢迎来到 StackOverflow
  • 根据模块的不同,这种行为实际上会加快评估速度。在您给出的简单示例中,这意味着它只需要调用一次函数。但是是的,对于某些函数,符号或精确整数/有理数(或精确数字,如 PiSqrt[2])调用可能非常慢。在这种情况下,请按照@Mr.Wizard 的建议限制您的功能。
  • 顺便说一句:有趣的是,NMinimize[Unevaluated[dummy[x]], x]x=x 调用了 dummy 4 次,而且从不使用数字。

标签: optimization wolfram-mathematica


【解决方案1】:

您是否尝试过将函数定义为仅评估数字输入?

dummy[x_?NumericQ] := ...

【讨论】:

  • 原因是NMinimize 不包含任何参数,因此dummy[x] 在进入NMinimize 特定代码之前就正常计算了。
【解决方案2】:

对于某些虚拟函数,“精确数字”调用也可能非常慢。查找FixedPoint[Sqrt,2.] 的示例很快,但FixedPoint[Sqrt,2] 会一直持续到出现问题为止!

“精确数字”是指IntegersRationals 等数字符号,以及Sqrt[2]Cos[5]PiEulerGamma 等数字符号...
也就是说,当被N[] 操作时会返回一个数值的东西。

在这种情况下使用可能会更好

dummy[_?InexactNumberQ] := ....

甚至

dummy[_?MachineNumberQ] := ....

【讨论】:

  • 这与在参数上显式使用N 相比如何?
  • 我更喜欢NumericQ,尤其是因为添加Element[x, Integers] 将失败并显示InExactNumberQ,而设置WorkingPrecision -> 20 将失败并显示MachineNumberQ
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
相关资源
最近更新 更多