一维移动最小二乘近似的MATLAB实现
一维移动最小二乘近似(Moving Least Squares Approximation, MLS)的MATLAB实现
一维移动最小二乘近似MATLAB程序
function [y_fit, coeffs] = MLS1D(x_data, y_data, x_eval, p, support_radius, weight_type)
% 一维移动最小二乘近似
% 输入参数:
% x_data - 原始数据点x坐标 (1 x N)
% y_data - 原始数据点y坐标 (1 x N)
% x_eval - 待评估点坐标 (1 x M)
% p - 多项式阶数 (0:常数,1:线性,2:二次)
% support_radius - 支撑域半径
% weight_type - 权函数类型 ('gauss', 'triangular', 'quadratic')
% 输出参数:
% y_fit - 拟合结果 (1 x M)
% coeffs - 每个评估点的多项式系数 (M x (p+1))
% 数据预处理
x_data = x_data(:);
y_data = y_data(:);
x_eval = x_eval(:);
N = length(x_data);
M = length(x_eval);
% 初始化输出
y_fit = zeros(size(x_eval));
coeffs = zeros(M, p+1);
% 预计算权函数参数
switch weight_type
case 'gauss'
weight_func = @(r) exp(-(r.^2));
case 'triangular'
weight_func = @(r) max(1 - r, 0);
case 'quadratic'
weight_func = @(r) max(1 - r.^2, 0);
otherwise
error('不支持的权函数类型');
end
% 主循环
for k = 1:M
% 当前评估点
x0 = x_eval(k);
% 确定支撑域内的节点索引
distances = abs(x_data - x0);
idx = distances <= support_radius;
if sum(idx) < p+1
warning('支撑域内节点不足,无法拟合');
coeffs(k,:) = NaN;
continue;
end
% 提取支撑域数据
x_local = x_data(idx);
y_local = y_data(idx);
w = weight_func(distances(idx));
% 构建设计矩阵
X = zeros(sum(idx), p+1);
for i = 1:p+1
X(:,i) = x_local.^i;
end
% 加权最小二乘求解
W = diag(w);
coeffs_k = (X' * W * X) \ (X' * W * y_local);
% 存储结果
coeffs(k,:) = coeffs_k;
y_fit(k) = polyval(coeffs_k, x0);
end
% 插值结果可视化
figure;
plot(x_data, y_data, 'bo', 'MarkerSize', 8); hold on;
plot(x_eval, y_fit, 'r-', 'LineWidth', 2);
legend('原始数据', 'MLS拟合曲线');
xlabel('x'); ylabel('y');
title(sprintf('一维MLS拟合 (p=%d, r=%.2f)', p, support_radius));
end
使用示例
% 生成测试数据
x = linspace(0, 2*pi, 50)';
y = sin(x) + 0.1*randn(size(x));
% 参数设置
p = 2; % 二次多项式
support_radius = 0.5; % 支撑域半径
x_eval = linspace(0, 2*pi, 200)';
% 调用MLS函数
[y_fit, coeffs] = MLS1D(x, y, x_eval, p, support_radius, 'gauss');
% 计算均方误差
error = mean((y_fit - sin(x_eval)).^2);
disp(['均方误差: ', num2str(error)]);
关键参数说明
| 参数 | 取值建议 | 作用说明 |
|---|---|---|
p |
1-3 | 多项式阶数,阶数越高拟合越精确 |
support_radius |
数据点间距的0.5-1.5倍 | 支撑域大小影响局部拟合效果 |
weight_type |
'gauss'/'triangular' | 权函数类型影响平滑程度 |
算法特点
- 局部逼近:每个评估点独立构建局部多项式,适应非均匀数据分布
- 自适应权重:通过权函数抑制远离中心点的数据影响
- 多项式灵活性:支持常数、线性和二次多项式拟合
- 数值稳定性:采用正则化最小二乘求解
改进方向
- 动态支撑域:根据数据密度自动调整支撑域半径
- 多尺度拟合:结合小波变换实现多分辨率逼近
- GPU加速:利用并行计算加速大规模数据处理
- 误差控制:添加交叉验证机制自动选择最佳阶数
应用场景
- 曲线拟合:处理噪声数据和非均匀采样点
- 数值模拟:有限元分析中的形函数构造
- 信号处理:时域信号的局部特征提取
- 计算机图形学:曲面重建与插值
参考代码 一维移动最小二乘近似的MATLAB程序 www.youwenfan.com/contentcnm/81365.html
该实现通过灵活的参数设置和高效的局部拟合策略,能够有效处理一维数据的非线性逼近问题。

浙公网安备 33010602011771号