6

我正在尝试对 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 不是实数),因此最小化失败。

如何确定评估顺序,以便用数值评估 comb 的子功能?

4

2 回答 2

5

FindMinimumFindMaximumFindRoot的评估顺序FindFit记录在教程/UnconstrainedOptimizationSymbolicEvaluation文档页面上。我认为非常相似的东西适用于该NMinimize功能。描述很长,所以我将在这里仅引用该页面中提出的解决方案:

如果您的函数是这样的,符号评估将无法保持函数按预期运行或速度太慢,您应该定义您的函数,以便它只评估变量的数值。最简单的方法是使用 PatternTest (?) 定义函数,如 f[x_?NumberQ]:=definition。

符号评估似乎只是造成麻烦,因为您必须专门定义函数来防止它。但是,如果没有符号评估,Mathematica 就很难利用其独特的数字和符号能力组合。符号评估意味着命令可以始终利用符号分析带来的好处,例如算法确定、导数的自动计算、自动优化和编译以及结构分析。

于 2011-08-11T03:35:40.337 回答
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仅当其参数是数字时才会评估定义?

于 2011-08-09T01:04:41.997 回答