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.5502https://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