一维移动最小二乘近似的MATLAB程序
2025-12-17
一维移动最小二乘(Moving Least Squares, MLS)近似的MATLAB程序
一维移动最小二乘原理
移动最小二乘法的核心思想是:在求解域内每个点处,通过加权最小二乘法进行局部拟合,权重函数使得越靠近当前点的数据对拟合影响越大。一维情况下,对于任意点 x,其近似函数 u(x) 通过最小化以下加权二次型得到:
其中,是在
权重函数选择
权重函数是移动最小二乘法的关键,常用的有:
- 高斯权重函数:
,其中 是影响半径。 - 样条权重函数:例如
,当 ;否则为0。
一维MLS的MATLAB程序
基于线性基和高斯权重函数的一维移动最小二乘近似MATLAB函数及示例。
function [y_fit, coefficients] = MLS1D(x_data, y_data, x_fit, h)
% 一维移动最小二乘近似
% 输入:
% x_data: 数据点x坐标 (向量)
% y_data: 数据点y坐标 (向量)
% x_fit: 拟合点x坐标 (向量)
% h: 权重函数的影响半径
% 输出:
% y_fit: 在x_fit处的拟合值
% coefficients: 在x_fit处的拟合系数 (对于线性基,每行是[a0, a1])
if nargin < 4
% 默认影响半径取数据点平均间距的3倍
h = 3 * mean(diff(sort(x_data)));
end
n_fit = length(x_fit);
y_fit = zeros(size(x_fit));
coefficients = zeros(n_fit, 2); % 对于线性基 (1, x),有2个系数
for k = 1:n_fit
x_current = x_fit(k);
% 1. 计算权重 (高斯函数)
r = abs(x_data - x_current);
% 避免过远的点影响,设置一个阈值,这里直接用高斯函数自然衰减
weights = exp(-(r/h).^2);
% 也可以使用紧支权重,例如只考虑r < 2*h的点
% valid = r < 2*h;
% weights = weights .* valid'; % 确保weights是行向量
% 2. 构建矩阵 A = P^T W P 和 右端项 B = P^T W y
% 线性基: P = [1, x]
P = [ones(size(x_data)), x_data];
W = diag(weights);
A = P' * W * P;
B = P' * W * y_data';
% 3. 求解线性方程组 A * coeffs = B
% 使用伪逆或左除,增加稳定性判断
if rcond(A) < 1e-12
% 矩阵接近奇异,使用伪逆
coeffs = pinv(A) * B;
else
coeffs = A \ B;
end
coefficients(k, :) = coeffs';
% 4. 计算当前点拟合值 u(x) = p(x)^T * coeffs
% 对于线性基 p(x_current) = [1; x_current]
y_fit(k) = [1, x_current] * coeffs;
end
end
示例和结果验证
下面是如何使用上述函数进行数据拟合的示例:
% 生成示例数据 (带噪声的正弦曲线)
rng(1); % 设置随机数种子以便复现结果
x_data = linspace(0, 2*pi, 30)';
y_data = sin(x_data) + 0.1 * randn(size(x_data));
% 生成密集的拟合点
x_fit = linspace(0, 2*pi, 100)';
% 调用MLS1D函数
h = 0.8; % 设置影响半径
[y_fit, coefficients] = MLS1D(x_data, y_data, x_fit, h);
% 绘制结果
figure;
plot(x_data, y_data, 'ko', 'MarkerSize', 4, 'DisplayName', '原始数据 (带噪声)');
hold on;
plot(x_fit, y_fit, 'r-', 'LineWidth', 2, 'DisplayName', 'MLS拟合');
plot(x_fit, sin(x_fit), 'b--', 'LineWidth', 1, 'DisplayName', '真实函数 (sin(x))');
xlabel('x');
ylabel('y');
legend('show');
grid on;
title('一维移动最小二乘近似示例');
参考代码 一维移动最小二乘近似的MATLAB程序 www.3dddown.com/csa/81365.html
关键参数说明
-
影响半径
h:控制拟合的局部性程度。h较小 => 拟合更依赖邻近点,结果捕捉细节能力强,但可能不稳定、对噪声敏感。h较大 => 更多点参与拟合,结果更平滑,但可能忽略局部特征。- 选择技巧:通常可先取数据点平均间距的3~5倍,再根据效果调整。
-
基函数选择:示例中使用的是线性基
[1, x]。你也可以选择:- 常数基
[1]:结果类似于局部加权平均。 - 二次基
[1, x, x^2]:能捕捉曲率,但需要更多数据点,且更易受振荡影响。
- 常数基
