约束非线性优化

问题陈述

找到函数 f(x,y) 的最小值(超过 xy),取决于 g(x,y)=0,其中 f(x,y) = 2 * x**2 + 3 * y**2g(x,y) = x**2 + y**2 - 4

解决方案 :我们将通过执行以下步骤来解决此问题:

  1. 为问题指定拉格朗日函数
  2. 确定 Karush-Kuhn-Tucker(KKT) 条件
  3. 找到满足 KKT 条件的 (x,y) 元组
  4. 确定哪些 (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 方程得到的 xylam

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) 处实​​现。