【问题标题】:Mathematica: Evaluation order during numerical optimisation of black box functionsMathematica:黑盒函数数值优化期间的评估顺序
【发布时间】:2011-08-09 00:51:34
【问题描述】:

我正在尝试对 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: The function value blah blah is not a real number),因此最小化失败。

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

【问题讨论】:

  • 另一个(更微妙的)问题是由于 NMinimize 中的符号预处理,最近由 Daniel Lichtblau 在 other thread 中解决。
  • 嗯,好的,谢谢,我会检查一下。我也刚刚注意到 Mathematica 8 中没有出现这个问题(我之前运行的是 7)。

标签: optimization wolfram-mathematica black-box operator-precedence


【解决方案1】:

FindMinimumFindMaximumFindRootFindFit 的评估顺序记录在 tutorial/UnconstrainedOptimizationSymbolicEvaluation 文档页面上。我认为非常相似的东西适用于NMinimize 函数。描述很长,所以我在这里只引用该页面中提出的解决方案:

如果你的函数是这样的符号评估不会保留 按预期运行或将非常缓慢,您应该定义 您的函数,以便它仅评估 变量。最简单的方法是定义你的函数 使用 PatternTest (?),如 f[x_?NumberQ]:=definition。

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

【讨论】:

    【解决方案2】:

    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 的定义仅在其参数是数字时才被评估?

    【讨论】:

    • 不,这没有帮助。我的函数实际上已经这样做了,我只是为了提出这个问题而删除了这些位。
    • @Ben 很奇怪 Print 也会显示符号值,因为带有符号值的 comb[x,y,z] 与我给出的定义不匹配。你在运行这个之前Clear[comb] 吗?也许它与没有NumericQ 位的定义匹配。
    • @acl 起初这对我不起作用,但在清除它之后就成功了。
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多