2011-11-23 136 views
0

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

大部分情况很简单,我最大的问题是如何重复使用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[%]] 

我被困在这里,任何帮助将太棒了!

回答

1

如何:

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] 
+0

非常感谢,这也工作得非常好! –

7

如果我们用直接的,而不是那些衍生延迟分配这可能是稍微容易。 (如果你想要更通用的东西,即处理任意函数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} 

丹尼尔Lichtblau 沃尔夫勒姆研究

+0

非常感谢,这工作得很好! –