当前位置: 首页 > article >正文

Day27_0.1基础学习MATLAB学习小技巧总结(27)——曲线拟合函数

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。

参考书目:

1、《MATLAB基础教程 (第三版) (薛山)》

2、《MATLAB R2020a完全自学一本通》

3、《MATLAB官方帮助文档》

声明:文章内的代码和内容可以引用复制,只要标注出处即可

在本章中的代码,会以资源的形式发在我的博客里供大家免费下载学习。

曲线拟合

关于插值法和拟合法的对比应用,我发在《MATLAB的应用》专栏中,如果有感兴趣的朋友,可以看一下。

数值分析中插值法和拟合法的对比_对数插值法-CSDN博客​编辑https://blog.csdn.net/qq_47248729/article/details/141933209?spm=1001.2014.3001.5502icon-default.png?t=O83Ahttps://blog.csdn.net/qq_47248729/article/details/141933209?spm=1001.2014.3001.5502

1. 曲线拟合

曲线拟合通常分为线性拟合和非线性拟合。线性拟合假设数据点可以用直线表示,而非线性拟合则使用更复杂的函数形式。拟合的质量通常通过残差平方和(RSS)来评估,RSS定义为:

 其中,yi是观测值,f(xi​)是模型预测值,n是数据点的数量。

1.1 线性拟合公式

对于线性拟合,模型可以表示为:

其中,mm是斜率,bb是截距。通过最小二乘法,可以求解mm和bb的值:

 

1.2 模型的推理逻辑:
 

例: 

% 生成示例数据  
x = [1, 2, 3, 4, 5, 6, 7];  
y = [2.5, 3.5, 5.0, 7.0, 6.5, 5.5, 4.0] + randn(1, 7) * 0.5; % 添加一些噪声  

% 线性拟合  
p = polyfit(x, y, 1); % 一次多项式拟合  
y_fit = polyval(p, x); % 计算拟合值  

% 绘制结果  
figure;  
scatter(x, y, 'r', 'filled'); % 原始数据点  
hold on;  
plot(x, y_fit, 'b-', 'LineWidth', 2); % 拟合直线  
title('线性拟合示例');  
xlabel('x');  
ylabel('y');  
legend('观测数据', '拟合结果');  
grid on;

 

2. 多项式拟合

在MATLAB中,函数polyfitO采用最小二乘法对给定的数据进行多项式拟合,得到该多项式的系数。该函数的调用格式如下:

p=polyfit(x,y,n):返回次数为n的多项式p(x)的系数,该阶数是y中数据的最佳拟合(基于最小二乘指标)。p中的系数按降幂排列,p的长度为n+1

[p,S]=polyfit(x,y,n):还返回一个结构体s,后者可用作polyval的输入来获取误差估计值。

[p,S,mu]=polyfit(x,y,n):执行中心化和缩放以同时改善多项式和拟合算法的数值属性。此语法还返回mu,后者是一个二元素向量,包含中心化值和缩放值。mu(1)是mean(x),mu(2)是std(x)。

% 生成示例数据  
x = linspace(0, 10, 10); % 生成10个数据点  
y = 2*x.^5 - 3*x.^4 + 5*x.^3 - x.^2 + 2*x + randn(1, 10) * 100; % 五阶多项式加上噪声  

% 五阶多项式拟合  
p = polyfit(x, y, 5); % 五阶多项式拟合  
y_fit = polyval(p, x); % 计算拟合值  

% 绘制结果  
figure;  
scatter(x, y, 'r', 'filled'); % 原始数据点  
hold on;  
plot(x, y_fit, 'b-', 'LineWidth', 2); % 拟合曲线  
title('五阶多项式拟合示例');  
xlabel('x');  
ylabel('y');  
legend('观测数据', '拟合结果');  
grid on;

 

3 加权最小方差(WLS)拟合 

所谓加权最小方差,就是根据基础数据本身各自的准确度的不同,在拟合的时候给每个数据以不同的加权数值。这种方法比前面介绍的单纯最小方差方法要更加符合拟合的初衷。
对应N阶多项式的拟合公式,所需要求解的拟合系数需要求解线性方程组,其中线性方程组的系数矩阵和需要求解的拟合系数矩阵分别为:

 使用加权最小方差方法求解得到拟合系数:

 其对应的加权最小方差为表达式

例:

x = [-3:1:3]';  
y = [1.1650 0.0751 -0.6965 0.0591 0.6268 0.3516 1.6961]';  
[x, i] = sort(x);  
y = y(i);  
xi = linspace(min(x), max(x), 100); % 使用linspace生成100个点
for i = 1:4  
    N = 2*i - 1; % 1, 3, 5, 7阶多项式  
    [th, err, yi] = polyfits(x, y, N, xi);  
    subplot(2, 2, i);  
    plot(x, y, 'o'); % 绘制原始数据点  
    hold on;  
    plot(xi, yi, '-'); % 绘制拟合曲线  
    grid on;  
    title(['Order: ' num2str(N)]);  
end

function [th, err, yi] = polyfits(x, y, N, xi, r)  
    % x, y:数据点系列  
    % N:多项式拟合的阶数  
    % r:加权系数的逆矩阵  

    M = length(x);  
    x = x(:);  
    y = y(:);  
    % 判断调用函数的格式  
    if nargin == 4  
        % 当调用函数的格式为(x,y,N,xi)时  
        if length(xi) == M  
            r = xi;   
            xi = x; % 将xi重置为x  
        else   
            r = 1; % 加权系数默认为1  
        end  
    elseif nargin == 3  
        xi = x; % xi默认为x  
        r = 1; % 加权系数默认为1  
    end  

    % 求解系数矩阵  
    A = zeros(M, N + 1); % 初始化A矩阵  
    A(:, N + 1) = ones(M, 1); % 常数项  
    for n = N:-1:1  
        A(:, n) = A(:, n + 1) .* x; % 生成多项式项  
    end  

    if length(r) == M  
        for m = 1:M  
            A(m, :) = A(m, :) / r(m); % 进行加权  
            y(m) = y(m) / r(m); % 加权y值  
        end  
    end  

    % 计算拟合系数  
    th = (A\y)'; % 解线性方程  
    ye = polyval(th, x); % 计算已拟合的y值  
    err = norm(y - ye) / norm(y); % 计算相对误差  
    yi = polyval(th, xi); % 在xi处计算拟合值  
end  


http://www.kler.cn/news/312598.html

相关文章:

  • Unsupervised Domain Adaptation by Backpropagation
  • 【每日刷题】Day127
  • Scrapy爬虫框架 Spider Middleware 爬虫页中间件
  • 【软件设计】常用设计模式--观察者模式
  • 【小白向】Google Play日区如何支付?Google Play日区怎么转?Google Play日区账号支付教程
  • MongoDB的详细安装教程
  • SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
  • 普元DWS - Linux下安装DWS标准版
  • AUTOSAR_EXP_ARAComAPI的5章笔记(8)
  • Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW
  • docker- No space left on device
  • 去耦合的一些建议
  • 基于YOLOv5s的无人机航拍输电线瓷瓶检测(附数据集与操作步骤)
  • CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task
  • 云原生-Quarkus
  • 基于Benes网络的SIMD同态密文任意重排
  • HarmonyOS NEXT应用开发案例实践总结合集
  • 【C++笔记】类和对象的深入理解(三)
  • 练习题 - Django 4.x Overviewses 框架概述
  • 1. TypeScript基本语法
  • LangChain 和 Elasticsearch 加速构建 AI 检索代理
  • 练习题 - Django 4.x Models Relationship fields 字段关联关
  • 等保测评中的关键技术挑战与应对策略
  • three.js shader 实现天空中白云
  • 用 Docker 部署 Seafile 社区版
  • C++学习指南(六)----list
  • 【docker】阿里云使用docker,2024各种采坑
  • 【笔记】扩散模型(八):DALL-E 2 (unCLIP) 论文解读与代码实现
  • C++设计模式——Interpreter解释器模式
  • 科技修复记忆:轻松几步,旧照变清晰