Mathematica:黑盒函数数值优化过程中的评估顺序

时间:2011-08-09 00:51:34

标签: 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];
];

然而,我尝试过的所有最小化函数似乎都没有立即为comb [x,y,z]提供数值,并且它最终试图用x,y,z的符号值来计算FindMaximum(其中很容易验证,因为Print [x,y,z]也符号评估)。因此Findmaximum失败(FindMaximum :: nrnum:函数值blah blah不是实数),因此最小化失败。

如何修复评估顺序,以便使用数值评估梳子的子功能?

2 个答案:

答案 0 :(得分:5)

FindMinimum文档页面中记录了FindMaximumFindRootFindFitNMinimize的评估顺序。我认为非常类似的东西适用于{{1}}函数。描述非常冗长,所以我在这里只引用该页面提出的解决方案:

  

如果你的功能是符号评估不能保持   按照预期的功能或将会非常慢,您应该定义   你的函数,它只评估的数值   变量。最简单的方法是定义你的功能   使用PatternTest(?),如f [x_?NumberQ]:= definition。

     

看起来象征性的评价只会让你觉得麻烦   必须专门定义功能以防止它。然而,   没有象征性的评价,Mathematica很难接受   其独特的数字和象征力量组合的优势。   符号评估意味着命令可以始终如一   象征性分析带来的好处的优势,例如   算法确定,导数自动计算,   自动优化和编译,以及结构分析。

答案 1 :(得分:4)

如何将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的定义仅在其参数为数字时进行评估?