基于MATLAB的移动最小二乘法(MLS)曲线曲面拟合系统
项目简介
本项目是一个基于MATLAB开发的高精度数据拟合系统,核心算法采用移动最小二乘法(Moving Least Squares, MLS)。不同于传统的全局多项式拟合,MLS利用紧支集权函数在局部子域内进行加权最小二乘逼近,能够有效处理非均匀采样数据,捕捉数据的局部几何特征,并保证拟合结果的连续性和平滑性。
本程序集成了完整的一维曲线平滑与三维曲面重建流程,包含数据生成、邻域搜索、局部逼近求解、误差分析及可视化展示模块。适用于逆向工程中的点云处理、数值分析中的函数逼近以及实验数据的平滑去噪。
功能特性
- 一维曲线拟合:支持对含噪散乱点数据进行高精度光顺处理,有效滤除随机噪声。
- 三维曲面重建:能够从二维非结构化散点(散乱点云)重建光滑的三维曲面。
- 多种权函数支持:内置高斯权函数(Gaussian)和三次样条权函数(Cubic Spline),用户可根据平滑需求切换。
- 可变多项式阶次:支持线性基(1阶)和二次基(2阶)多项式拟合,适应不同曲率的几何特征。
- 局部坐标优化:算法在计算过程中自动构建局部坐标系,显著提高了数值求解的稳定性。
- 稳健性设计:内置正规方程组条件数检查机制,防止因采样点不足或共线导致的矩阵奇异问题。
- 全面的误差评估:提供均方根误差(RMSE)计算及逐点残差分析可视化。
系统要求
- MATLAB R2016a 及以上版本
- 无需额外工具箱(仅使用MATLAB基础数学库和绘图库)
使用方法
直接运行主程序即可启动演示。程序将自动执行以下流程:
- 一维拟合演示:
* 生成带有随机噪声的正弦波散点数据。
* 使用高斯权函数和二次基底进行MLS拟合。
* 弹出窗口显示原始散点、真实曲线与MLS拟合曲线的对比。
* 计算并展示残差分布直方图及RMSE值。
- 三维重建演示:
* 生成基于Peaks函数的含噪三维散乱点云。
* 构建规则网格作为查询点。
* 使用样条权函数和二次基底进行曲面重构。
* 弹出窗口展示原始三维点云与重建后的光滑曲面。
算法实现与逻辑详解
本项目的所有功能逻辑均封装在单一脚本中,分为主流程控制与核心算法函数两部分。
1. 主流程控制
主程序通过两个独立的示例模块展示了MLS的应用:
- 数据预处理:程序自动生成测试数据。利用
linspace 和 meshgrid 生成基准坐标,叠加随机扰动模拟非均匀采样,并添加随机噪声以测试算法的鲁棒性。 - 参数配置:定义了关键的MLS参数,包括影响半径(Radius)、多项式阶数(Order)和权函数类型(Type)。
- 拟合执行:分别调用一维和二维核心求解函数,传入离散数据点(参考点)和高分辨率网格(查询点)。
- 后处理与评估:
* 在一维示例中,程序不仅在查询点处计算拟合值,还在原始数据点位置重新进行MLS拟合,以此计算拟合值与观测值之间的残差,进而得出RMSE(均方根误差)。
* 在三维示例中,将计算得到的平铺数据重组为网格矩阵,使用
surf 函数绘制半透明曲面,并叠加原始散点进行直观对比。
2. 核心算法逻辑
#### 一维MLS拟合 (mls_fit_1d)
该函数负责将一维散乱数据映射为光滑曲线。
- 邻域搜索:对于每一个查询点,计算其与所有参考点的欧氏距离,仅选取距离小于影响半径的点作为邻域点。
- 局部坐标转换:为了提高数值稳定性,算法将参考点坐标平移,使查询点位于局部坐标系的原点(即 $dx = x_{data} - x_{query}$)。
- 正规方程构建:
* 构建Vandermonde矩阵 $A$,根据阶数包含 $1, dx, dx^2$ 等项。
* 计算权矩阵 $W$,权重随距离增加而衰减。
* 组建加权最小二乘系统的左右端项:$LHS = A^T W A$, $RHS = A^T W f$。
- 求解:通过矩阵左除求解系数向量 $c$。由于采用局部坐标,拟合结果直接取常数项系数 $c(1)$。
#### 二维MLS曲面重建 (mls_fit_2d)
该函数扩展至二维域,用于处理曲面数据。
* 1阶(线性):包含基函数 $[1, x, y]$。
* 2阶(二次):包含基函数 $[1, x, y, x^2, xy, y^2]$,能更好地逼近复杂的曲面曲率。
- 稳定性检查:在邻域搜索阶段,增加了对邻域点数量的检查(至少为基函数项数的1.5倍),并在求解阶段使用
rcond 检查矩阵条件数,防止数值发散。
#### 权函数计算 (compute_weight_matrix)
实现了两种经典的紧支集权函数,并以稀疏对角矩阵形式返回以优化内存:
- 高斯权函数 (Gauss):采用 $exp(-(3s)^2)$ 形式,并在归一化距离 $s>1$ 处强制截断为0。
- 三次样条权函数 (Spline):采用分段多项式定义的标准样条函数,具有二阶连续性,计算效率高且在边界处光滑减退到0。
代码关键细节
- 局部近似原理:代码中并未求解全局方程,而是针对每一个查询点独立求解一个局部加权最小二乘问题。这意味着拟合值完全由影响半径内的邻域点决定。
- 坐标原点平移:在构建矩阵 $A$ 之前,代码执行了
dx = x_data(neighbors) - xq。这一操作极大地降低了高次幂运算带来的数值误差,是MLS算法工程实现中的关键技巧。 - 稀疏矩阵优化:在计算权矩阵时,使用了
spdiags 构建稀疏对角矩阵,避免了生成通过大量零元素占据内存的满矩阵,提高了算法运算效率。 - 异常处理:函数输出包含一个
valid_idx(有效索引)向量。当某处的邻域点不足或矩阵奇异时,该点拟合值被标记为 NaN,并在绘图时自动忽略,保证了程序的稳定性。