基于原对偶内点法的非线性最优化问题求解器
项目介绍
本项目实现了一个基于原对偶内点法(Primal-Dual Interior-Point Method)的通用非线性优化框架。该求解器旨在解决包含非线性目标函数、非线性不等式约束以及非线性等式约束的复杂优化问题。算法通过将不等式约束引入松弛变量并构造中心路径,利用牛顿法交替优化原变量与对偶变量,最终实现从可行域内部逼近最优解。
功能特性
- 非线性约束支持:能够同时处理多个非线性不等式约束和等式约束。
- 原对偶算法框架:通过同步更新原变量、松弛变量和拉格朗日乘子,保证了收敛的稳定性。
- 数值微分引擎:内置基于有限差分法的梯度、雅可比矩阵及海森(Hessian)矩阵计算模块,支持对任意二阶连续可微函数进行求解。
- 自适应障碍参数更新:基于互补间隙动态调整障碍项参数 $mu$,在保证搜索过程远离边界的同时提升收敛速度。
- 安全步长控制策略:实施“分数到边界”规则,确保松弛变量和乘子在迭代过程中严格保持为正值。
- 可视化监控:实时输出迭代日志,并生成收敛轨迹图和目标函数下降曲线。
系统要求
- 环境需求:MATLAB R2016a 或更高版本。
- 工具箱需求:无需特殊工具箱,核心算法基于MATLAB基础函数库实现。
使用方法
- 定义数学模型:在程序开头以函数句柄形式定义目标函数
f_obj、不等式约束函数 g_ineq(形式为 $g(x) le 0$)以及等式约束函数 h_eq。 - 设置初始值:指定原变量的搜索起点
x0。 - 配置参数:根据需要调整收敛容差
tol、最大迭代次数 max_iter 以及初始缩减系数等超参数。 - 运行程序:执行主脚本,控制台将输出每轮迭代的残差值与目标函数值,并在完成后弹出收敛分析图表。
核心功能实现逻辑
程序的运行逻辑严格遵循原对偶内点法的数学规范,主要分为以下几个阶段:
1. 变量初始化与松弛化
程序首先引入松弛变量 $s$ 将不等式约束 $g(x) le 0$ 转化为等式约束 $g(x) + s = 0$(其中 $s > 0$)。同时初始化拉格朗日乘子 $lambda$(对应不等式)和 $nu$(对应等式)。所有对偶变量及松弛变量均赋予正初值。
2. KKT系统残差计算
在每次迭代中,程序构建非线性方程组的残差向量,包括:
- 对偶残差:拉格朗日函数的梯度是否为零。
- 向心残差:互补松弛条件 $s_i lambda_i = mu$ 的满足程度。
- 不等式/等式可行性残差:约束函数的满足情况。
3. 牛顿方向的求解
程序通过求解一个大规模线性方程组(KKT系统矩阵)来获取搜索方向。该系统矩阵集成了目标函数的海森矩阵、约束函数的雅可比矩阵以及当前的乘子状态。利用左除号直接求解线性方程,得到原变量、松弛变量和乘子的增量步。
4. 步长计算与边界保护
为了确保松弛变量 $s$ 和对偶变量 $lambda$ 始终落在可行域内(即严格大于零),程序采用了分数到边界规则(Fraction-to-the-boundary rule)。通过计算缩减系数 $alpha$,限制步长不会直接触碰约束边界。
5. 障碍项参数 $mu$ 的自适应调整
每轮迭代后,程序计算当前的平均互补间隙,并乘以衰减因子 $sigma$ 来更新障碍参数 $mu$。随着 $mu$ 的减小,迭代点逐渐从中心路径向真实的KKT点逼近。
关键函数与实现细节描述
数值微分模块
由于该求解器被设计为通用型,程序内部不要求用户手动输入导数。
- 一阶与二阶微分:利用前向差分计算梯度,利用四点中心差分公式构造 Hessian 矩阵。这种方式不仅简化了用户建模,还能有效处理复杂的嵌套非线性函数。
- 雅可比矩阵计算:专门处理约束函数的向量化输出,自动提取各个变量对各条约束的敏感度。
收敛判别与记录
程序通过计算四个残差项的范数之和作为总残差。当总残差低于设定的阈值
tol 时,判定算法收敛。同时,程序将每次迭代的残差值和函数值存入历史数组,以便后续进行性能分析。
可视化分析
程序执行完毕后,会利用 subplot 功能绘制双图:
- 收敛轨迹图:以对数坐标显示迭代过程中残差的下降趋势,直观展示算法的二阶收敛特性。
- 下降过程图:实时记录目标函数值的变化,用于验证优化过程的单调性或趋势。