Mathematica用符号而不是数字来调用NMinimize?

时间:2011-04-27 21:06:17

标签: optimization wolfram-mathematica

在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}}

2 个答案:

答案 0 :(得分:4)

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

dummy[x_?NumericQ] := ...

答案 1 :(得分:2)

对于某些虚拟函数,“精确数字”调用也可能非常慢。查找FixedPoint[Sqrt,2.]的示例很快,但FixedPoint[Sqrt,2]将会发生故障!

“精确数字”是指IntegersRationals和数字符号,例如Sqrt[2]Cos[5]Pi,{{1}等等...... 也就是说,当EulerGamma采取行动时会返回数值的东西。

在这种情况下,最好使用

N[]

甚至

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