Ben*_*mer 6 optimization wolfram-mathematica black-box operator-precedence
我试图在Mathematica中对"黑匣子"功能进行数值优化.原理图如下:
NMinimize[{comb[x,y,z], x > 0}, {x,y,z}]
Run Code Online (Sandbox Code Playgroud)
其中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];
];
Run Code Online (Sandbox Code Playgroud)
但是,我尝试过的所有最小化函数似乎都没有立即为comb [x,y,z]提供数值,并且它最终试图用x,y,z的符号值来计算FindMaximum(这很容易验证)因为Print [x,y,z]也象征性地评估).因此Findmaximum失败(FindMaximum :: nrnum:函数值blah blah不是实数),因此最小化失败.
如何修复评估顺序,以便使用数值评估梳子的子功能?
评估顺序FindMinimum,FindMaximum,FindRoot并且FindFit被记录了在教程/ UnconstrainedOptimizationSymbolicEvaluation文档页面.我认为非常类似的东西适用于该NMinimize功能.描述相当冗长,所以我在这里只引用该页面提出的解决方案:
如果您的函数是符号评估不会使函数保持预期或者速度过慢,您应该定义函数,以便它只评估变量的数值.最简单的方法是使用PatternTest(?)定义函数,如f [x_?NumberQ]:= definition.
似乎符号评估只会造成麻烦,因为您必须专门定义该函数以防止它.然而,如果没有符号评估,Mathematica很难利用其独特的数字和象征力量组合.符号评估意味着命令可以始终如一地利用符号分析带来的好处,例如算法确定,衍生物的自动计算,自动优化和编译以及结构分析.
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];];
Run Code Online (Sandbox Code Playgroud)
comb这导致仅当参数为数字时才对的定义进行求值?