023_LagrangeMultipliers.mw

Lagrange 係数の最大値、最小値

イントロダクション

このワークシートでは、制約条件 q(x,y)=0 のもと関数 f(x,y) の最大化、最小化を行います。

これは、u をラグランジュ乗数とし新しい関数 g(x,y) = f(x,y)+u を作成し得られます。

> restart;

例1

目的関数を定義します。

この目的関数の最大値、最小値を計算します。

> f:=x^2+y^2:

制約条件を定義します。

> q:=x^2+y^2+2*x-2*y+1:

生成される g(x,y) を定義します。

> g:=f+mu*q;

g := x^2+y^2+mu*(x^2+y^2+2*x-2*y+1)

g について偏微分を行います。

> exp1:=diff(g,x);

exp1 := 2*x+mu*(2*x+2)

> exp2:=diff(g,y);

exp2 := 2*y+mu*(2*y-2)

f(x,y) の条件付き最大値、最小値が与えられた3つの方程式を解くことにより、x と y、μ の値がもとまります。

q(x, y) = 0

(diff(f, x))+mu*(diff(q, x)) = 0

(diff(f, y))+mu*(diff(q, y)) = 0

> exp3:=solve({q=0,exp1=0,exp2=0},{x,y,mu});

exp3 := {x = -RootOf(2*_Z^2-4*_Z+1), mu = 1-2*RootOf(2*_Z^2-4*_Z+1), y = RootOf(2*_Z^2-4*_Z+1)}

平方根が正の時、解を見つけることが出来ます。

> allvalues(exp3);

{x = -1-1/2*2^(1/2), mu = -1-2^(1/2), y = 1+1/2*2^(1/2)}, {x = -1+1/2*2^(1/2), mu = -1+2^(1/2), y = 1-1/2*2^(1/2)}

これらの2つの解の1つを代入し最大値を確認します。

> subs({x = -1-1/2*2^(1/2),y = 1+1/2*2^(1/2)},f);

(-1-1/2*2^(1/2))^2+(1+1/2*2^(1/2))^2

> fmax:=evalf(%);

fmax := 5.828427124

同様に最小値を確認します。

> subs({x = -1+1/2*2^(1/2),y = 1-1/2*2^(1/2)},f):

> fmin:= evalf(%);

fmin := .1715728755

注意:ラグランジュ乗数μは評価に必要ありません。

この結果を視覚的に確認します。

f の最大値での振る舞いと、q=0 を表す(-1,1) を中心とした単位円である q=0 を表示します。

> with(plots):

Warning, the name changecoords has been redefined

> plot1 := implicitplot(f = fmax, x=-3..3, y=-3..3, color=BLUE):

> plot3 := implicitplot(q = 0, x=-3..3, y=-3..3, color=RED):

> display({plot1, plot3},title=`CONDITIONAL MAXIMUM`,scaling=constrained);

[Plot]

> plot2 := implicitplot(f = fmin, x=-3..3, y=-3..3, color=GREEN):

> display({plot2, plot3}, title=`CONDITIONAL MINIMUM`,scaling=constrained);

[Plot]

> display({plot1, plot2, plot3},title=`CONDITIONAL MINIMUM`,scaling=constrained);

[Plot]

注意:これらが評価する f の最大値、最小値は f(x、y) の極値ではなく、円 q(x,y) にある f の最大値、最小値です。

   また、Langrange乗数μは評価に必要ありません。

3次元グラフを描くことで、条件付きの最大値と最小値を可視化できます。

> plot3d([f - fmax,q], x= -3..0, y= 0..3, axes=BOXED, color=[green, red]);

[Plot]

> plot3d([f - fmin,q], x = -3..0, y = 0..3, axes=BOXED, color=[green, red]);

[Plot]

例2

目的関数を定義します。

この目的関数の最大値、最小値を計算します。

> restart;

> f := 8*x^2-12*x*y+17*y^2:

制約条件を定義します。

> q:=x^2+y^2-1:

生成される g(x,y) を定義します。

> g:=f+mu*q;

g := 8*x^2-12*x*y+17*y^2+mu*(x^2+y^2-1)

g について偏微分を行います。

> exp1:=diff(g,x);

exp1 := 16*x-12*y+2*mu*x

> exp2:=diff(g,y);

exp2 := -12*x+34*y+2*mu*y

3つの連立方程式を解きます。

> exp4 := solve({q = 0, exp1 = 0, exp2 = 0},{x, y, mu});

exp4 := {y = RootOf(5*_Z^2-1, label = _L1), x = 2*RootOf(5*_Z^2-1, label = _L1), mu = -5}, {y = -2*RootOf(5*_Z^2-1), x = RootOf(5*_Z^2-1), mu = -20}exp4 := {y = RootOf(5*_Z^2-1, label = _L1), x = 2*RootOf(5*_Z^2-1, label = _L1), mu = -5}, {y = -2*RootOf(5*_Z^2-1), x = RootOf(5*_Z^2-1), mu = -20}

> allvalues(exp4[1]);

{y = 1/5*5^(1/2), x = 2/5*5^(1/2), mu = -5}, {y = -1/5*5^(1/2), x = -2/5*5^(1/2), mu = -5}

> allvalues(exp4[2]);

{y = -2/5*5^(1/2), x = 1/5*5^(1/2), mu = -20}, {y = 2/5*5^(1/2), x = -1/5*5^(1/2), mu = -20}

2つの最大値と最小値が求まります。

> fmin:=subs({x = 2/5*5^(1/2),y = 1/5*5^(1/2)},f);

fmin := 5

> fmax:=subs({x = 1/5*5^(1/2),y = -2/5*5^(1/2)},f);

fmax := 20

解を確認するために関数をプロットします。

また、q は赤色で表示します。

> with(plots):

Warning, the name changecoords has been redefined

> plot1 := implicitplot(f = fmax, x=-2..2, y=-2..2, color=BLUE):

> plot3 := implicitplot(q = 0, x=-2..2, y=-2..2, color=RED):

> display({plot1, plot3}, title=`CONDITIONAL MAXIMUM`,scaling=constrained);

[Plot]

> plot2 := implicitplot(f = fmin, x=-2..2, y=-2..2, color=GREEN):

> plot3 := implicitplot(q = 0, x=-2..2, y=-2..2, color=RED):

> display({plot2, plot3}, title=`CONDITIONAL MINIMUM`);

[Plot]

> display({plot1, plot2, plot3},scaling=constrained);

[Plot]

> plot3d([f - fmax, q], x=-2..2, y=-2..2,
       color=[green, red], axes=BOXED, title=`CONDITIONAL MAXIMUM`);

[Plot]

> plot3d([f - fmin, q], x=-2..2, y=-2..2,
      color=[green, red], axes=BOXED, title=`CONDITIONAL MINIMUM`);

[Plot]