最小二乘法曲线拟合以及Matlab实现

在实际工程中,我们常会遇到这种问题:已知一组点的横纵坐标,需要绘制出一条尽可能逼近这些点的曲线(或直线),以进行进一步进行加工或者分析两个变量之间的相互关系。而获取这个曲线方程的过程就是曲线拟合。

目录

  • 最小二乘法直线拟合原理
  • 曲线拟合
  • Matlab实现代码

最小二乘法直线线拟合原理

首先,我们从曲线拟合的最简单情况——直线拟合来引入问题。如果待拟合点集近似排列在一条直线上时,我们可以设直线 y=ax+by=ax+by=ax+b 为其拟合方程,系数 A=[a,b]A=[a,b]A=[a,b] 为待求解项,已知:

用矩阵形式表达为: Y=X0AY=X_{0}AY=X0​A,其中:

要求解A,可在方程两边同时左乘 X0X_{0}X0​ 的逆矩阵,如果它是一个方阵且非奇异的话。

但是,一般情况下 X0X_{0}X0​ 连方阵都不是,所以我们在此需要用 X0X_{0}X0​ 构造一个方阵,即方程两边同时左乘 X0X_{0}X0​ 的转置矩阵,得到方程: X0TY=X0TX0AX_{0}^{T}Y=X_{0}^{T}X_{0}AX0T​Y=X0T​X0​A 。

此时,方程的系数矩阵 X0TX0X_{0}^{T}X_{0}X0T​X0​ 为方阵,所以两边同时左乘新系数矩阵 X0TX0X_{0}^{T}X_{0}X0T​X0​ 的逆矩阵,便可求得系数向量A ,即:(X0TX0)−1X0TY=A(X_{0}^{T}X_{0})^{-1}X_{0}^{T}Y=A(X0T​X0​)−1X0T​Y=A 。

方程A=(X0TX0)−1X0TYA=(X_{0}^{T}X_{0})^{-1}X_{0}^{T}YA=(X0T​X0​)−1X0T​Y 右边各部分均已知,所以可直接求解得到拟合直线的方程系数向量A。

曲线线拟合

当样本点的分布不为直线时,我们可用多项式曲线拟合,即拟合曲线方程为n阶多项式

y=∑i=0naixi=anxn+an−1xn−1+...+a1x+a0y=\sum_{i=0}^{n}a_ix^i=a_nx^n+a_{n-1}x^{n-1}+...+a_1x+a_0y=∑i=0n​ai​xi=an​xn+an−1​xn−1+...+a1​x+a0​ 。

用矩阵形式表示为: Y=X0AY=X_0AY=X0​A ,其中:

待求解项为系数向量A=[an,an−1,...,a2,a1,a0]TA=[a_n,a_{n-1},...,a_2,a_1,a_0]^TA=[an​,an−1​,...,a2​,a1​,a0​]T。

曲线拟合方程Y=X0AY=X_0AY=X0​A 的求解方法与上面直线的求解方法一样,也是在方程Y=X0AY=X_0AY=X0​A 两边同左乘X0X_0X0​的转置矩阵得到: X0TY=X0TX0AX_{0}^{T}Y=X_{0}^{T}X_{0}AX0T​Y=X0T​X0​A,

再同时在新方程两边同时左乘X0TX0X_{0}^{T}X_{0}X0T​X0​ 的逆矩阵,得到:(X0TX0)−1X0TY=A(X_{0}^{T}X_{0})^{-1}X_{0}^{T}Y=A(X0T​X0​)−1X0T​Y=A

上式左边各部分均已知,所以可直接求解得拟合曲线方程的系数向量A。

Matlab实现代码

%by hanlestudy@163.com
clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
[~,k]=size(x);
for n=1:9X0=zeros(n+1,k);for k0=1:k           %构造矩阵X0for n0=1:n+1X0(n0,k0)=x(k0)^(n+1-n0);endendX=X0';ANSS=(X'*X)\X'*y';for i=1:n+1          %answer矩阵存储每次求得的方程系数,按列存储answer(i,n)=ANSS(i);endx0=0:0.01:17;y0=ANSS(1)*x0.^n    ;%根据求得的系数初始化并构造多项式方程for num=2:1:n+1     y0=y0+ANSS(num)*x0.^(n+1-num);endsubplot(3,3,n)plot(x,y,'*')hold onplot(x0,y0)
end
suptitle('不同次数方程曲线拟合结果,从1到9阶')

运行结果

拟合曲线结果:

可以看出看来,当多项式的阶数过小是,曲线并不能很好地反映出样本点的分布情况;但阶数过高时,会出现过拟合的情况。

系数矩阵answer:

Matlab自带函数——polyfit

在matlab中,也有现成的曲线拟合函数polyfit,其也是基于最小二乘原理实现的,具体用法为:ans=polyfit(x,y,n). 其中x,y为待拟合点的坐标向量,n为多项式的阶数。

下面代码是用polyfit函数来做曲线拟合:

clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
[~,k]=size(x);
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
for n=1:9ANSS=polyfit(x,y,n);  %用polyfit拟合曲线for i=1:n+1           %answer矩阵存储每次求得的方程系数,按列存储answer(i,n)=ANSS(i);endx0=0:0.01:17;y0=ANSS(1)*x0.^n    ; %根据求得的系数初始化并构造多项式方程for num=2:1:n+1     y0=y0+ANSS(num)*x0.^(n+1-num);endsubplot(3,3,n)plot(x,y,'*')hold onplot(x0,y0)
end
suptitle('不同次数方程曲线拟合结果,从1到9阶')

运行结果:

用polyfit拟合的结果与第一份代码运行的结果基本一样

申明

本文为本人原创,转载请注明出处!

最小二乘法曲线拟合以及Matlab实现相关推荐

  1. 最小二乘法曲线拟合程序matlab,最小二乘法曲线拟合(代码环境:matlab)

    题目一: 1.用表1-1中的世界人口统计数值估计1980年的人口,求最佳最小二乘法数值估计: 表 1-1: 年 人口 1960 3 039 585 530 1970 3 707 475 887 199 ...

  2. matlab polyfit c语言,算法——纯C语言最小二乘法曲线拟合

    算法--纯C语言最小二乘法曲线拟合 [复制链接] 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注 ...

  3. 最小二乘法入门(Matlab直线和曲线拟合)

    参考博客:https://blog.csdn.net/wokaowokaowokao12345/article/details/72850143 多的就不多说了,持续脱发中!!! 最小二乘法历史起源之 ...

  4. c语言平曲线,算法——纯C语言最小二乘法曲线拟合

    算法--纯C语言最小二乘法曲线拟合 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注释,数学推导等 ...

  5. 多项式最小二乘法曲线拟合Python程序

    #多项式最小二乘法曲线拟合 from numpy import * from numpy.linalg import * X = [1, 3, 4, 5, 6, 7, 8, 9, 10] Y = [2 ...

  6. 最小二乘法曲线拟合 java_最小二乘法拟合java实现源程序(转)

    因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用. /** * 函数功能:最小二乘法曲线拟合 * @param x 实型一维数组,长度为 ...

  7. matlab曲线拟合 最低点,Matlab曲线拟合 最小二乘法 polyfit【转】

    曲线拟合 已知离散点上的数据集 ,即已知在点集 上的函数值 ,构造一个解析函数(其图形为一曲线)使 在原离散点 上尽可能接近给定的 值,这一过程称为曲线拟合.最常用的曲线拟合方法是最小二乘法,该方法是 ...

  8. 基于最小二乘法的图像边界曲线拟合(matlab平台)

    **(源码资源****有常(注意目前是有常哦)私我vx:xdsqczkyqs713,源码(带GUI,GUI是用户界面的意思)40圆, 加一份课设报告50圆,加vx之前注意下后边的说明内容哦**,**说 ...

  9. matlab 最小二乘法绘图,用MatLab画图(最小二乘法做曲线拟合)

    之前帮朋友利用实验数据画图,发现MatLab的确是画图的好工具,用它画的图比Excel光滑.精确.利用一组数据要计算出这组数据对应的函数表达式从而得到相应图像,MatLab的程序如下: x=[1  5 ...

  10. 数值计算大作业:最小二乘法拟合(Matlab实现)

    作为研究生的入门课,数值计算的大作业算是所有研究生开学的重要编程作业. 我把最小二乘算法在MATLAB中整合成了一个M函数文件least square fitting.m,直线拟合函数lsf_line ...

最新文章

  1. 史上最强神经网络绘制神器来啦!一系列暗黑操作!
  2. CentOS 6.x 使用安装光盘作为yum源
  3. Linux tar.gz、tar、bz2、zip的区别,如何选择呢
  4. 一步步编写操作系统 23 重写主引导记录mbr
  5. c++输出重定向 linux,C++ stderr/stdout 重定向到文件
  6. 【Java】application run failed Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and
  7. [linux]centos7.4上升级python2版本到python3.6.5 【安装双版本,默认python3】
  8. 英语四六级听力有线传输无线发射系统方案
  9. vivado中bit文件怎么没有生成_【新手入门】ISE工程升级到Vivado及板级信号调试技术...
  10. 新睿云告诉您主流操作:分布式操作系统、批处理操作系统、分时操作系统优缺点分析!
  11. 华为设备如何将接口配置为中继模式_华为无线路由器怎么设置中继
  12. linux历史数据导出命令,Linux Bash history从入门到进阶
  13. LeetCode237——删除链表中的节点
  14. python 管道游戏_用python写游戏之 Flappy Bird
  15. ppt讲解中的过渡_PPT「过渡页」怎么设计才好看?
  16. polplayer下载网址和polplayer直播源
  17. 移动app隐私政策规范条款参考模板示例
  18. 前端js数组元素的筛选,修改,新增属性小技巧一---前端数据筛选filter()函数,更新数组map()函数;
  19. 西门子在华启动“零碳先锋计划”;希尔顿欢朋在华项目签约数突破600 | 美通社头条...
  20. 【原创】xenomai+linux双内核下的时钟管理机制

热门文章

  1. 精选16款超精美的XP登录界面下载
  2. SOC厂商--全志瑞芯微
  3. 桂林理工大学 就业指导 2021 创业项目计划书样本
  4. 数字人实业应用场景,远远不止屏幕互动
  5. Microsoft Visual C++ Build Tools下载/解决Visual C++ 14.0 is required问题
  6. YDOOK:ESP8266 flash 工具 flash_download_tool_v3.8.5 下载安装教程
  7. 遥感图像——几何畸变和几何校正
  8. Redis单线程模型
  9. 数字图像处理·SLIC超像素分割算法C++实现
  10. mysql front和mysql_安装 MySQL 和 MySQL-Front