2011-11-23 134 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

非常感謝,這工作得很好! –