【Matlab】最小二乘法拟合多项式

这篇具有很好参考价值的文章主要介绍了【Matlab】最小二乘法拟合多项式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在最近的电机项目中,有遇到有传感器数据并不线性的问题,然后想要用最小二乘法做个曲线拟合,反过来去校准不线性的传感器的数据,因此记录一下使用最小二乘法来拟合多项式的曲线的步骤。本篇从最小二乘法的原始公式入手编写M文件,目的是方便使用单片机实现,或者说是方便用C来实现。

拟合一次函数:

我们先试着拟合一个简单一点的,从一元一次函数开始。最小二乘法拟合曲线需要首先知道曲线的通用公式。一次函数的通用公式为y = k * x + b,使用matlab编写很容易实现。这里我直接写入了几个点,随便编了一组数据。

【Matlab】最小二乘法拟合多项式

%*************************************************************************%
                %最小二乘法
%**********************************************************************%

clc;
clear;

%假定拟合曲线的公式为:y = ax^2 +b^x + c;
x = [1 2 3 4 5 6 7 8 9];
y = [1.2  2.5  3.6  4.8  5.6  7.4  8.0  9.8  12.0];
[m , n] = size(x);
sumx = 0;
sumy = 0;
sumxx = 0;
sumxy = 0;
Xaver = 0;
Yaver = 0;
XYaver = 0;
XXaver = 0;

%求平均
for i = 1 : n
    sumx = sumx + x(i);
    sumy = sumy + y(i);
    sumxy = sumxy + x(i) * y(i);
    sumxx = sumxx + x(i) * x(i);
end
Xaver = sumx / n;
Yaver = sumy / n;
XYaver = sumxy / n;
XXaver = sumxx / n;

k = (XYaver - Xaver * Yaver) / (XXaver - Xaver * Xaver);
b = Yaver - k * Xaver;

plot(x,y,'s');   %画数据点不连线
hold on;  %不加此句,两个图形将显示在两张图像上

%画出拟合曲线
x1 = [0 : 0.1 : 10];
y1 = k * x1 + b;

plot(x1,y1);

效果:

【Matlab】最小二乘法拟合多项式

拟合二次函数:

之后开始拟合二次函数,可以从最小二乘法的原理上进行程序编写。

最小二乘法原理:

假设我们的多项式表达式为:

【Matlab】最小二乘法拟合多项式

之后采集x与y的样本数据:

x = [1 2 3 4 5 6 7 8 9 10 11 12 13];
y = [1.2  2.5  3.6  4.8  5.6  6.6  7.4  8.0  9.8  12.0  12.5 13.1 14.6];

最小二乘法是要达到最优函数的各项系数使的误差平方和S取得最小值,即S对各项式的偏导为0:

【Matlab】最小二乘法拟合多项式

整理上式可得:

【Matlab】最小二乘法拟合多项式

将其转化为矩阵形式:

【Matlab】最小二乘法拟合多项式

即,我们需要求取样本x的和,x^2的和,,,,,x^n的加和,以及y的加和,xy的加和。。。。。x^n*y的加和。

假定我们的曲线是二次多项式,那么这个XY矩阵都是一个3行3列的矩阵,那么只需要求到x^4的加和即可,程序如下:

sumx = 0;
sumxx = 0;
sumxxx = 0;
sumxxxx = 0;
sumy = 0;
sumxy = 0;
sumxxy = 0;

%求矩阵数据
for i = 1 : n
    sumx = sumx + x(i);
    sumxx = sumxx + x(i) * x(i);
    sumxxx = sumxxx + x(i) * x(i) * x(i);
    sumxxxx = sumxxxx + x(i) * x(i) * x(i) * x(i);
    sumy = sumy + y(i);
    sumxy = sumxy + x(i) * y(i);
    sumxxy = sumxxy + x(i) * x(i) * y(i);
end

将x加和的相关项写成X矩阵,将y加和的相关项写成Y矩阵,之后:

【Matlab】最小二乘法拟合多项式

多项式矩阵就可以通过X矩阵的逆 * Y矩阵求得:

%写出矩阵
U = [n  sumx  sumxx ; sumx  sumxx  sumxxx ; sumxx  sumxxx  sumxxxx];
W = [sumy ; sumxy ; sumxxy];

%求出矩阵的逆,进而求出多项式矩阵
V =  pinv(U) * W;   % U * V = W    V = U(-1) * W
a = V(1,1); b = V(2,1); c = V(3,1);

之后就可以画出图形:

%画出拟合曲线
x1 = [0 : 0.1 : 15];
y1 = a + b .* x1 + c .* x1 .* x1;

plot(x1,y1);

注意:有一个点乘

结果图像如下:

【Matlab】最小二乘法拟合多项式

完整代码如下:

%*************************************************************************%
                %最小二乘法拟合多项式
%**********************************************************************%

clc;
clear;

%假定拟合曲线的公式为:y = a +b^x + c * x^2;
x = [1 2 3 4 5 6 7 8 9 10 11 12 13];
y = [1.2  2.5  3.6  4.8  5.6  6.6  7.4  8.0  9.8  12.0  12.5 13.1 14.6];
[m , n] = size(x);
a = 0;
b = 0;
c = 0;
sumx = 0;
sumxx = 0;
sumxxx = 0;
sumxxxx = 0;
sumy = 0;
sumxy = 0;
sumxxy = 0;

%求矩阵数据
for i = 1 : n
    sumx = sumx + x(i);
    sumxx = sumxx + x(i) * x(i);
    sumxxx = sumxxx + x(i) * x(i) * x(i);
    sumxxxx = sumxxxx + x(i) * x(i) * x(i) * x(i);
    sumy = sumy + y(i);
    sumxy = sumxy + x(i) * y(i);
    sumxxy = sumxxy + x(i) * x(i) * y(i);
end


%写出矩阵
U = [n  sumx  sumxx ; sumx  sumxx  sumxxx ; sumxx  sumxxx  sumxxxx];
W = [sumy ; sumxy ; sumxxy];

%求出矩阵的逆,进而求出多项式矩阵
V =  pinv(U) * W;   % U * V = W    V = U(-1) * W
a = V(1,1); b = V(2,1); c = V(3,1);

plot(x,y,'s');   %画数据点不连线
hold on;  %不加此句,两个图形将显示在两张图像上

%画出拟合曲线
x1 = [0 : 0.1 : 15];
y1 = a + b .* x1 + c .* x1 .* x1;

plot(x1,y1);

拟合多项式:

拟合多项式其实与拟合二次函数的方法是一样的,因为都是通用的矩阵。那就用一个4阶的举例,如果是4阶,那么拟合出来的多项式就是3次多项式。这里我们先随便编一个4次多项式,生成一个4次多项式的点:

for i = 1 : n
    y(i) = 0.3 + 0.04 * x(i) + 1.2 * x(i) * x(i) + 0.06 * x(i) * x(i) * x(i) + 0.003 * x(i) * x(i) * x(i) * x(i);
end

这里的y就是4次多项式了,生成了点之后,我们使用最小二乘法来拟合一个3次多项式,尽量与4次多项式的点接近。依旧是按照最小二乘法的矩阵公式,先求出需要的加和数据:

%求矩阵数据
for i = 1 : n
    sumx = sumx + x(i);
    sumxx = sumxx + x(i) * x(i);
    sumxxx = sumxxx + x(i) * x(i) * x(i);
    sumxxxx = sumxxxx + x(i) * x(i) * x(i) * x(i);
    sumxxxxx = sumxxxxx + x(i) * x(i) * x(i) * x(i) * x(i);
    sumxxxxxx = sumxxxxxx + x(i) * x(i) * x(i) * x(i) * x(i) * x(i);
    sumy = sumy + y(i);
    sumxy = sumxy + x(i) * y(i);
    sumxxy = sumxxy + x(i) * x(i) * y(i);
    sumxxxy = sumxxxy + x(i) * x(i) * x(i) * y(i);
    sumxxxxy = sumxxxxy + x(i) * x(i) * x(i) * x(i) * y(i);   
end

然后写出矩阵:

%写出矩阵
U = [n  sumx  sumxx  sumxxx; 
    sumx  sumxx  sumxxx  sumxxxx; 
    sumxx  sumxxx  sumxxxx  sumxxxxx;
    sumxxx  sumxxxx  sumxxxxx  sumxxxxxx];
W = [sumy ; sumxy ; sumxxy; sumxxxy];

求出逆矩阵之后求多项式:

%求出矩阵的逆,进而求出多项式矩阵
V =  pinv(U) * W;   % U * V = W    V = U(-1) * W
a = V(1,1); b = V(2,1); c = V(3,1);d = V(4,1);

之后将图像画出来,对比之前生成的点的图像:

plot(x,y,'s');   %画数据点不连线
hold on;  %不加此句,两个图形将显示在两张图像上

%画出拟合曲线
x1 = [0 : 0.1 : 40];
y1 = a + b .* x1 + c .* x1 .* x1 + d .* x1 .* x1 .* x1;

plot(x1,y1);

【Matlab】最小二乘法拟合多项式文章来源地址https://www.toymoban.com/news/detail-420828.html

到了这里,关于【Matlab】最小二乘法拟合多项式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Open3D 最小二乘拟合二维多项式曲线

      多项式曲线表示为: p ( x ) = p 1 x n + p 2 x

    2024年02月16日
    浏览(32)
  • Matlab 线性拟合、一维、多维度非线性拟合、多项式拟合

      线性拟合 我随便设定一个函数然后通过解方程计算出对应的系数 假设我的函数原型是 y=a*sin(0.1*x.^2+x)+b* squre(x+1)+c*x+d  拟合系数:   利用matlab实现非线性拟合(三维、高维、参数方程)_matlab多元非线性拟合_hyhhyh21的博客-CSDN博客 简单的一维的拟合: 思路: 将非线性-》线

    2024年02月12日
    浏览(36)
  • Open3D 非线性最小二乘拟合二维多项式曲线

      多项式曲线表示为: p ( x ) = p 1 x n + p 2 x

    2024年02月07日
    浏览(36)
  • MATLAB 利用RANSAC对多项式进行点拟合 (32)

    通过对给定的一小组点进行抽样并生成多项式拟合,得到多项式系数 P。返回 maxRange 中具有最多 inlier 值的拟合。如果找不到匹配,则返回空的 P。该函数使用 M 估计量样本一致性(MSAC)算法,一种随机样本一致性(RANSAC)算法的变体来拟合数据。 主要使用的函数和内部的参数含义

    2024年02月15日
    浏览(33)
  • 多项式乘法逆

    前置知识:NTT学习笔记(快速数论变换) 情景代入 洛谷P4238 【模板】多项式乘法逆 给定一个多项式 f ( x ) f(x) f ( x ) ,求 g ( x ) g(x) g ( x ) ,满足 f ( x ) × g ( x ) ≡ 1 ( m o d x n ) f(x)times g(x)equiv 1pmod{x^n} f ( x ) × g ( x ) ≡ 1 ( mod x n ) 。系数对 998244353 998244353 998244353 取模。 1 ≤

    2024年02月02日
    浏览(37)
  • 多项式拟合

    文章内容部分参考: 建模算法入门笔记-多项式拟合(附源码) - 哔哩哔哩 (bilibili.com) (9条消息) 数学建模——人口预测模型 公有木兮木恋白的博客-CSDN博客 数学建模人口预测模型 多项式拟合是数据拟合的一种,与插值有一定区别(插值要求曲线经过给定的点,拟合不一定经

    2024年02月04日
    浏览(36)
  • pytorch 欠拟合和过拟合 多项式回归

        训练误差和验证误差都有,还可能比较严重, 但它们之间仅有差距不大。 这个时候模型不能降低训练的误差,有可能是我们设计的模型简单了,表达能力不足, 捕获试图学习的模式比较难。由于我们的训练和验证误差之间的泛化误差很小, 这个时候我们认为可以用一

    2024年02月16日
    浏览(26)
  • Python做曲线拟合(一元多项式拟合及任意函数拟合)

    目录 1. 一元多项式拟合 使用方法 np.polyfit(x, y, deg) 2. 任意函数拟合 使用 curve_fit() 方法 实例: (1)初始化 x 和 y 数据集 (2)建立自定义函数 (3)使用自定义的函数生成拟合函数绘图  polyfig 使用的是最小二乘法,用于拟合一元多项式函数。 参数说明: x 就是x坐标,

    2024年02月02日
    浏览(37)
  • 自动驾驶规划 - 5次多项式拟合

    自动驾驶运动规划中会用到各种曲线,主要用于生成车辆的轨迹,常见的轨迹生成算法, 如贝塞尔曲线,样条曲线,以及apollo EM Planner的五次多项式曲线 ,城市场景中使用的是分段多项式曲线,在 EM Planner和Lattice Planner 中思路是,都是先通过动态规划生成点,再用5次多项式

    2024年02月03日
    浏览(56)
  • 数学建模--多项式拟合方法Python实现

    目录    1.算法设计思路  2.算法核心代码  3.算法效果展示 1.算法设计思路  2.算法核心代码  3.算法效果展示

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包