在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}}
答案 0 :(得分:4)
您是否尝试过定义函数以仅评估数字输入?
dummy[x_?NumericQ] := ...
答案 1 :(得分:2)
对于某些虚拟函数,“精确数字”调用也可能非常慢。查找FixedPoint[Sqrt,2.]
的示例很快,但FixedPoint[Sqrt,2]
将会发生故障!
“精确数字”是指Integers
,Rationals
和数字符号,例如Sqrt[2]
,Cos[5]
,Pi
,{{1}等等......
也就是说,当EulerGamma
采取行动时会返回数值的东西。
在这种情况下,最好使用
N[]
甚至
dummy[_?InexactNumberQ] := ....