首先,这似乎(来自ContourPlot)一个相当简单的最大化问题,为什么FindMaximum与Newton的方法有问题?
其次,我怎样才能摆脱警告?
第三,如果我无法摆脱这些警告,我如何判断警告是否有意义,即最大化失败?
例如,在下面的代码中,使用Newton方法的FindMaximum会发出警告,而PrincipalAxis方法则不会
o = 1/5 Log[E^(-(h/Sqrt[3]))/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 3/10 Log[E^(h/Sqrt[3])/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 1/5 Log[E^(-(h/Sqrt[3]) - Sqrt[2] j)/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 1/10 Log[E^(h/Sqrt[3] - Sqrt[2] j)/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 1/10 Log[E^(-Sqrt[3] h + Sqrt[2] j)/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 1/10 Log[E^(Sqrt[3] h + Sqrt[2] j)/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))]; (* -1 makes more contours towards maximum *) contourFunc[n_, p_] := Function[{min, max}, range = max - min; Table[Exp[p (x - 1)] x range + min, {x, 0, 1, 1/n}] ]; cf = contourFunc[10, -1]; ContourPlot @@ {o, {j, -1, 1}, {h, -1, 1}, Contours -> cf} FindMaximum @@ {o, {{j, 0}, {h, 0}}, Method -> "Newton"} FindMaximum @@ {o, {{j, 0}, {h, 0}}, Method -> "PrincipalAxis"}
注意,我认为在其中一个组件的方向上渐变为0可能是问题,但是如果我扰乱了初始点我仍然得到相同的警告,这是一个例子
o = 1/5 Log[E^(-(h/Sqrt[3]))/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 1/5 Log[E^(h/Sqrt[3])/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 1/10 Log[E^(-(h/Sqrt[3]) - Sqrt[2] j)/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 3/10 Log[E^(h/Sqrt[3] - Sqrt[2] j)/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 1/10 Log[E^(-Sqrt[3] h + Sqrt[2] j)/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))] + 1/10 Log[E^(Sqrt[3] h + Sqrt[2] j)/( 2 E^(-(h/Sqrt[3])) + 2 E^(h/Sqrt[3]) + E^(-(h/Sqrt[3]) - Sqrt[2] j) + E^(h/Sqrt[3] - Sqrt[2] j) + E^(-Sqrt[3] h + Sqrt[2] j) + E^(Sqrt[3] h + Sqrt[2] j))]; ContourPlot @@ {o, {j, -1, 1}, {h, -1, 1}} FindMaximum @@ {o, {{j, -0.008983550852535105`}, {h, 0.06931364191023386`}}, Method -> "Newton"}
答案 0 :(得分:4)
在数学上,我不确定为什么Netwon的方法会失败,但documentation for FindMaximum
中的示例指出了可能的问题下的这个特定问题和错误消息:“ With机器精度算术,即使是具有平滑最大值的函数也可能看起来颠簸“。
因此,如果你提高工作精度,例如警告的WorkingPrecision -> 20
选项FindMaximum
消失了:
In[25]:= FindMaximum[o, {{j, 0}, {h, 0}}, Method->"Newton", WorkingPrecision->20]
Out[25]= {-2.0694248079871222533, {j -> -0.14189560954670761863, h -> 0}}
鉴于错误的文本是相当具有描述性的:
FindMaximum :: lstol:行搜索将步长减小到容差范围内 由AccuracyGoal和PrecisionGoal指定但无法找到足够的增量 在功能中。您可能需要超过工作精度的MachinePrecision数字 满足这些容差。 >>
...我怀疑Newton的方法未能使用机器精度算法达到一个具有足够小误差的固定点。
如错误消息提示,如果您不想切换到较慢的高精度算术,则可以使用AccuracyGoal
选项指定解决方案中所需的有效位数:
In[27]:= FindMaximum[o, {{j, 0}, {h, 0}}, Method -> "Newton", AccuracyGoal -> 5]
Out[27]= {-2.06942, {j -> -0.141896, h -> -2.78113*10^-17}}
希望有所帮助!