Yar*_*tov 2 wolfram-mathematica mathematical-optimization
首先,这看起来(来自 ContourPlot)是一个相当简单的最大化问题,为什么使用牛顿法的 FindMaximum 会出现问题?
其次,如何摆脱警告?
第三,如果我无法摆脱这些警告,我如何判断警告是否有意义,即最大化失败?
例如,在下面的代码中,使用 Newton 方法的 FindMaximum 会发出警告,而 PrimaryAxis 方法则不会
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 使更多轮廓接近最大值 *) 轮廓Func[n_, p_] := 函数[{最小值, 最大值}, 范围=最大值-最小值; 表[Exp[p (x - 1)] x 范围 + min, {x, 0, 1, 1/n}] ]; cf = 轮廓Func[10, -1]; 等高线图 @@ {o, {j, -1, 1}, {h, -1, 1}, 等高线 -> cf} FindMaximum @@ {o, {{j, 0}, {h, 0}}, 方法 -> “牛顿”} FindMaximum @@ {o, {{j, 0}, {h, 0}}, 方法 -> "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))]; 等值线图 @@ {o, {j, -1, 1}, {h, -1, 1}} FindMaximum @@ {o, {{j, -0.008983550852535105`}, {h, 0.06931364191023386`}},方法->“牛顿”}
从数学上讲,我不确定 Netwon 的方法失败的确切原因,但文档中的示例指出FindMaximum
了这个特定问题和可能问题下的错误消息:“使用机器精度算术,即使具有平滑最大值的函数也可能看起来颠簸”。
WorkingPrecision -> 20
因此,如果您通过例如警告选项FindMaximum
消失来提高工作精度:
In[25]:= FindMaximum[o, {{j, 0}, {h, 0}}, Method->"Newton", WorkingPrecision->20]
Out[25]= {-2.0694248079871222533, {j -> -0.14189560954670761863, h -> 0}}
Run Code Online (Sandbox Code Playgroud)
鉴于错误的文本具有相当的描述性:
FindMaximum::lstol:线搜索将步长减小到 AccuracyGoal 和 PrecisionGoal 指定的容差范围内,但无法在函数中找到足够的增量。您可能需要超过 MachinePrecision 位数的工作精度来满足这些公差。>>
...我怀疑牛顿的方法无法使用机器精度算术达到误差足够小的固定点。
正如错误消息提示的那样,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}}
Run Code Online (Sandbox Code Playgroud)
希望有帮助!
归档时间: |
|
查看次数: |
1966 次 |
最近记录: |