next up previous
Next: D. Mathematicaの多変数の微積分への応用 Up: C. プログラム例 Previous: C..1 2次元のNewton法


C..2 二変数関数の極値問題 kyokuchi.m


(* 二変数関数 f の停留点を求める (よう努力する) *)
teiryuuten[f_]:=
Module[
  {fx,fy},
  fx=Simplify[D[f[x,y],x]];
  fy=Simplify[D[f[x,y],y]];
  Solve[{fx==0,fy==0},{x,y}]
]

(* 二変数関数 f とその停留点のリスト s を分析し、極値の判定をする *)
bunseki[s_,f_]:=
Module[
  {ff,HesseXY,aSolution,restSolutions,valf,l1,l2},
  ff=f[x,y];
  HesseXY = {{D[ff,x,x],D[ff,x,y]},
             {D[ff,y,x],D[ff,y,y]}};
  restSolutions = s;
  While [(restSolutions != {}),
         aSolution = First[restSolutions];
         restSolutions = Rest[restSolutions];
         valf = ff /. aSolution;
         {l1,l2} = Eigenvalues[HesseXY /. aSolution];
         If [l1 > 0 && l2 > 0,
            Print[aSolution, ", 極小 f(x,y)=", valf]];
         If [l1 < 0 && l2 < 0,
            Print[aSolution, ", 極大 f(x,y)=", valf]];
         If [(l1 l2 < 0), 
            Print[aSolution, ", 極値でない"]];
         If [(l1 l2 == 0),
            Print[aSolution, ", 極値であるかどうか分からない。"]];
      ]
]

これで良い?
  st[f_]:=Solve[{D[f[x,y],x]==0,D[f[x,y],y]==0},{x,y}]

使用例

oyabun% math
Mathematica 4.0 for Solaris
Copyright 1988-1999 Wolfram Research, Inc.
 -- Motif graphics initialized -- 

In[1]:= << /home/syori2/kyokuchi.m

In[2]:= f[x_,y_]:=x y(x^2+y^2-4)

In[3]:= s=teiryuuten[f]

Out[3]= {{x -> -2, y -> 0}, {x -> -1, y -> -1}, {x -> -1, y -> 1}, 
 
>    {x -> 0, y -> 0}, {x -> 1, y -> -1}, {x -> 1, y -> 1}, {x -> 2, y -> 0}, 
 
>    {y -> -2, x -> 0}, {y -> 2, x -> 0}}

In[4]:= bunseki[s,f]
{x -> -2, y -> 0}, 極値でない
{x -> -1, y -> -1}, 極小 f(x,y)=-2
{x -> -1, y -> 1}, 極大 f(x,y)=2
{x -> 0, y -> 0}, 極値でない
{x -> 1, y -> -1}, 極大 f(x,y)=2
{x -> 1, y -> 1}, 極小 f(x,y)=-2
{x -> 2, y -> 0}, 極値でない
{y -> -2, x -> 0}, 極値でない
{y -> 2, x -> 0}, 極値でない

In[5]:= 


next up previous
Next: D. Mathematicaの多変数の微積分への応用 Up: C. プログラム例 Previous: C..1 2次元のNewton法
桂田 祐史
2013-04-09