約束非線性優化
問題陳述 :
找到函式 f(x,y)
的最小值(超過 x
,y
),取決於 g(x,y)=0
,其中 f(x,y) = 2 * x**2 + 3 * y**2
和 g(x,y) = x**2 + y**2 - 4
。
解決方案 :我們將通過執行以下步驟來解決此問題:
- 為問題指定拉格朗日函式
- 確定 Karush-Kuhn-
Tucker(KKT)
條件 - 找到滿足 KKT 條件的
(x,y)
元組 - 確定哪些
(x,y)
元組對應於f(x,y)
的最小值
首先,定義優化變數以及目標和約束函式:
import sympy as sp
x, y = sp.var('x,y',real=True);
f = 2 * x**2 + 3 * y**2
g = x**2 + y**2 - 4
接下來,定義拉格朗日函式,其包括對應於約束的拉格朗日乘數 lam
lam = sp.symbols('lambda', real = True)
L = f - lam* g
現在,我們可以計算對應於 KKT 條件的方程組。
gradL = [sp.diff(L,c) for c in [x,y]] # gradient of Lagrangian w.r.t. (x,y)
KKT_eqs = gradL + [g]
KKT_eqs
[-2*lambda*x + 4*x, -2*lambda*y + 6*y, x**2 + y**2 - 4]
f
(給定 g=0
)的潛在最小化是通過解決 KKT_eqs
方程得到的 x
,y
,lam
:
stationary_points = sp.solve(KKT_eqs, [x, y, lam], dict=True) # solve the KKT equations
stationary_points
[{x: -2, y: 0, lambda: 2}, {x: 2, y: 0, lambda: 2}, {x: 0, y: -2, lambda: 3}, {x: 0, y: 2, lambda: 3}]
最後,檢查上述每個點的目標函式以確定最小值
[f.subs(p) for p in stat_points]
[8, 8, 12, 12]
由此得出,f
的約束最小值等於 8
並且在 (x,y)=(-2,0)
和 (x,y)=(2,0)
處實現。