必威体育Betway必威体育官网
当前位置:首页 > IT技术

matlab 万能实用的非线性曲线拟合方法

时间:2019-06-04 11:45:11来源:IT技术作者:seo实验室小编阅读:56次「手机版」
 

matlab 曲线拟合

      在科学计算和工程应用中,经常会遇到需要拟合一系列的离散数据,最近找了很多相关的文章方法,在这里进行总结一下其中最完整、几乎能解决所有离散参数非线性拟合的方法

第一步:得到散点数据

根据你的实际问题得到一系列的散点

例如:

x=[3.2,3.6,3.8,4,4.2,4.8,5,5.4,6.2,6.4,6.6,6.9,7.1]';%加上一撇表示对矩阵的转置
y=[0.38,0.66,1,0.77,0.5,0.66,0.83,1,0.71,0.71,1,0.87,0.83]';

第二步:确定函数模型

根据上述的实际散点确定应该使用什么样的曲线,或者说是想要模拟的曲线

t=[3.2,3.6,3.8,4,4.2,4.8,5,5.4,6.2,6.4,6.6,6.9,7.1]';
tt=[0.38,0.66,1,0.77,0.5,0.66,0.83,1,0.71,0.71,1,0.87,0.83]';
 
plot(t,tt,'.');%得到散点图

散点图如下所示:

我们已知现存的几种典型的(也是绝大多数情况下的函数模型)

选定一个与散点图像相匹配的函数模型,在此例中我们选择典型的S型曲线模型y= 1/(a+b*e^(-x)),其实此处的函数模型可以任意。

第三步:确定选用函数模型中的未知参数

 首先了解一下Matlab中的inline函数,inline是用来定义内联函数的

比如说:

y=inline('sin(x)','x') %第一个参数是表达式,第二个参数是函数变量
y(0) %计算sin(0)的值
y(pi) %计算sin(pi)的值
q=quad(y,0,1); %计算sin(x) 在0到1上的积分

之后,我们在代码中进行函数的定义

x=[3.2,3.6,3.8,4,4.2,4.5,4.8,5,5.3,5.4,5.6,5.8,6,6.2,6.4,6.6,6.9,7.1]';
y=[0.38,0.66,1,0.77,0.5,0.33,0.66,0.83,0.33,1,0.33,0.5,0.33,0.71,0.71,1,0.87,0.83]';
 
myfunc = inline('1./(beta(1)+beta(2).*exp(-x))','beta','x');%三个参数分别为:函数模型(注意需要使用点除和点乘),待定系数,自变量
 
beta0 = [0.2,0.2]';%待定系数的预估值
beta = nlinfit(x,y,myfunc,beta0);%

其中,beta返回了非线性拟合之后的待定系数,beta(1)和beta(2)表示待定系数,可以为任意数量的扩展beta(n),也就说明了选择函数模型的自由性,甚至可以有100个参数!

beta0表示的是函数模型中待定系数的预估值,可以任意设定

matlab 中的nlinfit(x,y,f,a)函数:用于拟合非线性表达式的函数

f:符号函数句柄,如果是以m文件的形式调用的时候,别忘记加@.这里需要注意,f函数的返回值是和y匹对的,即拟合参数的标准是(f-y)^2取最小值,具体看下面的例子

a:最开始预估的值(预拟合的未知参数的估计值)。如上面的问题如果我们预估A为1,B为2,则a=[1 2]

x:我们已经获知的x的值

y:我们已经获知的x对应的y的值(这部分不懂的在matlab中help命令进行了解)

求解出beta的大小:beta(1) = 1.1562  beta(2) = 15.1875;

画图:使用plot()函数

t=[3.2,3.6,3.8,4,4.2,4.8,5,5.4,6.2,6.4,6.6,6.9,7.1]';
tt=[0.38,0.66,1,0.77,0.5,0.66,0.83,1,0.71,0.71,1,0.87,0.83]';
 
plot(t,tt,'.');
hold on%保证同时显示
 
x = 0:0.01:8;
y = 1./(1.1562+15.1875.*exp(-x));
 
plot(x,y);

结果:是不是很棒!~,另外可以自行加上对应的横纵坐标内容,这里就不多说了。

总结一下matlab非线性拟合散点图的过程:得到散点数据=>确定函数模型=>求解函数模型的待定系数=>得到拟合函数的具体形式=>画出拟合图像

=========================================================================================

用过Matlab的拟合、优化和统计等工具箱的网友,会经常遇到下面几个名词:

SSE(和方差、误差平方和):The sum of squares due to ERROR

MSE(均方差、方差):Mean squared error

RMSE(均方根、标准差):Root mean squared error

R-square(确定系数):Coefficient of determination

Adjusted R-square:Degree-of-freedom adjusted coefficient of determination

下面我对以上几个名词进行详细的解释下,相信能给大家带来一定的帮助!!

一、SSE(和方差)

该统计参数计算的是拟合数据和原始数据对应点的误差的平方和,计算公式如下

SSE越接近于0,说明模型选择和拟合更好,数据预测也越成功。接下来的MSE和RMSE因为和SSE是同出一宗,所以效果一样

二、MSE(均方差)

该统计参数是预测数据和原始数据对应点误差的平方和的均值,也就是SSE/n,和SSE没有太大的区别,计算公式如下

三、RMSE(均方根)

该统计参数,也叫回归系统的拟合标准差,是MSE的平方根,就算公式如下

在这之前,我们所有的误差参数都是基于预测值(y_hat)和原始值(y)之间的误差(即点对点)。从下面开始是所有的误差都是相对原始数据平均值(y_ba)而展开的(即点对全)!!!

四、R-square(确定系数)

在讲确定系数之前,我们需要介绍另外两个参数SSR和SST,因为确定系数就是由它们两个决定的

(1)SSR:Sum

of squares of the regression,即预测数据与原始数据均值之差的平方和,公式如下

(2)SST:Total sum of squares,即原始数据和均值之差的平方和,公式如下

细心的网友会发现,SST=SSE+SSR,呵呵只是一个有趣的问题。而我们的“确定系数”是定义为SSR和SST的比值,故

其实“确定系数”是通过数据的变化来表征一个拟合的好坏。由上面的表达式可以知道“确定系数”的正常取值范围为[0

1],越接近1,表明方程的变量对y的解释能力越强,这个模型对数据拟合的也较好。

相关阅读

蚁群算法matlab

(一)蚁群算法的由来蚁群算法最早是由Marco Dorigo等人在1991年提出,他们在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称

MATLAB R2013b怎么激活?

matlab r2013b 怎样激活?matlab是一款主要面对科学计算、可视化以及交互式程序设计的高科技计算环境,目前已经发布了多个版本,这里本

MATLAB继承

继承 在 MATLAB 中继承用 < 表示 多重继承在 < 后面的各个类之间用 & 连接 和其他语言一样,可以继承基类的属性和方法 构造函数

Matlab三维网格显示一张图片(meshgrid和mesh)

在很多时候想看看深度图或灰度图的三维效果,点云的方法固然更直接,但复杂不易上手,而用Matlab的三维网格显示则方便快速了许多,下面来

matlab曲线拟合

曲线拟合不要求逼近函数通过各采样点,但要求尽量的接近这些点,使误差在某种意义上达到最小。 (一)利用函数的方式实现曲线拟合: 在mat

分享到:

栏目导航

推荐阅读

热门阅读