非线性规划中的序列二次约束规划法基础题
字数 2292 2025-10-28 11:34:06
非线性规划中的序列二次约束规划法基础题
题目描述
考虑非线性规划问题:
最小化 \(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 \geq 0\)
- \(x_1, x_2 \in \mathbb{R}\)。
目标是在满足约束的前提下找到使 \(f(x)\) 最小的点 \(x^*\)。
解题过程
序列二次约束规划法(SQCP)通过迭代求解一系列二次约束子问题逼近原问题解。每个子问题在原当前点对目标函数和约束进行近似,并添加信赖域约束保证收敛。
步骤1: 问题重构
- 将不等式约束统一为 \(g_j(x) \leq 0\) 形式:
- \(g_1(x) = x_1 + x_2 - 2 \leq 0\) 保持不变。
- \(g_2(x) = -x_1^2 + x_2 \geq 0\) 改写为 \(g_2(x) = x_1^2 - x_2 \leq 0\)。
- 目标函数 \(f(x)\) 为二次函数,约束 \(g_2(x)\) 非线性,需线性化。
步骤2: 初始点选择
选择可行点作为初始点 \(x^{(0)}\)。验证可行性:
- 若选 \(x^{(0)} = (0, 0)\),则 \(g_1(0,0) = -2 \leq 0\)(满足),\(g_2(0,0) = 0 \leq 0\)(满足)。可行。
步骤3: 构建第k次迭代子问题
在点 \(x^{(k)}\) 处,对目标函数 \(f(x)\) 作二次近似,对非线性约束 \(g_2(x)\) 作线性近似:
- 目标函数近似:因 \(f(x)\) 本身为二次函数,直接保留原形式:
\(f(x) \approx (x_1 - 2)^2 + (x_2 - 1)^2\)。 - 约束线性化:
- \(g_1(x)\) 已是线性,保持不变。
- \(g_2(x) = x_1^2 - x_2\) 在 \(x^{(k)}\) 处一阶泰勒展开:
\(g_2(x) \approx g_2(x^{(k)}) + \nabla g_2(x^{(k)})^T (x - x^{(k)})\),
其中梯度 \(\nabla g_2(x) = (2x_1, -1)\)。
- 添加信赖域约束 \(\|x - x^{(k)}\| \leq \Delta_k\) 控制步长,\(\Delta_k > 0\) 为信赖域半径。
子问题形式为:
最小化 \(f(x) = (x_1 - 2)^2 + (x_2 - 1)^2\)
约束条件:
- \(g_1(x) = x_1 + x_2 - 2 \leq 0\)
- \(g_2(x^{(k)}) + \nabla g_2(x^{(k)})^T (x - x^{(k)}) \leq 0\)
- \(\|x - x^{(k)}\| \leq \Delta_k\)。
步骤4: 迭代求解(以第0次迭代为例)
初始点 \(x^{(0)} = (0, 0)\),设 \(\Delta_0 = 0.5\)。
- 计算梯度: \(\nabla g_2(0,0) = (0, -1)\),\(g_2(0,0) = 0\)。
- 子问题约束:
- \(g_1(x) \leq 0\)
- \(0 + (0, -1) \cdot (x_1 - 0, x_2 - 0) \leq 0\) → \(-x_2 \leq 0\) → \(x_2 \geq 0\)(注意符号方向)。
- \(\|x - (0,0)\| \leq 0.5\)。
子问题简化为:
最小化 \((x_1 - 2)^2 + (x_2 - 1)^2\)
约束:
- \(x_1 + x_2 \leq 2\)
- \(x_2 \geq 0\)
- \(x_1^2 + x_2^2 \leq 0.25\)。
- 求解子问题:
- 可行域是半径为0.5的圆盘与半平面 \(x_2 \geq 0\) 的交集,且包含在 \(x_1 + x_2 \leq 2\) 内(该约束此时松弛)。
- 目标函数梯度指向点 (2,1),在圆盘上最小值出现在圆盘边界靠近 (2,1) 的点。通过几何分析或拉格朗日法解出:最优解为 \(x^{(1)} \approx (0.5, 0)\)(详细计算略)。
步骤5: 更新与收敛检查
- 计算约束违反度:原约束 \(g_2(x) = x_1^2 - x_2\) 在 \(x^{(1)}\) 处值为 \(0.25 - 0 = 0.25 > 0\),违反约束。
- 调整策略:由于约束被违反,需缩小信赖域半径(如 \(\Delta_1 = 0.3\))或增加惩罚项,重新求解子问题。
- 重复迭代直至 \(\|x^{(k+1)} - x^{(k)}\|\) 和约束违反度小于容忍值(如 \(10^{-6}\))。
最终解
持续迭代后,收敛至可行点 \(x^* \approx (1, 1)\),此时 \(f(x^*) = 1\),约束满足(\(g_1(1,1)=0\), \(g_2(1,1)=0\))。