非线性规划中的近似Hessian序列二次规划算法(SQP with Approximate Hessian)进阶题
题目描述
考虑以下带非线性等式与不等式约束的非线性规划问题:
\[\begin{aligned} \min_{x \in \mathbb{R}^n} \quad & f(x) \\ \text{s.t.} \quad & c_i(x) = 0, \quad i = 1, \dots, m_e, \\ & c_i(x) \geq 0, \quad i = m_e+1, \dots, m, \end{aligned} \]
其中目标函数 \(f: \mathbb{R}^n \to \mathbb{R}\) 和约束函数 \(c_i: \mathbb{R}^n \to \mathbb{R}\) 均为二阶连续可微,但Hessian矩阵计算代价昂贵。在标准序列二次规划(SQP)中,每一步需求解一个二次子问题,该子问题的Hessian矩阵需利用拉格朗日函数的二阶信息。当问题规模较大或二阶导数难以精确计算时,使用近似Hessian(例如拟牛顿更新)构建子问题是提高效率的关键。本题要求:
- 推导基于近似Hessian的SQP算法框架,并说明如何利用BFGS或SR1拟牛顿公式更新近似Hessian。
- 设计一种自适应策略,在迭代中根据约束违反度和目标函数下降动态调整近似Hessian的更新准则,确保子问题的正定性及算法全局收敛。
- 针对以下具体实例进行数值求解验证:
\[\begin{aligned} \min \quad & f(x) = (x_1 - 1)^2 + (x_2 - 2.5)^2 + (x_3 + 0.5)^4, \\ \text{s.t.} \quad & x_1 - 2x_2 + 2 \geq 0, \\ & -x_1 - 2x_2 + 6 \geq 0, \\ & -x_1 + 2x_2 + 2 \geq 0, \\ & x_1 + x_2 + x_3 = 3, \\ & x_1, x_2, x_3 \in \mathbb{R}. \end{aligned} \]
- 分析近似Hessian的误差对收敛速度的影响,并与精确Hessian的SQP进行对比。
解题过程循序渐进讲解
步骤1:理解标准SQP与近似Hessian的必要性
标准SQP在每次迭代中,在当前点 \(x_k\) 构造二次子问题:
\[\begin{aligned} \min_{d \in \mathbb{R}^n} \quad & \nabla f(x_k)^\top d + \frac{1}{2} d^\top B_k d \\ \text{s.t.} \quad & \nabla c_i(x_k)^\top d + c_i(x_k) = 0, \quad i=1,\dots,m_e, \\ & \nabla c_i(x_k)^\top d + c_i(x_k) \geq 0, \quad i=m_e+1,\dots,m, \end{aligned} \]
其中 \(B_k\) 应是拉格朗日函数 \(L(x, \lambda) = f(x) - \sum \lambda_i c_i(x)\) 的Hessian \(\nabla_{xx}^2 L(x_k, \lambda_k)\) 的近似。
- 精确计算 \(\nabla_{xx}^2 L\) 需所有二阶导数,对于高维或复杂函数成本高昂。
- 拟牛顿法用一阶信息构建 \(B_k\),常见更新有BFGS(保持正定)和SR1(不保证正定但可能更精确)。
关键思路:用近似 \(B_k\) 代替精确Hessian,在每次迭代中更新 \(B_k\) 使其逼近 \(\nabla_{xx}^2 L\)。
步骤2:近似Hessian的更新公式推导
定义拉格朗日函数在迭代中的梯度差:
\[s_k = x_{k+1} - x_k, \quad y_k = \nabla_x L(x_{k+1}, \lambda_{k+1}) - \nabla_x L(x_k, \lambda_{k+1}), \]
其中 \(\lambda_{k+1}\) 是当前子问题的乘子估计。
BFGS更新(保证正定性,若 \(s_k^\top y_k > 0\)):
\[B_{k+1} = B_k - \frac{B_k s_k s_k^\top B_k}{s_k^\top B_k s_k} + \frac{y_k y_k^\top}{s_k^\top y_k}. \]
条件 \(s_k^\top y_k > 0\) 可通过线搜索保证。
SR1更新(不强制正定,但适合非凸问题):
\[B_{k+1} = B_k + \frac{(y_k - B_k s_k)(y_k - B_k s_k)^\top}{(y_k - B_k s_k)^\top s_k}, \]
要求分母不为零,否则跳过更新。
在约束优化中,乘子 \(\lambda_{k+1}\) 需从子问题解出,进而计算 \(y_k\)。
步骤3:自适应更新策略设计
近似Hessian的更新需平衡近似质量与数值稳定性。设计自适应策略如下:
- 判断是否更新:计算比值
\[ r_k = \frac{|(y_k - B_k s_k)^\top s_k|}{\|y_k\| \|s_k\|}. \]
若 \(r_k < \tau\)(例如 \(\tau = 10^{-6}\)),则认为 \(B_k\) 已足够近似,跳过更新以节省计算。
- 正定性监控:对于BFGS,检查曲率条件 \(s_k^\top y_k > \epsilon \|s_k\| \|y_k\|\)(如 \(\epsilon=10^{-8}\))。若不满足,采用阻尼BFGS:
\[ \tilde{y}_k = y_k + \theta_k B_k s_k, \quad \theta_k = \max\left(0, \frac{(0.2 s_k^\top B_k s_k - s_k^\top y_k)}{s_k^\top B_k s_k}\right). \]
用 \(\tilde{y}_k\) 替换 \(y_k\) 进行BFGS更新。
- 更新准则选择:根据约束违反度 \(\eta_k = \sum |c_i(x_k)|\) 和目标下降 \(\Delta f_k = f(x_{k-1}) - f(x_k)\):
- 若 \(\eta_k\) 较大,说明迭代点远离可行域,优先使用BFGS保证子问题凸性。
- 若 \(\eta_k\) 小且 \(\Delta f_k\) 小,接近最优解,可尝试SR1以获得更准确Hessian近似。
步骤4:完整算法框架
- 初始化:给定初始点 \(x_0\),初始 \(B_0 = I\)(单位阵),初始乘子估计 \(\lambda_0 = 0\),容忍误差 \(\epsilon\)。
- 循环(对于 \(k=0,1,2,\dots\)):
a. 计算 \(f(x_k)\)、\(c_i(x_k)\)、\(\nabla f(x_k)\)、\(\nabla c_i(x_k)\)。
b. 构造二次子问题,其中Hessian近似为 \(B_k\)。
c. 求解子问题得位移 \(d_k\) 和乘子 \(\lambda_{k+1}\)。
d. 进行线搜索(如Merit函数或Filter法)确定步长 \(\alpha_k\),更新 \(x_{k+1} = x_k + \alpha_k d_k\)。
e. 计算 \(s_k = x_{k+1} - x_k\) 和 \(y_k = \nabla_x L(x_{k+1}, \lambda_{k+1}) - \nabla_x L(x_k, \lambda_{k+1})\)。
f. 根据自适应策略更新 \(B_k \to B_{k+1}\)。
g. 若收敛准则满足(如 \(\|d_k\| < \epsilon\) 且约束违反度小),停止。 - 输出:\(x_{k+1}\) 作为局部最优解。
步骤5:针对实例的数值求解(关键步骤演示)
对于给定例题,变量 \(n=3\),等式约束1个,不等式约束3个。
- 初始化:取 \(x_0 = (0, 0, 3)^\top\),满足等式 \(x_1+x_2+x_3=3\)。设 \(B_0 = I_3\)。
- 第一次迭代:
- 计算梯度:
\[ \nabla f = [2(x_1-1), 2(x_2-2.5), 4(x_3+0.5)^3]^\top, \quad \text{在 } x_0 \text{ 处为 } [-2, -5, 4(3.5)^3]^\top. \]
- 子问题:
\[ \min_d \nabla f(x_0)^\top d + \frac{1}{2} d^\top I d, \quad \text{s.t. } \nabla c_i(x_0)^\top d + c_i(x_0) \geq 0 \ (\text{或}=0). \]
求解得 $d_0$ 和 $\lambda_1$。
- 线搜索后更新 \(x_1\),计算 \(s_0, y_0\),用BFGS更新 \(B_1\)。
- 后续迭代:重复直至收敛。实际计算可用MATLAB/fmincon验证,但手动演示时强调近似Hessian的更新过程。
步骤6:近似Hessian误差的影响分析与比较
- 收敛速度:精确Hessian的SQP通常具有二阶收敛速度;近似Hessian的SQP是超线性收敛(若更新满足拟牛顿条件),但需更多迭代。
- 稳定性:BFGS保持正定,确保子问题可解,但可能引入误差使收敛变慢;SR1可能更精确但可能导致不定子问题。
- 计算开销:近似Hessian节省了每次计算二阶导数的成本,适合大规模问题。
对比建议:在实例中,可分别运行精确Hessian SQP(如用符号计算二阶导数)和近似Hessian SQP,比较迭代次数、函数调用次数和最终解精度。通常近似方法在早期迭代中进展较慢,但总体时间可能更少。
总结
本题展示了近似Hessian在SQP中的核心应用:通过拟牛顿更新避免昂贵二阶计算,并结合自适应策略平衡近似质量与数值稳定性。对于所给实例,算法应能收敛到近似解 \(x^* \approx (1.0, 1.5, 0.5)^\top\)(可通过验证KKT条件确认)。近似Hessian的引入是处理大规模非线性规划的有效妥协,在工程优化中广泛应用。