Wolfram mathematica 计算多变量函数局部极值的所有步骤

Wolfram mathematica 计算多变量函数局部极值的所有步骤,wolfram-mathematica,Wolfram Mathematica,我试图创建一个Mathematica脚本,该脚本以两个变量的函数作为输入,然后以详细的方式(例如,显示所有偏导数)计算所有必要的步骤(查找一阶偏导数的根,检查相关的二阶条件),以查找局部极值点 f[x_, y_] := y^4 - y^3 - 3 x^2 y + x^4 dfx[x_, y_] = D[f[x, y], x]; dfy[x_, y_] = D[f[x, y], y]; dfxx[x_, y_] = D[f[x, y], x, x]; dfyy[x_, y_] = D[f[x, y

我试图创建一个Mathematica脚本,该脚本以两个变量的函数作为输入,然后以详细的方式(例如,显示所有偏导数)计算所有必要的步骤(查找一阶偏导数的根,检查相关的二阶条件),以查找局部极值点

f[x_, y_] := y^4 - y^3 - 3 x^2 y + x^4
dfx[x_, y_] = D[f[x, y], x];
dfy[x_, y_] = D[f[x, y], y];
dfxx[x_, y_] = D[f[x, y], x, x];
dfyy[x_, y_] = D[f[x, y], y, y];
dfxy[x_, y_] = D[f[x, y], x, y];
dff[x_, y_] = dfxx[x, y]*dfyy[x, y] - (dfxy[x, y])^2;
solns = {x, y} /. Solve[{dfx[x, y] == 0, dfy[x, y] == 0}, {x, y}];
realsolns = Select[solns, FreeQ[#, Complex] &]
这大部分都很简单,我最大的问题是如何在后续计算中重用
Solve[]
找到的根。我是这样开始的:

f[x_,y_] :=  y^3 -3 x^2 y
dfx[x_,y_]:=D[f[x,y],x]
dfy[x_,y_]:=D[f[x,y],y]
dfxx[x_,y_]:=D[f[x,y],x, x]
dfyy[x_,y_]:=D[f[x,y],y, y]
dfx[x_,y_]:=D[f[x,y],x]
dfxy[x_,y_]:=D[f[x,y],x,y]
dff[x_,y_]:=dfxx[x,y]*dfyy[x,y]-(dfxy[x,y])^2
Solve[{dfx[x,y]==0, dfy[x,y]==0},{x,y}]
Apply[dff, %]
Evaluate[dff[%]]
我被困在这里了,任何帮助都会很棒

这个怎么样:

solns = Solve[{dfx[x, y] == 0, dfy[x, y] == 0}, {x, y}]
CheckSoln[soln_] := 
  (
    hessianDet = ReplaceAll[dff[x, y], soln];
    Print["First order condition solution: ", soln, 
        "; has Hessian determinant=", hessianDet
    ];
  )
Map[CheckSoln, solns]

如果我们对这些衍生工具使用即时赋值而不是延迟赋值,可能会稍微容易一些。(如果您想要更通用的东西,即处理任意函数f,使用局部作用域变量进行修改并不太困难。)我使用一个具有多个临界点的新函数

f[x_, y_] := y^4 - y^3 - 3 x^2 y + x^4
dfx[x_, y_] = D[f[x, y], x];
dfy[x_, y_] = D[f[x, y], y];
dfxx[x_, y_] = D[f[x, y], x, x];
dfyy[x_, y_] = D[f[x, y], y, y];
dfxy[x_, y_] = D[f[x, y], x, y];
dff[x_, y_] = dfxx[x, y]*dfyy[x, y] - (dfxy[x, y])^2;
solns = {x, y} /. Solve[{dfx[x, y] == 0, dfy[x, y] == 0}, {x, y}];
realsolns = Select[solns, FreeQ[#, Complex] &]
以下是解决问题的要点

Out[87]= {{0, 0}, {0, 3/4}, {-(3/2), 3/2}, {3/2, 3/2}}
现在可以将二阶导数雅可比矩阵应用于每一个,如下所示

In[88]:= jacs = dff @@@ realsolns

Out[88]= {0, -(81/8), 243, 243}
丹尼尔·利奇布劳 钨研究