一维移动最小二乘近似的MATLAB程序

一维移动最小二乘(Moving Least Squares, MLS)近似的MATLAB程序

一维移动最小二乘原理

移动最小二乘法的核心思想是:在求解域内每个点处,通过加权最小二乘法 进行局部拟合,权重函数使得越靠近当前点的数据对拟合影响越大 。一维情况下,对于任意点 x,其近似函数 u(x) 通过最小化以下加权二次型得到:

J = ∑ i = 1 n w ( ∥ x − x i ∥ ) [ u ( x i ) − f i ] 2 J = \sum_{i=1}^{n} w(\|x - x_i\|) \left[ u(x_i) - f_i \right]^2 J=∑i=1nw(∥x−xi∥)[u(xi)−fi]2

其中, u ( x ) u(x) u(x) 通常取为多项式形式,例如线性基: p ( x ) = [ 1 , x ] T p(x) = [1, x]^T p(x)=[1,x]T, w ( d ) w(d) w(d) 是权重函数(通常为紧支的), f i f_i fi是在 x i x_i xi 处的已知数据值。

权重函数选择

权重函数是移动最小二乘法的关键,常用的有:

  1. 高斯权重函数 : w ( r ) = exp ⁡ ( − r 2 h 2 ) w(r) = \exp\left(-\frac{r^2}{h^2}\right) w(r)=exp(−h2r2),其中 h h h 是影响半径。
  2. 样条权重函数 :例如 w ( r ) = 1 − 6 ( r h ) 2 + 8 ( r h ) 3 − 3 ( r h ) 4 w(r) = 1 - 6\left(\frac{r}{h}\right)^2 + 8\left(\frac{r}{h}\right)^3 - 3\left(\frac{r}{h}\right)^4 w(r)=1−6(hr)2+8(hr)3−3(hr)4,当 0 ≤ r ≤ h 0 \leq r \leq h 0≤r≤h;否则为0。

一维MLS的MATLAB程序

基于线性基和高斯权重函数的一维移动最小二乘近似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

示例和结果验证

下面是如何使用上述函数进行数据拟合的示例:

matlab 复制代码
% 生成示例数据 (带噪声的正弦曲线)
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

关键参数说明

  1. 影响半径 h :控制拟合的局部性程度

    • h 较小 => 拟合更依赖邻近点 ,结果捕捉细节 能力强,但可能不稳定、对噪声敏感。
    • h 较大 => 更多点参与 拟合,结果更平滑 ,但可能忽略局部特征
    • 选择技巧 :通常可先取数据点平均间距的3~5倍,再根据效果调整。
  2. 基函数选择 :示例中使用的是线性基 [1, x]。你也可以选择:

    • 常数基 [1]:结果类似于局部加权平均。
    • 二次基 [1, x, x^2]:能捕捉曲率,但需要更多数据点,且更易受振荡影响。
相关推荐
一分之二~7 小时前
回溯算法--递增子序列
开发语言·数据结构·算法·leetcode
艾莉丝努力练剑7 小时前
【Python库和代码案例:第一课】Python 标准库与第三方库实战指南:从日期处理到 Excel 操作
java·服务器·开发语言·人工智能·python·pycharm·pip
软件算法开发7 小时前
基于鹈鹕优化的LSTM深度学习网络模型(POA-LSTM)的一维时间序列预测算法matlab仿真
深度学习·matlab·lstm·一维时间序列预测·鹈鹕优化·poa-lstm
yugi9878387 小时前
基于C#实现的WiFi信号强度扫描程序
开发语言·c#
乂爻yiyao7 小时前
Java 的云原生困局与破局
java·开发语言·云原生
鸿儒5177 小时前
记录一个C++操作8位影像的一个bug
开发语言·c++·bug
脏脏a7 小时前
深度剖析 C++ string:从 0 到 1 的模拟实现与细节解析
开发语言·c++
创作者mateo7 小时前
python基础学习之Python 循环及函数
开发语言·python·学习
小鸡脚来咯7 小时前
java web后端开发流程
java·开发语言·git