非线性规划中的连续二次规划算法基础题
题目描述
考虑如下非线性规划问题:
最小化目标函数 \(f(x) = (x_1 - 2)^2 + (x_2 - 1)^2\)
约束条件为:
\(g_1(x) = x_1 + x_2 - 2 \leq 0\)
\(g_2(x) = x_1^2 - x_2 \leq 0\)
初始点 \(x^{(0)} = (0, 0)\)。
要求使用连续二次规划算法求解该问题,并详细说明迭代过程。
解题过程
连续二次规划算法通过逐次求解二次规划子问题来逼近原非线性规划的解。每个子问题基于当前迭代点的函数值、梯度及Hessian信息构建,并通过线性化约束保留局部结构。
1. 算法原理
- 子问题构建:在第 \(k\) 次迭代中,以当前点 \(x^{(k)}\) 为中心,构建二次规划子问题:
最小化 \(\nabla f(x^{(k)})^T d + \frac{1}{2} d^T B_k d\)
约束为 \(g_i(x^{(k)}) + \nabla g_i(x^{(k)})^T d \leq 0 \quad (i=1,2)\),
其中 \(d = x - x^{(k)}\) 为搜索方向,\(B_k\) 为Hessian矩阵的近似(通常由BFGS更新得到)。 - 迭代更新:求解子问题得到方向 \(d^{(k)}\),通过线搜索确定步长 \(\alpha_k\),更新 \(x^{(k+1)} = x^{(k)} + \alpha_k d^{(k)}\)。
- 收敛条件:当 \(\| d^{(k)} \|\) 或目标函数变化量小于阈值时停止。
2. 初始点与梯度计算
初始点 \(x^{(0)} = (0, 0)\),计算梯度:
\(\nabla f(x) = [2(x_1 - 2), 2(x_2 - 1)]\),
\(\nabla g_1(x) = [1, 1]\),
\(\nabla g_2(x) = [2x_1, -1]\)。
在 \(x^{(0)}\) 处:
\(\nabla f(x^{(0)}) = [-4, -2]\),
\(g_1(x^{(0)}) = -2\),\(g_2(x^{(0)}) = 0\),
\(\nabla g_1(x^{(0)}) = [1, 1]\),\(\nabla g_2(x^{(0)}) = [0, -1]\)。
3. 第一次迭代(k=0)
- 构建子问题:
最小化 \([-4, -2]^T d + \frac{1}{2} d^T B_0 d\)(初始 \(B_0 = I\) 单位矩阵),
约束为:
\(-2 + [1, 1]^T d \leq 0\) → \(d_1 + d_2 \leq 2\),
\(0 + [0, -1]^T d \leq 0\) → \(-d_2 \leq 0\)。 - 求解子问题:
子问题为凸二次规划,通过拉格朗日法或KKT条件求解。
约束 \(-d_2 \leq 0\) 等价于 \(d_2 \geq 0\),结合 \(d_1 + d_2 \leq 2\)。
目标函数简化为 \(-4d_1 - 2d_2 + \frac{1}{2}(d_1^2 + d_2^2)\)。
求无约束极小点:令梯度为零得 \(d_1 = 4\),\(d_2 = 2\),但需验证约束。
代入约束:\(d_1 + d_2 = 6 > 2\) 不满足,因此解在边界 \(d_1 + d_2 = 2\) 上。
利用拉格朗日函数 \(L = -4d_1 - 2d_2 + \frac{1}{2}(d_1^2 + d_2^2) + \lambda (d_1 + d_2 - 2)\),
由KKT条件:
\(\frac{\partial L}{\partial d_1} = -4 + d_1 + \lambda = 0\),
\(\frac{\partial L}{\partial d_2} = -2 + d_2 + \lambda = 0\),
\(d_1 + d_2 = 2\)。
解得 \(d_1 = 2\),\(d_2 = 0\),\(\lambda = 2\)。
验证 \(d_2 \geq 0\) 满足。 - 步长选择:
简单线搜索(如 \(\alpha_0 = 1\))得 \(x^{(1)} = (0+2, 0+0) = (2, 0)\)。 - 更新Hessian近似:
使用BFGS公式更新 \(B_0 \rightarrow B_1\),需计算梯度差 \(y_0 = \nabla f(x^{(1)}) - \nabla f(x^{(0)}) = [0, 2] - [-4, -2] = [4, 4]\) 和位移 \(s_0 = x^{(1)} - x^{(0)} = [2, 0]\)。
BFGS更新:\(B_1 = B_0 - \frac{B_0 s_0 s_0^T B_0}{s_0^T B_0 s_0} + \frac{y_0 y_0^T}{y_0^T s_0}\)。
计算得 \(B_1 = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} - \frac{1}{4} \begin{pmatrix} 4 & 0 \\ 0 & 0 \end{pmatrix} + \frac{1}{8} \begin{pmatrix} 16 & 16 \\ 16 & 16 \end{pmatrix} = \begin{pmatrix} 3 & 2 \\ 2 & 3 \end{pmatrix}\)。
4. 第二次迭代(k=1)
- 当前点信息:\(x^{(1)} = (2, 0)\),
\(\nabla f(x^{(1)}) = [0, -2]\),
\(g_1(x^{(1)}) = 2\),\(g_2(x^{(1)}) = 4\),
\(\nabla g_1(x^{(1)}) = [1, 1]\),\(\nabla g_2(x^{(1)}) = [4, -1]\)。 - 构建子问题:
最小化 \([0, -2]^T d + \frac{1}{2} d^T B_1 d\)(\(B_1 = \begin{pmatrix} 3 & 2 \\ 2 & 3 \end{pmatrix}\)),
约束为:
\(2 + [1, 1]^T d \leq 0\) → \(d_1 + d_2 \leq -2\),
\(4 + [4, -1]^T d \leq 0\) → \(4d_1 - d_2 \leq -4\)。 - 求解子问题:
目标函数为 \(-2d_2 + \frac{1}{2}(3d_1^2 + 4d_1 d_2 + 3d_2^2)\)。
约束为线性,子问题为凸二次规划。
通过数值工具或KKT条件求解,得近似解 \(d \approx [-0.8, -1.2]\)。 - 更新与收敛:
取 \(\alpha_1 = 1\),\(x^{(2)} = (2 - 0.8, 0 - 1.2) = (1.2, -1.2)\)。
计算约束违反度:\(g_1(x^{(2)}) = 0\),\(g_2(x^{(2)}) = 1.44 + 1.2 = 2.64 > 0\),需继续迭代。
后续迭代类似,直至约束违反度和梯度范数足够小。
5. 最终结果
经过多次迭代后,算法收敛至近似解 \(x^* \approx (1, 1)\),此时 \(f(x^*) = 1\),约束 \(g_1(x^*) = 0\),\(g_2(x^*) = 0\),满足KKT条件。连续二次规划通过逐步精细化二次模型,有效处理非线性约束。