Optimization 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]; ]; 然而,我

我试图对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];
];
然而,我尝试过的所有最小化函数似乎都没有立即为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这对我一开始不起作用,但在清除它之后就成功了。