【发布时间】: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
-
根据模块的不同,这种行为实际上会加快评估速度。在您给出的简单示例中,这意味着它只需要调用一次函数。但是是的,对于某些函数,符号或精确整数/有理数(或精确数字,如
Pi或Sqrt[2])调用可能非常慢。在这种情况下,请按照@Mr.Wizard 的建议限制您的功能。 -
顺便说一句:有趣的是,
NMinimize[Unevaluated[dummy[x]], x]用x=x调用了dummy4 次,而且从不使用数字。
标签: optimization wolfram-mathematica