Mathematica:多项式实根的分支点

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)

我们最终得到了这样的情节:

fv的轮廓图与谷线重叠

Dan*_*lau 5

不确定这个(迟来的)是否有帮助,但似乎你对判别点感兴趣,也就是说,多项式和导数(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)