nano_exit

基礎的なことこそ、簡単な例が必要だと思うのです。

ラグランジュの未定乗数法と等高線プロット

ラグランジュの未定乗数法を直感的に非常に分かりやすく描いてあるサイト様を発見。
ラグランジュの未定乗数法の解説と直感的な証明

せっかくなので、実際に等高線プロット使って図示してみた。
f:id:koideforest:20171116003805p:plain

図で考えているのは、

 f(x,y) = ( x - 3 )^2 + y^2
 g(x,y) = x^2 + y^2 - 4

のような、何かポテンシャル的な場が f(x,y)で与えられていて、軌道 g(x,y)=0の上で f(x,y)を最大もしくは最小にする (x,y)は何でしょう?という問題。
数学の問題っぽく言えば、束縛条件 g(x,y) = 0の下で f(x,y)を最大(最小)にする (x,y)を求める問題。
文章を読むと、最大最小化する f(x,y)が主役な感じがするが、図を見るとわかる様に、(当たり前だが) g(x,y)=0の軌道の中の点で良さそうなのを探す方がイメージに近い。
ちなみに、二次元の今の問題において得られる最大(最小)の座標群がなぜ零次元(つまり点)なのかというと g(x,y)=0の時点で x yは独立ではなく、既に一次元の問題になっているところが味噌である。そこに f(x,y)を介して条件式が加わると、零次元になるというわけである。三次元でやると得られる座標群は線(つまり軌道・一次元)になる。
単純に変数 x, yそれぞれに対して微分するから、方程式が未定乗数を含めた変数の数だけ出てきて、最終的に値がカッチリ決まるというもの。未定乗数の微分では g(x,y) = 0がそのまま出てくる。
この意味で、主役はなんとなく g(x,y)=0のような気がしてならない。

図を見れば明らかに
最大: ( -2, 0 )
最小: ( 2, 0 )
であるが、ラグランジュの未定乗数法を使うと、

 L = ( x - 3 )^2 + y^2 - \lambda [ x^2 + y^2 - 4 ]
 \frac{ \partial L }{ \partial x } = 2 ( 1 - \lambda ) x - 6 = 0
 \frac{ \partial L }{ \partial y } = 2 ( 1 - \lambda ) y = 0
 \frac{ \partial L }{ \partial \lambda } = - ( x^2 + y^2 - 4 )= 0

ここから、

 x  = - 2 / \lambda
 ( y, \lambda ) = ( 0, a ) \; or \; ( a, 1 ) \; for \; \forall a \in \mathbb{R}
 x^2 + y^2 = 4

三つ目のは元々の束縛条件まんまなので、当たり前は当たり前。
 y = 0を入れれば、 x = \pm 2が求まって、図から類推した答えと合っている。
 \lambda = 1 x = -2と等価であり、その時も y=0となるから、全ての答えが得られている。

以下、ソースの中身。

import numpy as np
import matplotlib.pyplot as pet

N = 100
x = y = np.linspace( -5, 5, N )
X, Y = np.meshgrid( x, y )
F = ( X - 3 )**2 + Y**2
G = X**2 + Y**2 - 4

plt.text( 0, 0, 'g(x,y)=0' )
plt.text( -2.5, 3.5, 'f(x,y)', color='#0068b7')

plt.contour( X, Y, G, [0] )
plt.gray()
plt.pcolor( X, Y, F )
plt.cool()
plt.gca().set_aspect( 'equal', adjustable='box' )
plt.show()

以下のサイト様にお世話になりました。

等高線プロット
matplotlibカラープロット - 週末はいつも晴れ

陰関数
Pythonのmatplotlibでグラフを簡単に表示する方法part2 | 東大卒ニートと普通のサラリーマンのお金の稼ぎ方