非线性最小二乘优化算法全集 (Non-linear Least Squares Optimization Suite)
项目简介
本项目是一个基于 MATLAB 平台开发的非线性优化算法库,专注于解决非线性最小二乘问题。项目以一个经典的指数衰减模型为测试对象,详细实现了三种经典的自编优化算法,并调用 MATLAB 官方优化工具箱作为基准,旨在通过实际代码展示不同算法的数学原理、实现细节以及在收敛速度、精度和稳定性方面的差异。
该项目代码结构紧凑,所有功能均集成在一个脚本文件中,包含了从数据生成、算法求解到结果可视化分析的完整流程。
功能特性
- 多算法对比:集成了高斯-牛顿法、修正高斯-牛顿法、列文伯格-马夸特法以及 MATLAB 内置
lsqnonlin 函数。 - 鲁棒性设计:在自编算法中加入了矩阵奇异性检测(条件数判断)和伪逆求解,防止程序报错。
- 解析梯度计算:实现了目标函数的解析雅可比矩阵计算,而非使用数值差分,保证了计算精度。
- 可视化分析:提供拟合曲线对比图和基于对数坐标的残差收敛过程图,直观展示算法性能。
- 详细日志:记录每一步迭代的残差平方和(SSR)变化,便于分析收敛轨迹。
系统要求
- MATLAB R2016b 或更高版本
- Optimization Toolbox(用于运行 benchmarks 对比的
lsqnonlin 函数) - *注:若无工具箱,可注释掉相关代码,不影响自编算法的运行。*
快速开始
- 将项目文件下载到本地。
- 在 MATLAB 中打开包含主程序的文件夹。
- 直接运行主程序脚本。
- 程序将输出各算法的耗时、迭代次数、最终参数估计值,并弹出两个分析图表。
详细实现逻辑与算法分析
主程序的设计逻辑分为问题定义、算法执行、结果分析与子函数定义四个主要部分。
1. 问题定义与数据模拟
程序首先构建了一个非线性回归问题场景。
- 数学模型:采用指数衰减模型 $y = b_1 cdot e^{-b_2 cdot x} + b_3$。
- 数据生成:设定真实参数 $b = [12.5, 0.6, 3.0]$,在区间 [0, 5] 上生成 25 个样本点,并叠加标准差为 0.5 的高斯白噪声。为了保证结果的可复现性,固定了随机数种子。
- 初始猜测:设定了一组偏离真实值较远的初始参数 $b_0 = [18.0, 0.1, 1.0]$,以测试算法的全局收敛能力。
2. 核心算法实现
#### 高斯-牛顿法 (Gauss-Newton, G-N)
这是求解非线性最小二乘问题的基础算法。
- 原理:利用一阶泰勒展开将非线性模型线性化,通过求解正规方程 $(J^T J)Delta = J^T r$ 获得下降方向。
- 实现细节:程序中加入了对海森矩阵近似 $H = J^T J$ 的条件数判断。如果条件数过大(超过 1e15),则判定矩阵奇异或病态,转而使用伪逆(pinv)代替左除运算,增强了数值稳定性。
- 特点:在残差较小且初始值较好时收敛呈二次型,但在非凸区域或残差较大时容易发散。
#### 修正高斯-牛顿法 (Modified Gauss-Newton)
针对标准 G-N 法容易发散的问题,引入了线性搜索策略。
- 原理:在标准 G-N 确定的搜索方向上,寻找合适的步长 $alpha$。
- 实现细节:采用类似 Armijo 准则的回退策略(Backtracking)。初始步长设为 1,如果新的残差平方和(SSR)没有下降,则将步长减半,最多尝试 10 次。若仍找不到下降点,则强制使用极小步长更新,防止死循环。
- 特点:极大地提高了算法的全局收敛性,能够处理初始猜测较差的情况。
#### 列文伯格-马夸特法 (Levenberg-Marquardt, L-M)
结合了梯度下降法和高斯-牛顿法的优点,是目前应用最广泛的算法。
- 原理:通过引入阻尼因子 $mu$,在修正方程 $(J^T J + mu I)Delta = J^T r$ 中通过调节 $mu$ 的大小,在梯度下降方向($mu$ 很大时)和高斯-牛顿方向($mu$ 很小时)之间平滑切换。
- 实现细节:
* 程序初始化阻尼因子 $mu=0.01$ 和调节倍率 $v=2$。
* 在迭代过程中动态计算增益比(Gain Ratio),根据实际下降量与线性近似下降量的比值来调整 $mu$。若效果好则减小 $mu$(趋向 G-N),若效果差则增大 $mu$(趋向梯度下降)。
* 能够有效处理海森矩阵不正定或奇异的情况。
#### MATLAB 基准 (lsqnonlin)
- 调用 Optimization Toolbox 的内置求解器。
- 配置算法为
levenberg-marquardt,作为精度和运行速度的一级标准,用于验证自编算法的正确性。
3. 系统辨识与辅助模块
- 雅可比矩阵计算:程序包含一个独立的子函数,根据模型参数显示的计算出雅可比矩阵的解析解(每一列对应一个参数的偏导数),而非使用耗时的数值差分近似。
- SSR 计算:封装了残差平方和计算函数,统一了所有算法的目标函数度量标准。
- 可视化:
*
拟合效果图:在同一张图上绘制观测散点数据、真实模型曲线以及三种算法的拟合曲线,直观展示拟合精度。
*
收敛过程图:使用半对数坐标系绘制 SSR 随迭代次数的变化曲线,清晰地展示了各算法的收敛速度和早期的下降趋势。
输出示例
运行程序后,MATLAB 命令行窗口将打印如下格式的汇总表(数据仅供参考):
| 算法 | 耗时(s) | 迭代次数 | 最终SSR | 估计参数 [b1, b2, b3] |
| :--- | :--- | :--- | :--- | :--- |
| G-N | 0.0045 | 6 | 5.1234 | [12.45, 0.58, 3.05] |
| Modified G-N | 0.0051 | 6 | 5.1234 | [12.45, 0.58, 3.05] |
| L-M | 0.0062 | 7 | 5.1234 | [12.45, 0.58, 3.05] |
| lsqnonlin | 0.0120 | 6 | 5.1234 | [12.45, 0.58, 3.05] |
| True Values | - | - | - | [12.50, 0.60, 3.00] |
同时会生成包含两个子图的对比窗口,展示几何拟合效果与代数收敛过程。