ラグランジュの未定乗数法をpythonで実装する
最近「これならわかる最適化数学基礎原理から計算手法まで」を購入し、読み進めています。今回はラグランジュの未定乗数法の例題をpythonで実装してみようと思います。
ラグランジュ未定乗数法を簡単にまとめる以下の通りです。
制約条件が1つの場合
- 制約条件が $x+y+z=1$ のもとでの関数 $f(x,y,z)=xy^2z^3$ の極致を求めよ p.67
上の定理を用いると、制約条件を として、
と置くことができます。
ここで一度、関数fと、関数g、関数Fを実装しておきます。
pythonのsympyライブラリを使用して微分を計算します。
from sympy import diff, symbols, solve # 変数を定義 x, y, z, l = symbols("x y z l") # 関数fを定義 f = x * y**2 * z**3 # 制約条件gを定義 g = x + y + z - 1
各変数に関して偏微分してその結果を0と置くと
となります。
この偏微分の部分は、pythonのコードで書くと、
# 定理式に代入 theor = f - l * g # 各変数で偏微分する diffx = diff(theor, x) diffy = diff(theor, y) diffz = diff(theor, z) diffl = diff(theor, l) res = solve([diffx, diffy, diffz, diffl])
この連立方程式を解くことで極値をとるときのx, y, zの値がわかります。
上の連立方程式を解くと、
となります。この時の関数fの値は、 となる。
pythonコード全体は以下の通りです。
from sympy import diff, symbols, solve # 変数を定義 x, y, z, l = symbols("x y z l") # 関数fを定義 f = x * y**2 * z**3 # 制約条件gを定義 g = x + y + z - 1 # 定理式に代入 theor = f - l * g # 各変数で偏微分する diffx = diff(theor, x) diffy = diff(theor, y) diffz = diff(theor, z) diffl = diff(theor, l) # 連立方程式を解く res = solve([diffx, diffy, diffz, diffl])