前言

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

拟合一次函数:

我们先试着拟合一个简单一点的,从一元一次函数开始。最小二乘法拟合曲线需要首先知道曲线的通用公式。一次函数的通用公式为y = k * x + b,使用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 : nsumx = 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);

效果:

拟合二次函数:

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

最小二乘法原理:

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

之后采集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:

整理上式可得:

将其转化为矩阵形式:

即,我们需要求取样本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 : nsumx = 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矩阵,之后:

多项式矩阵就可以通过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);

注意:有一个点乘

结果图像如下:

完整代码如下:

%*************************************************************************%%最小二乘法拟合多项式
%**********************************************************************%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 : nsumx = 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 : ny(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 : nsumx = 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】最小二乘法拟合多项式相关推荐

  1. matlab最小二乘法拟合参数,matlab最小二乘法拟合

    matlab最小二乘法拟合 数学建模与数学实验 拟 合 1 实验目的 实验内容 2. 掌握用数学软件求解拟合问题. 1. 直观了解拟合基本内容. 1. 拟合问题引例及基本原理. 4. 实验作业. 2. ...

  2. matlab 最小二乘法拟合_机器学习十大经典算法之最小二乘法

    点击上方"计算机视觉cv"即可"进入公众号" 重磅干货第一时间送达 最小二乘法概述 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找 ...

  3. Python 最小二乘法拟合多项式

    最小二乘法拟合多项式 一.功能 二.最小二乘法拟合多项式 三.运行结果 一.功能   利用最小二乘法去拟合直线.任意项高阶多项式. 二.最小二乘法拟合多项式   示例: import random i ...

  4. 最小二乘多项式拟合程序matlab,最小二乘法的多项式拟合(matlab实现)

    1.用最小二乘法进行多项式拟合(matlab实现)西安交通大学 徐彬华算法分析:对给定数据 (i=0 ,1,2,3,.,m),一共m+1个数据点,取多项式P(x),使函数P(x)称为拟合函数或最小二乘 ...

  5. matlab最小二乘法拟合二次多项式,最小二乘法的多项式拟合(matlab实现)

    用最小二乘法进行多项式拟合(matlab 实现) 西安交通大学 徐彬华 算法分析: 对给定数据|(斗』i=0 ,1,2,3,..,m), -共m+1个数据点,取多项式P(x), 使 战 m 刃:ITb ...

  6. matlab最小二乘法拟合参数,matlab最小二乘法的非线性参数拟合

    matlab最小二乘法的非线性参数拟合 首先说一下匿名函数:在创建匿名函数时,Matlab记录了关于函数的信息,当使用句柄调用该函数的时候,Matlab不再进行搜索,而是立即执行该函数,极大提高了效率 ...

  7. matlab最小二乘法拟合图旋转,【Matlab】—{最小二乘法拟合一阶线性拟合传感器实验}...

    [Matlab]-{最小二乘法拟合一阶线性拟合传感器实验} [Matlab]-{最小二乘法拟合一阶线性拟合&传感器实验} ???九层妖塔?起于垒土 [Matlab]-{最小二乘法拟合一阶线性拟 ...

  8. 计算机数值方法之最小二乘法拟合多项式C语言

    给定数据点(xi ,yi),用最小二乘法拟合数据的多项式,并求平方误差. 有了之前多个程序的磨练,这次程序非常简单,用公式算出矩阵中的待求数值,再用高斯消元法求出a0和a1,写出拟合方程,再带入x,y ...

  9. Matlab 最小二乘法 拟合平面

    一.原理推导 最小二乘法 拟合平面是我们最常用的拟合平面的方法,但是有特殊的情况是用这种方法是不能拟合的,后续会加上这种拟合方法(RANSAC). matlab 最小二乘拟合平面(方法一) - 灰信网 ...

最新文章

  1. matlab调用kmeans_K_Means算法的MATLAB实现
  2. DependentLayout相对布局
  3. 酱油和gbt酱油哪个好_韩国酱油真的这么好,到底怎么挑?
  4. 文本预处理跑得慢?抱抱脸团队又放福利,1GB文本语料分词只需20s!
  5. 内网外网同时连接方法
  6. 百度再显管理变革决心 副总裁郑子斌离职
  7. java实现微信公众平台中的字典排序
  8. Qt::FocusPolicy的使用
  9. R-基础测试(2)——在线帮助(转)
  10. java同步synchronized,锁
  11. 多元:复相关系数和偏相关系数
  12. php判断手机浏览器,PHP 检测是否手机浏览器的函数
  13. Win7 桌面右键一直转圈很慢
  14. Android中的临时文件
  15. 电影院传出的哭声《比悲伤更悲伤的故事》程序员们怎么看?
  16. VS code 显示中文异常解决办法
  17. 除了加班、掉头发,程序员还在承受些什么?
  18. 黑客零基础入门:手把手带你实现简单的QQ/邮件攻击,注册表/系统安全防护,学不会请给我只因木马
  19. dependency problems
  20. [英语阅读]日本首相夫人获“牛仔裤达人奖”

热门文章

  1. js获取当日前30天全部日期
  2. Android 中 vector 反汇编示例
  3. 信号中振铃现象及解决方法
  4. 浪潮服务器主板显示b8图,浪潮的硬件监控(ipmitool,MegaCli)
  5. Ipython magic function
  6. JavaScript——编程风格
  7. VIM保存文件,出现no write since last change解决
  8. 贩妖记 第五十五章,时冰的挑衅
  9. 吴恩达学习—Logistic Regression
  10. 如何理解函数式中纯函数