Optimization Mathematica:黑箱函数数值优化期间的求值顺序
我试图对Mathematica中的“黑箱”函数进行数值优化。示意图是这样的:Optimization Mathematica:黑箱函数数值优化期间的求值顺序,optimization,wolfram-mathematica,black-box,operator-precedence,Optimization,Wolfram Mathematica,Black Box,Operator Precedence,我试图对Mathematica中的“黑箱”函数进行数值优化。示意图是这样的: NMinimize[{comb[x,y,z], x > 0}, {x,y,z}] 其中comb[x,y,z]的定义与此类似: comb[x_,y_,z_] := Module[{}, Print[x,y,z]; M = FindMaximum[SkewNormal[a,x,y,z], {a,x}] // First; val = f[x,y,z,M]; Return[val]; ]; 然而,我
NMinimize[{comb[x,y,z], x > 0}, {x,y,z}]
其中comb[x,y,z]的定义与此类似:
comb[x_,y_,z_] := Module[{},
Print[x,y,z];
M = FindMaximum[SkewNormal[a,x,y,z], {a,x}] // First;
val = f[x,y,z,M];
Return[val];
];
然而,我尝试过的所有最小化函数似乎都没有立即为comb[x,y,z]提供数值,它最终尝试使用x,y,z的符号值计算FindMaximum(这很容易验证,因为打印[x,y,z]也会进行符号计算)。Findmaximum因此失败(Findmaximum::nrnum:函数值blah blah不是实数),因此最小化失败
如何设置求值顺序,以便用数值计算comb的子函数?将
comb
更改为
comb[x_?NumericQ, y_?NumericQ, z_?NumericQ] :=
Module[{}, Print[x, y, z];
M = FindMaximum[SkewNormal[a, x, y, z], {a, x}] // First;
val = f[x, y, z, M];
Return[val];];
这使得
comb
的定义仅在其参数为数字时才被计算?文档页上记录了findminium
、FindMaximum
、FindRoot
和FindFit
的计算顺序。我认为类似的东西也适用于n最小化
函数。描述相当冗长,因此我在此仅引用该页中的建议解决方案:
如果您的函数是这样的,符号求值将不会保持
功能如预期或将非常缓慢,您应该定义
函数,使其仅计算
变量。最简单的方法是定义函数
使用patternetest(?),如f[x_?NumberQ]:=定义
似乎符号评估只是制造了一个麻烦,因为
必须专门定义功能以防止它。然而,
没有符号求值,Mathematica很难接受
其独特的数字和符号力量的结合优势。
符号求值意味着命令可以一致地执行
符号分析带来的好处,例如
算法确定,自动计算导数,
自动优化和编译,以及结构分析
另一个(更微妙的)问题是最近由Daniel Lichtblau解决的,因为
NMinimize
中的符号预处理。嗯,好的,谢谢,我来检查一下。我还注意到这个问题在Mathematica 8中没有出现(我之前运行的是7)。不,这没有帮助。我的函数实际上已经这样做了,我只是为了问这个问题而删除了这些位。@Ben奇怪的是,Print
也会显示符号值,因为带有符号值的comb[x,y,z]
与我给出的定义不匹配。运行此操作之前,您是否清除了[comb]
?可能它在没有NumericQ
位的情况下匹配了定义。@acl这对我一开始不起作用,但在清除它之后就成功了。