我试图在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不是实数),因此最小化失败。
如何修复评估顺序,以便使用数值评估梳子的子功能?
答案 0 :(得分:5)
FindMinimum
文档页面中记录了FindMaximum
,FindRoot
,FindFit
和NMinimize
的评估顺序。我认为非常类似的东西适用于{{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
的定义仅在其参数为数字时进行评估?