Jan*_*nus 7 wolfram-mathematica
我正在对以下示例函数中的"渐变极值"进行强力搜索
fv[{x_, y_}] = ((y - (x/4)^2)^2 + 1/(4 (1 + (x - 1)^2)))/2;
Run Code Online (Sandbox Code Playgroud)
这涉及找到以下零
gecond = With[{g = D[fv[{x, y}], {{x, y}}], h = D[fv[{x, y}], {{x, y}, 2}]},
g.RotationMatrix[Pi/2].h.g == 0]
Run Code Online (Sandbox Code Playgroud)
这Reduce
愉快地做对我来说:
geyvals = y /. Cases[List@ToRules@Reduce[gecond, {x, y}], {y -> _}];
Run Code Online (Sandbox Code Playgroud)
geyvals
是三次多项式的三个根,但表达式有点大.
现在我的问题:对于不同的值x
,这些根的不同数量是真实的,我想挑选x
解决方案分支的位置的值,以便沿着谷底(of fv
)拼接梯度极值.在目前的情况下,由于多项式只是立方体,我可以手工完成 - 但我正在寻找一种让Mathematica为我做的简单方法吗?
编辑:澄清:渐变极值的东西只是背景 - 并且是设置难题的简单方法.我对这个问题的具体解决方案不是那么感兴趣,因为在一般的切换方式中找到多项式根的分支点.在下面添加了一个工作方法的答案.
编辑2:因为看起来实际问题比根分支更有趣:rcollyer建议ContourPlot
直接使用gecond
以获得渐变极值.为了完成这一点,我们需要分离山谷和山脊,这是通过观察垂直于梯度的Hessian的特征值来完成的.检查"valleynes",RegionFunction
我们只剩下谷线:
valleycond = With[{
g = D[fv[{x, y}], {{x, y}}],
h = D[fv[{x, y}], {{x, y}, 2}]},
g.RotationMatrix[Pi/2].h.RotationMatrix[-Pi/2].g >= 0];
gbuf["gevalley"]=ContourPlot[gecond // Evaluate, {x, -2, 4}, {y, -.5, 1.2},
RegionFunction -> Function[{x, y}, Evaluate@valleycond],
PlotPoints -> 41];
Run Code Online (Sandbox Code Playgroud)
这只是谷底线.包括一些轮廓和鞍点:
fvSaddlept = {x, y} /. First@Solve[Thread[D[fv[{x, y}], {{x, y}}] == {0, 0}]]
gbuf["contours"] = ContourPlot[fv[{x, y}],
{x, -2, 4}, {y, -.7, 1.5}, PlotRange -> {0, 1/2},
Contours -> fv@fvSaddlept (Range[6]/3 - .01),
PlotPoints -> 41, AspectRatio -> Automatic, ContourShading -> None];
gbuf["saddle"] = Graphics[{Red, Point[fvSaddlept]}];
Show[gbuf /@ {"contours", "saddle", "gevalley"}]
Run Code Online (Sandbox Code Playgroud)
我们最终得到了这样的情节:
不确定这个(迟来的)是否有帮助,但似乎你对判别点感兴趣,也就是说,多项式和导数(wrt y)都消失了.您可以为{x,y}解决此系统,并丢弃如下的复杂解决方案.
fv[{x_, y_}] = ((y - (x/4)^2)^2 + 1/(4 (1 + (x - 1)^2)))/2;
gecond = With[{g = D[fv[{x, y}], {{x, y}}],
h = D[fv[{x, y}], {{x, y}, 2}]}, g.RotationMatrix[Pi/2].h.g]
In[14]:= Cases[{x, y} /.
NSolve[{gecond, D[gecond, y]} == 0, {x, y}], {_Real, _Real}]
Out[14]= {{-0.0158768, -15.2464}, {1.05635, -0.963629}, {1.,
0.0625}, {1., 0.0625}}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1061 次 |
最近记录: |