最优化方法Python计算:求解约束优化问题的拉格朗日乘子算法

从仅有等式约束的问题入手。设优化问题(7.8)
{ minimize f ( x ) s.t. h ( x ) = o ( 1 ) \begin{cases} \text{minimize}\quad\quad f(\boldsymbol{x})\\ \text{s.t.}\quad\quad\quad \boldsymbol{h}(\boldsymbol{x})=\boldsymbol{o} \end{cases}\quad\quad(1) {minimizef(x)s.t.h(x)=o(1)
f ( x ) f(\boldsymbol{x}) f(x) h ( x ) \boldsymbol{h}(\boldsymbol{x}) h(x)均在 R n \text{R}^n Rn上二阶连续可微,且 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)是问题(1)满足二阶充分条件的KKT点。即 ∇ f ( x 0 ) − ∇ h ( x 0 ) λ 0 = 0 \nabla f(\boldsymbol{x}_0)-\nabla\boldsymbol{h}(\boldsymbol{x}_0)\boldsymbol{\lambda}_0=0 f(x0)h(x0)λ0=0 ∀ d ∈ { d ∣ d ≠ o , ∇ h ( x ) ⊤ d = o } \forall\boldsymbol{d}\in\{\boldsymbol{d}|\boldsymbol{d}\not=\boldsymbol{o},\nabla\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{d}=\boldsymbol{o}\} d{dd=o,h(x)d=o} d ⊤ ∇ x x L ( x 0 , λ 0 ) d > 0 \boldsymbol{d}^\top\nabla_{\boldsymbol{xx}} L(\boldsymbol{x}_0,\boldsymbol{\lambda}_0)\boldsymbol{d}>0 dxxL(x0,λ0)d>0。其中, L ( x , λ ) = f ( x ) − λ ⊤ h ( x ) L(\boldsymbol{x},\boldsymbol{\lambda})=f(\boldsymbol{x})-\boldsymbol{\lambda}^\top\boldsymbol{h}(\boldsymbol{x}) L(x,λ)=f(x)λh(x)为问题(1)的拉格朗日函数,其中的 λ ∈ R l \boldsymbol{\lambda}\in\text{R}^l λRl为拉格朗日乘子。
定义问题(7.8)的{\heiti{增广拉格朗日函数}}
L ( x , λ , σ ) = f ( x ) − λ ⊤ h ( x ) + σ 2 h ( x ) ⊤ h ( x ) ( 2 ) L(\boldsymbol{x},\boldsymbol{\lambda},\sigma)=f(\boldsymbol{x})-\boldsymbol{\lambda}^\top\boldsymbol{h}(\boldsymbol{x})+\frac{\sigma}{2}\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{h}(\boldsymbol{x})\quad\quad{(2)} L(x,λ,σ)=f(x)λh(x)+2σh(x)h(x)(2)
其中,罚因子 σ > 0 \sigma>0 σ>0。与问题(1)的拉格朗日函数 L ( x , λ ) L(\boldsymbol{x},\boldsymbol{\lambda}) L(x,λ)相比,增广拉格朗日函数 L ( x , λ , σ ) L(\boldsymbol{x},\boldsymbol{\lambda},\sigma) L(x,λ,σ)多了个罚项 σ 2 h ( x ) ⊤ h ( x ) \frac{\sigma}{2}\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{h}(\boldsymbol{x}) 2σh(x)h(x)。对问题(1)的增广拉格朗日函数(2),不难验证 ∀ x ∈ Ω \forall\boldsymbol{x}\in\Omega xΩ L ( x , λ , σ ) = f ( x ) L(\boldsymbol{x},\boldsymbol{\lambda},\sigma)=f(\boldsymbol{x}) L(x,λ,σ)=f(x)。可以证明以下命题:
定理1 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)是问题(1)满足二阶充分条件的KKT点,则存在 σ ′ ≥ 0 \sigma'\geq0 σ0,使得对任意的 σ > σ ′ \sigma>\sigma' σ>σ x 0 = arg ⁡ min ⁡ x ∈ R n L ( x , λ 0 , σ ) . \boldsymbol{x}_0=\arg\min_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_0,\sigma). x0=argxRnminL(x,λ0,σ).
反之,若 x 0 = arg ⁡ min ⁡ x ∈ R n L ( x , λ 0 , σ ) \boldsymbol{x}_0=\arg\min\limits_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_0,\sigma) x0=argxRnminL(x,λ0,σ),且 h ( x 0 ) = o \boldsymbol{h}(\boldsymbol{x}_0)=\boldsymbol{o} h(x0)=o,则 x 0 \boldsymbol{x}_0 x0是问题(1)的局部最优解,即 x 0 = arg ⁡ min ⁡ x ∈ Ω f ( x ) \boldsymbol{x}_0=\arg\min\limits_{\boldsymbol{x}\in\Omega}f(\boldsymbol{x}) x0=argxΩminf(x)
定理1将存在最优解满足二阶充分条件KKT点 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)的等式约束优化问题(1)求解,转化为对其增广拉格朗日函数 L ( x , λ 0 , σ ) L(\boldsymbol{x},\boldsymbol{\lambda}_0,\sigma) L(x,λ0,σ)作为目标函数的辅助无约束优化问题的求解,其中 σ > 0 \sigma>0 σ>0是一个充分大的实数。然而,一般情况下,拉格朗日乘子 λ 0 \boldsymbol{\lambda}_0 λ0未必已知。需设法用一系列 { λ k } \{\boldsymbol{\lambda}_k\} {λk}去逼近 λ 0 \boldsymbol{\lambda}_0 λ0
利用定理1,我们得到由初始的乘子 λ 1 \boldsymbol{\lambda}_1 λ1和罚因子 σ 1 > 0 \sigma_1>0 σ1>0出发,计算问题(1)的满足二阶充分条件的KKT点 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)近似值的迭代方法:计算
{ x k + 1 = arg ⁡ min ⁡ x ∈ R n L ( x , λ k , σ k ) λ k + 1 = λ k − σ k h ( x k ) . \begin{cases} \boldsymbol{x}_{k+1}=\arg\min\limits_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_k,\sigma_k)\\ \boldsymbol{\lambda}_{k+1}=\boldsymbol{\lambda}_k-\sigma_k\boldsymbol{h}(\boldsymbol{x}_{k}) \end{cases}. {xk+1=argxRnminL(x,λk,σk)λk+1=λkσkh(xk).
对给定的容错误差 ε > 0 \varepsilon>0 ε>0,若 ∥ h ( x k + 1 ) ∥ < ε \lVert\boldsymbol{h}(\boldsymbol{x}_{k+1})\rVert<\varepsilon h(xk+1)∥<ε,则停止迭代。 ( x k + 1 λ k + 1 ) \begin{pmatrix}\boldsymbol{x}_{k+1}\\\boldsymbol{\lambda}_{k+1}\end{pmatrix} (xk+1λk+1)即为 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)近似值。\par
否则,即 ∥ h ( x k + 1 ) ∥ ≥ ε \lVert\boldsymbol{h}(\boldsymbol{x}_{k+1})\rVert\geq\varepsilon h(xk+1)∥ε,用给定的放大系数 c > 1 c>1 c>1计算
σ k + 1 = { σ k ∥ h k + 1 ∥ ∥ h k ∥ < 1 c × σ k ∥ h k + 1 ∥ ∥ h k ∥ ≥ 1 , \sigma_{k+1}=\begin{cases} \sigma_k&\frac{\lVert\boldsymbol{h}_{k+1}\rVert}{\lVert\boldsymbol{h}_{k}\rVert}<1\\ c\times\sigma_k&\frac{\lVert\boldsymbol{h}_{k+1}\rVert}{\lVert\boldsymbol{h}_{k}\rVert}\geq1 \end{cases}, σk+1={σkc×σkhkhk+1<1hkhk+11,
进入下一轮迭代。
以上讨论的对等式约束优化问题的乘子算法是由 Powell和Hestenes于1969年提出的,常称为PH算法
对仅有不等式约束
{ minimize f ( x ) s.t.   g ( x ) ≥ o \begin{cases} \text{minimize}\quad f(\boldsymbol{x})\\ \text{s.t.\ \ }\quad\quad\boldsymbol{g}(\boldsymbol{x})\geq\boldsymbol{o} \end{cases} {minimizef(x)s.t.  g(x)o
其中, f : R n → R f:\text{R}^n\rightarrow\text{R} f:RnR g : R n → R m \boldsymbol{g}:\text{R}^n\rightarrow\text{R}^m g:RnRm R n \text{R}^n Rn上二阶连续可微。可行域 Ω = { x ∣ g ( x ) ≥ o } \Omega=\{\boldsymbol{x}|\boldsymbol{g}(\boldsymbol{x})\geq\boldsymbol{o}\} Ω={xg(x)o}。添加松弛变量 s ≥ o \boldsymbol{s}\geq\boldsymbol{o} so,构造等价问题
{ minimize f ( x ) s.t.   g ( x ) − s = o s ≥ o \begin{cases} \text{minimize}\quad f(\boldsymbol{x})\\ \text{s.t.\ \ }\quad\quad\boldsymbol{g}(\boldsymbol{x})-\boldsymbol{s}=\boldsymbol{o}\\ \quad\quad\quad\quad\boldsymbol{s}\geq\boldsymbol{o} \end{cases} minimizef(x)s.t.  g(x)s=oso
通过变换,上述问题可转换成等价的
{ minimize f ( x ) s.t. h 1 ( x ) = o . \begin{cases} \text{minimize}\quad\quad f(\boldsymbol{x})\\ \text{s.t.}\quad\quad\quad \boldsymbol{h}_1(\boldsymbol{x})=\boldsymbol{o} \end{cases}. {minimizef(x)s.t.h1(x)=o.
其中, h 1 ( x ) = min ⁡ ( 1 σ μ , g ( x ) ) \boldsymbol{h}_1(\boldsymbol{x})=\boldsymbol{\min}\left(\frac{1}{\sigma}\boldsymbol{\mu},\boldsymbol{g}(\boldsymbol{x})\right) h1(x)=min(σ1μ,g(x))
相仿地,对一般的优化问题
{ minimize f ( x ) s.t.   h ( x ) = o g ( x ) ≥ o ( 3 ) \begin{cases} \text{minimize}\quad f(\boldsymbol{x})\\ \text{s.t.\ \ }\quad\quad\boldsymbol{h}(\boldsymbol{x})=\boldsymbol{o}\\ \quad\quad\quad\quad\boldsymbol{g}(\boldsymbol{x})\geq\boldsymbol{o} \end{cases}\quad\quad(3) minimizef(x)s.t.  h(x)=og(x)o(3)
其中 f ( x ) f(\boldsymbol{x}) f(x) h ( x ) \boldsymbol{h}(\boldsymbol{x}) h(x) g ( x ) \boldsymbol{g}(\boldsymbol{x}) g(x) R n \text{R}^n Rn上二阶连续可微,可行域 Ω = { x ∣ h ( x ) = o , g ( x ≥ o ) } \Omega=\{\boldsymbol{x}|\boldsymbol{h}(\boldsymbol{x})=\boldsymbol{o},\boldsymbol{g}(\boldsymbol{x}\geq\boldsymbol{o})\} Ω={xh(x)=o,g(xo)}。为求解其满足二阶充分条件的KKT点 ( x 0 λ 0 μ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\\\boldsymbol{\mu}_0\end{pmatrix} x0λ0μ0 ,将其转换为与之等价的问题
{ minimize f ( x ) s.t.   h ( x ) = o h 1 ( x ) = o . ( 4 ) \begin{cases} \text{minimize}\quad f(\boldsymbol{x})\\ \text{s.t.\ \ }\quad\quad\boldsymbol{h}(\boldsymbol{x})=\boldsymbol{o}\\ \quad\quad\quad\quad\boldsymbol{h}_1(\boldsymbol{x})=\boldsymbol{o} \end{cases}.\quad\quad{(4)} minimizef(x)s.t.  h(x)=oh1(x)=o.(4)
其增广拉格朗日函数为
L ( x , λ , μ , σ ) = f ( x ) − λ ⊤ h ( x ) − μ ⊤ h 1 ( x ) + σ 2 ( h ( x ) ⊤ h ( x ) + h 1 ( x ) ⊤ h 1 ( x ) ) L(\boldsymbol{x},\boldsymbol{\lambda},\boldsymbol{\mu},\sigma)=f(\boldsymbol{x})-\boldsymbol{\lambda}^\top\boldsymbol{h}(x)-\boldsymbol{\mu}^\top\boldsymbol{h_1}(\boldsymbol{x})+\frac{\sigma}{2}(\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{h}(\boldsymbol{x})+\boldsymbol{h}_1(\boldsymbol{x})^\top\boldsymbol{h}_1(\boldsymbol{x})) L(x,λ,μ,σ)=f(x)λh(x)μh1(x)+2σ(h(x)h(x)+h1(x)h1(x))
对初始乘子 λ 1 \boldsymbol{\lambda}_1 λ1 μ 1 \boldsymbol{\mu}_1 μ1,罚因子 σ 1 \sigma_1 σ1,用拉格朗日乘子法计算问题(7.10)满足二阶充分条件的KKT点 ( x 0 λ 0 μ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\\\boldsymbol{\mu}_0\end{pmatrix} x0λ0μ0 的近似值,迭代式为
{ x k + 1 = arg ⁡ min ⁡ x ∈ R n L ( x , λ k , μ k , σ k ) λ k + 1 = λ k − σ k h ( x k ) μ k + 1 = max ⁡ ( o , μ k − σ k g ( x k ) ) , \begin{cases} \boldsymbol{x}_{k+1}=\arg\min\limits_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_k,\boldsymbol{\mu}_k,\sigma_k)\\ \boldsymbol{\lambda}_{k+1}=\boldsymbol{\lambda}_k-\sigma_k\boldsymbol{h}(\boldsymbol{x}_k)\\ \boldsymbol{\mu}_{k+1}=\boldsymbol{\max}(\boldsymbol{o},\boldsymbol{\mu}_k-\sigma_k\boldsymbol{g}(\boldsymbol{x}_k)) \end{cases}, xk+1=argxRnminL(x,λk,μk,σk)λk+1=λkσkh(xk)μk+1=max(o,μkσkg(xk)),
对给定的容错误差 ε > 0 \varepsilon>0 ε>0,记 β = ∥ h ( x k ) ∥ + ∥ h 1 ( x k ) ∥ \beta=\lVert\boldsymbol{h}(\boldsymbol{x}_k)\rVert+\lVert\boldsymbol{h}_1(\boldsymbol{x}_k)\rVert β=h(xk)∥+h1(xk)∥,则迭代终止条件为
β < ε , \beta<\varepsilon, β<ε,
罚因子扩大条件为
β n e w β o l d = ∥ h ( x k + 1 ) ∥ + ∥ h 1 ( x k + 1 ) ∥ ∥ h ( x k ) ∥ + ∥ h 1 ( x k ) ∥ ≥ η . \frac{\beta_{new}}{\beta_{old}}=\frac{\lVert\boldsymbol{h}(\boldsymbol{x}_{k+1})\rVert+\lVert\boldsymbol{h}_1(\boldsymbol{x}_{k+1})\rVert}{\lVert\boldsymbol{h}(\boldsymbol{x}_k)\rVert+\lVert\boldsymbol{h}_1(\boldsymbol{x}_k)\rVert}\geq\eta. βoldβnew=h(xk)∥+h1(xk)∥h(xk+1)∥+h1(xk+1)∥η.
其中 η ∈ ( 0 , 1 ) \eta\in(0,1) η(0,1)。这一算法是Rockfellar于1973年,在PH算法的基础上提出的,常称为PHR算法。下列代码实现PHR算法。

import numpy as np											#导入numpy
from scipy.optimize import minimize, OptimizeResult			#导入minimize和OptimizeResult
def phr(f, x1, h = None, g = None, eps = 1e-5):
    k = 0
    sigmak = 10
    c = 2.5
    eta = 0.8
    if callable(h):											#有等式约束
        l = h(x1).size
        lamdak = 0.1 * np.ones(l)
    else:													#无等式约束
        lamdak = np.zeros(1)
        h = lambda x: np.zeros(1)
    if callable(g):											#有不等式约束
        m = g(x1).size
        muk = 0.1 * np.ones(m)
        h1 = lambda x: np.minimum(muk / sigmak, g(x))
    else:													#无不等式约束
        muk = np.zeros(1)
        h1 = g = lambda x: np.zeros(1)
        m = 1
    zero = np.zeros(m)										#零向量
    P = lambda x: np.dot(h(x), h(x)) + np.dot(h1(x), h1(x))	#罚函数
    L = lambda x: f(x) - np.dot(lamdak, h(x)) - \			#增广拉格朗日函数
                  np.dot(muk, h1(x)) + 0.5 * sigmak * P(x)
    xk = x1													#迭代点
    bnew = bold = np.linalg.norm(h(xk)) + np.linalg.norm(h1(xk))#新、旧beta值
    while bnew >= eps:
        k += 1
        xk = minimize(L, xk).x								#更新迭代点
        lamdak = lamdak - sigmak * h(xk)					#更新乘子lambda
        muk = np.maximum(zero, muk - sigmak * g(xk))		#更新乘子mu
        if bnew / bold >= eta:								#须扩大罚因子
            sigmak *= c
        bold = bnew											#保存beta
        bnew = np.linalg.norm(h(xk)) + np.linalg.norm(h1(xk))#更新beta
    return OptimizeResult(fun = f(xk), x = xk, nit = k)

程序的第3~37行定义的函数phr实现图7.4所示的乘子算法PHR。该函数的5个参数f,x1,h,g和eps分别表示优化问题(3)的目标函数 f ( x ) f(\boldsymbol{x}) f(x),初始迭代点 x 1 \boldsymbol{x}_1 x1,等式约束函数 h ( x ) \boldsymbol{h}(\boldsymbol{x}) h(x),不等式约束函数 h ( x ) \boldsymbol{h}(\boldsymbol{x}) h(x)和容错误差 ε \varepsilon ε。其中,h,g和eps的缺省值分别为None、None和 1 0 − 5 10^{-5} 105
函数体内,第4~7行分别初始化迭代次数 k k k,罚因子 σ k \sigma_k σk,罚因子放大系数 c c c和罚因子放大判别值 η \eta η
第8~13行的if-else语句根据是否有等式约束,初始化乘子 λ \boldsymbol{\lambda} λ:若是,初始化为含有 l l l个0.1的向量,否则置为0。相仿地,第14~21行的if-else语句设置乘子 μ \boldsymbol{\mu} μ函数及 h 1 ( x ) = min ⁡ { μ σ k , g ( x ) } \boldsymbol{h}_1(\boldsymbol{x})=\min\left\{\frac{\boldsymbol{\mu}}{\sigma_k},\boldsymbol{g}(\boldsymbol{x})\right\} h1(x)=min{σkμ,g(x)}
第23~25行定义罚函数和增广拉格朗日函数
P ( x ) = h ( x ) ⊤ h ( x ) + h 1 ( x ) ⊤ h 1 ( x ) L ( x ) = f ( x ) − λ ⊤ h ( x ) − μ ⊤ h 1 ( x ) + σ k 2 P ( x ) . \begin{array}{l} P(\boldsymbol{x})=\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{h}(\boldsymbol{x})+\boldsymbol{h}_1(\boldsymbol{x})^\top\boldsymbol{h}_1(\boldsymbol{x})\\ L(\boldsymbol{x})=f(\boldsymbol{x})-\boldsymbol{\lambda}^\top\boldsymbol{h}(x)-\boldsymbol{\mu}^\top\boldsymbol{h}_1(\boldsymbol{x})+\frac{\sigma_k}{2}P(\boldsymbol{x}) \end{array}. P(x)=h(x)h(x)+h1(x)h1(x)L(x)=f(x)λh(x)μh1(x)+2σkP(x).
第26行初始化迭代点xk,第27行将 β n e w \beta_{new} βnew β o l d \beta_{old} βold初始化为 ∥ h ( x k ) ∥ + ∥ h 1 ( x k ) ∥ \lVert\boldsymbol{h}(\boldsymbol{x}_k)\rVert+\lVert\boldsymbol{h}_1(\boldsymbol{x}_k)\rVert h(xk)∥+h1(xk)∥
第28~36行的while循环执行算法的迭代。其中,第30~32行按
{ x k + 1 = arg ⁡ min ⁡ x ∈ R n L ( x , λ k , μ k , σ k ) λ k + 1 = λ k − σ k h ( x k ) μ k + 1 = max ⁡ ( o , μ k − σ k g ( x k ) ) , \begin{cases} \boldsymbol{x}_{k+1}=\arg\min\limits_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_k,\boldsymbol{\mu}_k,\sigma_k)\\ \boldsymbol{\lambda}_{k+1}=\boldsymbol{\lambda}_k-\sigma_k\boldsymbol{h}(\boldsymbol{x}_k)\\ \boldsymbol{\mu}_{k+1}=\boldsymbol{\max}(\boldsymbol{o},\boldsymbol{\mu}_k-\sigma_k\boldsymbol{g}(\boldsymbol{x}_k)) \end{cases}, xk+1=argxRnminL(x,λk,μk,σk)λk+1=λkσkh(xk)μk+1=max(o,μkσkg(xk)),
更新迭代点xk,乘子lamdk和muk。第33~34行根据是否
β n e w β o l d ≥ η \frac{\beta_{new}}{\beta_{old}}\geq\eta βoldβnewη
决定扩大罚因子 σ k \sigma_k σk。第35、36行更新 β o l d \beta_{old} βold β n e w \beta_{new} βnew,以备进入下一轮迭代。一旦测得
β n e w < ε \beta_{new}<\varepsilon βnew<ε
迭代结束,第37行返回最优解近似值xk,最优值近似值f(xk)和迭代次数k。
例1:用程序7.11定义的phr函数求解优化问题
{ minimize f ( x ) = ( x 1 − 2 ) 2 + ( x 2 − 1 ) 2 s.t.   x 1 − 2 x 2 + 1 = 0 1 4 x 1 2 + x 2 2 ≤ 1 , \begin{cases} \text{minimize}\quad f(\boldsymbol{x})=(x_1-2)^2+(x_2-1)^2\\ \text{s.t.\ \ }\quad\quad\quad x_1-2x_2+1=0\\ \quad\quad\quad\quad\quad \frac{1}{4}x_1^2+x_2^2\leq1 \end{cases}, minimizef(x)=(x12)2+(x21)2s.t.  x12x2+1=041x12+x221,
给定初始迭代点 x 1 = ( 3 3 ) \boldsymbol{x}_1=\begin{pmatrix}3\\3\end{pmatrix} x1=(33)
:本题中目标函数 f ( x ) = ( x 1 − 2 ) 2 + ( x 2 − 1 ) 2 f(\boldsymbol{x})=(x_1-2)^2+(x_2-1)^2 f(x)=(x12)2+(x21)2,等式约束函数 h ( x ) = x 1 − 2 x 2 + 1 h(\boldsymbol{x})=x_1-2x_2+1 h(x)=x12x2+1,不等式约束函数 g ( x ) = 1 − 1 4 x 1 2 − x 2 2 g(\boldsymbol{x})=1-\frac{1}{4}x_1^2-x_2^2 g(x)=141x12x22。下列代码完成计算。

import numpy as np								#导入numpy
from utility import phr							#导入phr
np.set_printoptions(precision=4)				#设置输出精度
f = lambda x: (x[0] - 2) ** 2 + (x[1] - 1) ** 2	#目标函数
h = lambda x: x[0] - 2 * x[1] + 1				#等式约束函数
g = lambda x: 1 - 0.25 * x[0] ** 2 - x[1] ** 2	#不等式约束函数
x1 = np.array([3, 3])							#初始迭代点
print(phr(f, x1, h, g))

利用代码内注释信息不难理解程序。运行程序,输出

 fun: 1.3934640206427056
 nit: 5
   x: array([0.8229, 0.9114])

意为phr用5次迭代,以 1 0 − 5 10^{-5} 105的容错误差,算得最优解近似值 x 0 ≈ ( 0.8229 0.9114 ) \boldsymbol{x}_0\approx\begin{pmatrix}0.8229\\0.9114\end{pmatrix} x0(0.82290.9114),最优值的近似值 f ( x 0 ) ≈ 1.3934 f(\boldsymbol{x}_0)\approx1.3934 f(x0)1.3934
例2:用phr函数求解求解线性规划
{ minimize x 1 − x 2 s.t.      − x 1 + 2 x 2 + x 3 ≤ 2 − 4 x 1 + 4 x 2 − x 3 = 4 x 1 − x 3 = 0 x 1 , x 2 , x 3 ≥ 0 , \begin{cases} \text{minimize}\quad\quad x_1-x_2\\ \text{s.t.\ \ \ \ \ }\quad\quad -x_1+2x_2+x_3\leq2\\ \quad\quad\quad\quad\quad -4x_1+4x_2-x_3=4\\ \quad\quad\quad\quad\quad x_1-x_3=0\\ \quad\quad\quad\quad\quad x_1,x_2,x_3\geq0 \end{cases}, minimizex1x2s.t.     x1+2x2+x324x1+4x2x3=4x1x3=0x1,x2,x30,
给定初始迭代点 x 1 = o \boldsymbol{x}_1=\boldsymbol{o} x1=o。\par
:这个线性规划的数据矩阵为
c = ( 1 − 1 0 ) , A e q = ( − 4 4 − 1 1 0 − 1 ) , b e q = ( 4 0 ) , A i q = ( 1 − 2 − 1 1 0 0 0 1 0 0 0 1 ) , b i q = ( − 2 0 0 0 ) . \boldsymbol{c}=\begin{pmatrix}1\\-1\\0\end{pmatrix},\boldsymbol{A}_{eq}=\begin{pmatrix}-4&4&-1\\1&0&-1\end{pmatrix},\boldsymbol{b}_{eq}=\begin{pmatrix}4\\0\end{pmatrix},\boldsymbol{A}_{iq}=\begin{pmatrix}1&-2&-1\\1&0&0\\0&1&0\\0&0&1\end{pmatrix},\boldsymbol{b}_{iq}=\begin{pmatrix}-2\\0\\0\\0\end{pmatrix}. c= 110 ,Aeq=(414011),beq=(40),Aiq= 110020101001 ,biq= 2000 .
于是
f ( x ) = c ⊤ x , h ( x ) = A e q − b e q , g ( x ) = A i q − b i p . f(\boldsymbol{x})=\boldsymbol{c}^\top\boldsymbol{x},\quad\boldsymbol{h}(\boldsymbol{x})=\boldsymbol{A}_{eq}-\boldsymbol{b}_{eq},\quad\boldsymbol{g}(\boldsymbol{x})=\boldsymbol{A}_{iq}-\boldsymbol{b}_{ip}. f(x)=cx,h(x)=Aeqbeq,g(x)=Aiqbip.,下列程序完成计算。

import numpy as np					#导入numpy
c = np.array([1, -1, 0])			#向量c
Ae = np.array([[-4, 4, -1],			#矩阵Aeq
               [1, 0, -1]])
be = np.array([4, 0])				#向量beq
Ai = np.array([[1, -2, -1],			#矩阵Aiq
               [1, 0, 0],
               [0, 1, 0],
               [0, 0, 1]])
bi = np.array([-2, 0, 0, 0])		#向量biq
f = lambda x: np.dot(c, x)			#目标函数
h = lambda x: np.matmul(Ae, x) - be	#等式约束函数
g = lambda x: np.matmul(Ai, x) - bi	#不等式约束函数
x1 = np.zeros(3)					#初始迭代点
print(phr(f, x1, h, g))

运行程序,输出

 fun: -0.9999999986126238
 nit: 2
   x: array([-5.4602e-08,  1.0000e+00, -8.5667e-09])

意为phr只用了2次迭代,即得到最优解 x 0 = ( 0 1 0 ) \boldsymbol{x}_0=\begin{pmatrix}0\\1\\0\end{pmatrix} x0= 010 ,最优值 f ( x 0 ) = − 1 f(\boldsymbol{x}_0)=-1 f(x0)=1。而对同一问题,sumt(见博文《最优化方法Python计算:求解约束优化问题的罚函数算法》)却用了8次迭代获得同样的结果。
例3:用phr函数求解二次规划
{ minimize x 1 2 + x 1 x 2 + 2 x 2 2 + x 3 2 − 6 x 1 − 2 x 2 − 12 x 3 s.t.   x 1 + x 2 + x 3 − 2 = 0 x 1 − 2 x 2 + 3 ≥ 0 x 1 , x 2 , x 3 ≥ 0 , \begin{cases} \text{minimize}\quad x_1^2+x_1x_2+2x_2^2+x_3^2-6x_1-2x_2-12x_3\\ \text{s.t.\ \ }\quad\quad\quad x_1+x_2+x_3-2=0\\ \quad\quad\quad\quad\quad x_1-2x_2+3\geq0\\ \quad\quad\quad\quad\quad x_1,x_2,x_3\geq0 \end{cases}, minimizex12+x1x2+2x22+x326x12x212x3s.t.  x1+x2+x32=0x12x2+30x1,x2,x30,
给定初始可行解 x 1 = ( 1 1 0 ) \boldsymbol{x}_1=\begin{pmatrix}1\\1\\0\end{pmatrix} x1= 110
:本二次规划的数据矩阵为
H = ( 2 1 0 1 4 0 0 0 2 ) , c = ( − 6 − 2 − 12 ) A e q = ( 1 1 1 ) , b e q = ( 2 ) A i q = ( 1 − 2 0 1 0 0 0 1 0 0 0 1 ) , b i q = ( − 3 0 0 0 ) \begin{array}{l} \boldsymbol{H}=\begin{pmatrix}2&1&0\\1&4&0\\0&0&2\end{pmatrix},\boldsymbol{c}=\begin{pmatrix}-6\\-2\\-12\end{pmatrix}\\ \boldsymbol{A}_{eq}=\begin{pmatrix}1&1&1\end{pmatrix},\boldsymbol{b}_{eq}=(2)\\ \boldsymbol{A}_{iq}=\begin{pmatrix}1&-2&0\\1&0&0\\0&1&0\\0&0&1\end{pmatrix},\boldsymbol{b}_{iq}=\begin{pmatrix}-3\\0\\0\\0\end{pmatrix} \end{array} H= 210140002 ,c= 6212 Aeq=(111),beq=(2)Aiq= 110020100001 ,biq= 3000
下列代码完成计算。

import numpy as np									#导入numpy
H = np.array([[2, 1, 0],							#矩阵H
              [1, 4, 0],
              [0, 0, 2]])
c = np.array([-6, -2, -12])							#向量c
Ae = np.array([[1, 1, 1]])							#矩阵Aeq
be = np.array([2])									#向量beq
Ai = np.array([[-1, -2, 0],							#矩阵Aiq
               [1, 0, 0],
               [0, 1, 0],
               [0, 0, 1]])
bi = np.array([-3, 0, 0, 0])						#向量biq
x1 = np.array([1, 1, 0])							#初始迭代点
f = lambda x: 0.5 * np.matmul(x, np.matmul(H, x)) + np.matmul(c, x)	#目标函数
h = lambda x: np.matmul(Ae, x) - be					#等式约束函数
g = lambda x: np.matmul(Ai, x) - bi					#不等式约束函数
print(phr(f, x1, h, g))
\end{lstlisting}\par

运行程序,输出

 fun: -20.000001376228557
 nit: 7
   x: array([-9.6384e-08, -1.2540e-07,  2.0000e+00])

即phr函数用7次迭代,算得该二次规划的最优解 x 0 = ( 0 0 2 ) \boldsymbol{x}_0=\begin{pmatrix}0\\0\\2\end{pmatrix} x0= 002 ,最优值 f ( x 0 ) = − 20 f(\boldsymbol{x}_0)=-20 f(x0)=20。相较于sumt函数(见博文《最优化方法Python计算:求解约束优化问题的罚函数算法》)用16次迭代获得同样结果,效率提高是明显的。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牛顿-拉格朗日法可以用于求解优化问题,其中最常见的就是非线性规划问题。下面是一个使用Python实现牛顿-拉格朗日求解非线性规划问题的示例代码: ```python import numpy as np from scipy.optimize import minimize # 定义目标函数及其梯度 def objective(x): return x[0]**2 + x[1]**2 def gradient(x): return np.array([2*x[0], 2*x[1]]) # 定义约束条件及其梯度 def constraint1(x): return x[0]**2 - x[1] def constraint2(x): return 1 - x[0] def constraint3(x): return x[1] def constraint1_grad(x): return np.array([2*x[0], -1]) def constraint2_grad(x): return np.array([-1, 0]) def constraint3_grad(x): return np.array([0, 1]) # 使用牛顿-拉格朗日求解非线性规划问题 def solve(): x0 = np.array([0.5, 0.5]) cons = [{'type': 'ineq', 'fun': constraint1, 'jac': constraint1_grad}, {'type': 'ineq', 'fun': constraint2, 'jac': constraint2_grad}, {'type': 'ineq', 'fun': constraint3, 'jac': constraint3_grad}] res = minimize(objective, x0, method='SLSQP', jac=gradient, constraints=cons) return res # 打印结果 res = solve() print(res) ``` 在这个示例中,我们定义了一个目标函数和三个约束条件(分别为不等式约束),然后使用`minimize`函数和`method='SLSQP'`参数来调用牛顿-拉格朗日求解非线性规划问题。最后,我们打印出了求解结果。 需要注意的是,使用牛顿-拉格朗日求解非线性规划问题需要定义目标函数、约束条件及其梯度,这对于复杂的问题来说可能较为困难。此外,在实际应用中,还需要注意算法的收敛性、数值稳定性等问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值