精华内容
下载资源
问答
  • 前两天练题的时候要用到多元非线性拟合,但是在网上找到的大多都是一些求问的帖子,真正有用的回答却不多,这里汇总一下与大家分享。 首先导入数据(参数和结果) 确定自己要拟合函数(自己画个散点图预估一下,...

    Process

    前两天练题的时候要用到多元非线性拟合,但是在网上找到的大多都是一些求问的帖子,真正有用的回答却不多,这里汇总一下与大家分享。

    • 首先导入数据(参数和结果)
    • 确定自己要拟合的函数(自己画个散点图预估一下,或者是使用SPSS的曲线估算,但是没自己画图看的舒服)
    • 确定要拟合的系数的预估值(全部写零也行,但是你得有个大概想法,比如你图像是幂次为负的幂函数,那么你就写个负值,比如-1)
    • 套用nlinfit函数,得出的bate矩阵就是你要拟合的系数矩阵。
    • covB回归系数的协方差
      mse均方误差
      beta参数最优值
      r各点处的拟合残差
      J雅各比矩阵的数值
      ErrorModelInfo错误模型信息

    Code

    clear all;
    a=xlsread("C:\Users\123\Desktop\数据.xlsx","a");%导入表a
    b=xlsread("C:\Users\123\Desktop\数据.xlsx","b");%导入表b
    s=a(:, 6);%y值(结果矩阵)
    myfunc=inline('beta(1).*x(:,1).^(beta(2))+beta(3).*x(:,2).^(beta(4))+beta(5).*x(:,3).^(beta(6))+beta(7).*x(:,4).^(beta(8))+beta(9)','beta','x');%内联函数(beta是函数自带的代表待确定的系数)
    beta0 = [1, -2 ,1, -2 ,1, -2 ,1, -2 ,60];%待定系数的预估值
    [beta,R,J,CovB,MSE,ErrorModelInfo]= nlinfit(b, s, myfunc,beta0);
    beta
    
    展开全文
  • MATLAB 实现BP神经网络的非线性系统建模-非线性函数拟合
  • matlab 万能实用的非线性曲线拟合方法

    万次阅读 多人点赞 2018-08-13 09:43:41
    在科学计算和工程应用中,经常会遇到需要拟合一系列的离散数据,最近找了很多相关的文章方法,在这里进行总结一下其中最完整、几乎能解决所有离散参数非线性拟合的方法   第一步:得到散点数据 根据你的实际...

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


     

    第一步:得到散点数据

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

    例如:

    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的解释能力越强,这个模型对数据拟合的也较好。


    展开全文
  • 首先对于函数进行分析:该函数是一个比较强的非线性函数,所以不能用一般的最小二乘法来进行拟合,如过一定要用最小二乘法,则A必须是已知的,再利用最二乘法进行拟合,附程序2.
  • 回归拟合自己的总结 20100728 1学三条命令 polyfit(x,y,n)拟合成一元幂函数一元多次 regress(y,x)可以多元 nlinfit(x,y,fun ,beta0) (可用于任何类型的函数任意多元函数应 用范围最主最万能的 ) 2同一个问题 可能这...
  • matlab-非线性拟合函数lsqcurvefit的使用和初值选取

    万次阅读 多人点赞 2019-07-18 21:31:26
    所解决问题: ...则我们现在借助Matlab函数lsqcurvefit,当然你也可以使用nlinfit、lsqnonlin甚至cftool拟合工具箱.其具体用法请自己用Matlab的帮助命令进行查看。这里仅简单介绍一下常用的函数l...

    所解决问题:
    我们知道我们的表达式是y=A+B*exp(-x.^2)-C./log(x), 而且现在我们手里面有x与y对应的一大把数据。

    我们需要根据x, y的值找出最佳的A、B、C值。则我们现在借助Matlab的函数lsqcurvefit,当然你也可以使用nlinfit、lsqnonlin甚至cftool拟合工具箱.其具体用法请自己用Matlab的帮助命令进行查看。这里仅简单介绍一下常用的函数lsqcurvefit。

    正文:
    格式:lsqcurvefit(f,a,x,y)

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

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

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

    y:我们已经获知的x对应的y的值

    例:
    问题:对于函数y=a*sin(x)*exp(x)-b/log(x)我们现在已经有多组(x,y)的数据,我们要求最佳的a,b值
    在这里插入图片描述
    答案是 A = 8.0000 12.0000 resnorm =7.7179e-20

    问题:我们知道函数是 y=A+B*exp(-(x/C).^2), 以及x y的数据
    在这里插入图片描述
    关于这个问题,我们发现它的初值设置的非常巧妙,对于初值的选取,我在大佬的一篇文章(http://blog.163.com/shikang999@126/blog/static/172624896201463111856714/)阅读到:

    拟合初值的选取问题

    因为初值对拟合速度甚至结果有一定影响,因此这里就简单说一下确定数学模型后,拟合非线性问题时,初值的选取的问题。

    1、如果已知数学模型,有一定物理意义,则建议根据物理意义选取。
    2、当无法确定初值时,且你的数学模型有导数(如果求导模型很复杂甚至没有导数,则可进行简单的差分构造),则可以采用如下的办法进行

    步骤:
    (1)求出拟合函数的一阶导数【如果有必要可求更高阶导数】
    (2)使用已知数据求出近似点的一阶导数
    (3)代入一阶导数函数以及原函数求得初值近似值

    例子:
    已知一组数据x、y满足如下关系式,求拟合数据a、b、c、d的初始近似值
    y = a + b * (x - c) ^ d

    步骤:
    (1) y’ = b * d * (x - c) ^ (d - 1)
    (2)因为已知x、y数据,则根据差分法( y’=(y2-y1)/(x2-x1) )求得一组x、y’ 的近似值,这里记 f = y’
    (3)将x、y’ 代入(1)式的方程得到如下三个方程进而求解出b、c、d
    f[1] = b * d * (x[1] - c) ^ (d - 1) ①
    f[2] = b * d * (x[2] - c) ^ (d - 1) ②
    f[3] = b * d * (x[3] - c) ^ (d - 1) ③
    (4)取任意一组x、y然后将b、c、d一起代入原方程 y = a + b * (x - c) ^ d 进而可以求得近似值 a
    (5)至此 a、b、c、d初始近似值确定完毕!

    **例:(**多元的情况,注意看格式)

    问题:我们已知z=a*(exp(y)+1)-sin(x)*b且有多组(x,y,z)的值,现在求最佳系数a,b
    在这里插入图片描述
    ans =4.5000 13.8000

    分类: matlab

    转载自:https://www.cnblogs.com/hyb965149985/p/10102335.html

    展开全文
  • MATLAB进行非线性拟合

    千次阅读 2020-04-20 16:59:39
    matlab进行非线性拟合常用最小二乘法,适用于:已经求解出函数,但含有未知数,不过已经收集到了一系列数据 1.lsqcurvefit 格式:[x, resnorm,r,flag]=lsqcurvefit(fun, c0,xdata,ydata) c0为初始解向量;xdata,...

    matlab进行非线性拟合常用最小二乘法实现,适用于:已经求解出函数,但含有未知数,不过已经收集到了一系列数据

    1.lsqcurvefit

    格式:[x, resnorm,r,flag]=lsqcurvefit(fun, c0,xdata,ydata)

    c0为初始解向量;xdata,ydata为数据;

    fun为待拟合函数(句柄函数),resnorm=sum ((fun(c,xdata)-ydata).^2),即在xdata处残差的平方和;flag为终止迭代的条件。

    例:确定模型中的参数,已知数据点:

    xdata = [3.6,7.7,9.3,4.1,8.6,2.8,1.3,7.9,10.0,5.4];

    ydata = [16,150.5,260.1,22.5,206.5,9.9,2.7,165.5,325.0,54.5];

    句柄函数举例:

    xdata=[3.6,7.7,9.3,4.1,8.6,2.8,1.3,7.9,10.0,5.4]; 
    ydata=[16,150.5,260.1,22.5,206.5,9.9,2.7,165.5,325.0,54.5];
    c0=[0 0 0];
    f_h=@(c, x) c(1)*x.^2 + c(2)*x.*sin(x) + c(3)*x.^3;
    [c,resnorm,r]=lsqcurvefit(f_h,c0,xdata,ydata);
    plot(xdata,f_h(c,xdata),xdata,ydata,'o');

    自定义函数举例:

    xdata=[3.6,7.7,9.3,4.1,8.6,2.8,1.3,7.9,10.0,5.4]; 
    ydata=[16,150.5,260.1,22.5,206.5,9.9,2.7,165.5,325.0,54.5];
    c0=[0 0 0];
    [c,resnorm,r]=lsqcurvefit(@cal,c0,xdata,ydata);
    plot(xdata,cal(c,xdata),xdata,ydata,'o');
    
    function y = cal(c,x)
    y = c(1)*x.^2 + c(2)*x.*sin(x) + c(3)*x.^3;
    end

    2.fittype

    使用fittype函数可以自定义拟合函数,可以满足线性拟合和非线性拟合。fittype函数具有很灵活的配置,基本满足各种复杂场景。

    fittpye 函数内部参数 ' independent ' 指定哪些变量为自变量,相对的 ' coefficients ' 指定哪些变量为未知量,如:

    ft = fittype('自定义函数','independent ','x');

    ft = fittype('自定义函数','coefficients',{'k','r'});

    需要注意的是,fit 函数内的自变量与因变量都需要是列矩阵,如果初始数据为行矩阵的话,需要转置一下

    fit 后面可以加参数来指定拟合参数的初始值,如:

    fo = fit( x , y , ft , 'startpoint' , [0 0]);

    1.做多项式拟合:

    x=[1;1.5;2;2.5;3];
    y=[0.9;1.7;2.2;2.6;3];
    ft=fittype('poly2');
    fo=fit(x,y,ft);
    plot(x,fo(x))  % or plot(fo, x, y);
    

    2.做非线性拟合:

    线性化拟合:

    x=[0.2,0.5,0.8,1.1,1.2,1.5,1.8,2];
    y=[2.35,1.38,0.81,0.62,0.78,1.43,2.25,3.18];
    ex= {'x^2','sin(x)','1'};
    ft=fittype(ex);
    fo=fit(x',y',ft);
    plot(x,fo(x),x,y,'o');

    非线性化拟合:

    x=[0.2,0.5,0.8,1.1,1.2,1.5,1.8,2];
    y=[2.35,1.38,0.81,0.62,0.78,1.43,2.25,3.18];
    ex= {'x^2','sin(x)','1'};
    ft=fittype('a*x^2+b*sin(x)+c','independent','x');
    fo=fit(x',y',ft);
    plot(x,fo(x),x,y,'o');

    例:在某次阻尼振荡实验中测得18组数据点,试确定其振动方程。(使用匿名函数实现)

    x=[0,0.4,1.2,2,2.8,3.6,4.4,5.2,6,7.2,8,9.2,10.4,11.6,12.4,13.6,14.4,15];

    y=[1,0.85,0.29,-0.27,-0.53,-0.4,-0.12,0.17,0.28,0.15,-0.03,-0.15,-0.07,0.059,0.08,0.032,-0.015,-0.02];

    解:由物理背景知:

    x=[0,0.4,1.2,2,2.8,3.6,4.4,5.2,6,7.2,8,9.2,10.4,11.6,12.4,13.6,14.4,15]';  %注意这里的转置
    y=[1,0.85,0.29,-0.27,-0.53,-0.4,-0.12,0.17,0.28,0.15,-0.03,-0.15,-0.07,0.059,0.08,0.032,-0.015,-0.02]';  %注意这里的转置
    f_h=@(a,k,w,x) a.*cos(k.*x).*exp(w.*x);
    ft=fittype(f_h);
    fo=fit(x,y,ft)
    xx=0:0.1:20;
    yy=fo(xx);
    plot(x,y,'r*',xx,yy,'b-');

     

    展开全文
  • 比如z=f(x,y),给出(x,y,z)的多个数据点,然后怎么拟合出f函数,给出源码就更好了</p>
  • Matlab(多元)线性回归、非线性回归、多项式拟合、(自定义函数)曲线拟合-代码示例
  • 采用遗传算法优化的BP神经网络-非线性函数拟合,各种代码齐全
  • 基于Matlab的BP神经网络在非线性函数拟合中的应用

    万次阅读 多人点赞 2017-01-14 11:13:51
    本图文详细介绍了如何利用Matlab神经网络工具箱实现BP神经网络对非线性函数拟合
  • MATLAB实现多元非线性回归

    万次阅读 多人点赞 2019-01-10 16:25:36
    简单多元非线性回归算例 现有以下数据 i x1 x2 x3 y 1 1.1 2 3.2 10.1 2 1 2 3.2 10.2 3 1.2 1.8 3 10 4 1.1 1.9 2.9 10.1 5 0.9 2.1 2.9 10 假如有以下模型: y=ax1+bx2+cx32y=ax_1+bx_2+cx_3^2y...
  • MatLab中的多项式拟合(lsqcurvefit函数非线性曲线拟合) lsqcurvefit函数 函数原型 x=lsqcurvefit(fun, x0, xdata, ydata) == 其中的参数表示为:== xdata ydata为给定数据横纵坐标 按照函数文件fun给定的函数...
  • MATLAB中有一个多元非线性拟合的功能是nlinfit 基本语法是: beta = nlinfit(X,Y,modelfun,beta0) 式子左边的beta可以是一个向量,向量的元素就是要回归的模型中的参数。 式子右边,modelfun是要回归的函数...
  • Matlab多元非线性回归(nlinfit 函数

    万次阅读 2020-01-10 14:05:50
    Matlab中使用nlinfit 函数进行多元非线性回归。
  • Matlab 使用nlinfit 函数进行多元非线性回归,并且绘制曲线拟合的误差区间一、前言二、nlinfit函数使用1、函数语法2、拟合示例:三、误差阴影绘制四、整体源码思考参考博客 一、前言 这个也是最近我接到的一个小项目...
  • 本图文详细介绍了如何利用Matlab神经网络工具箱实现多层BP神经网络对非线性函数拟合
  • matlab lsqcurvefit 非线性拟合

    万次阅读 多人点赞 2018-08-19 20:28:35
    非线性曲线拟合是已知输入向量xdata和输出向量ydata,并且知道输入与输出的函数关系为ydata=...拟合如下非线性函数 函数曲线如下所示。 fit_fun.m function diff = fit_fun(param, X) a = param(1); m = pa...
  • 在科学计算和工程应用中,经常会遇到需要拟合一系列的离散数据,最近找了很多相关的文章方法,在这里进行总结一下其中最完整、几乎能解决所有离散参数非线性拟合的方法 1 得到散点数据 根据你的实际问题得到一系列的...
  • 使用MATLAB进行多元非线性回归——nlinfit函数的使用

    万次阅读 多人点赞 2018-12-03 16:29:11
    帮我对象做数据分析时遇到的问题,发现网上matlab多元非线性回归例子很少,写下来这篇用作参考 使用beta= nlinfit(x, y, model, beta0)  ——x为自变量,可以是多个自变量 ——y为因变量,只能由一个 ——model...
  • matlab实现一/多元非线性回归

    千次阅读 2021-01-25 17:50:50
    主函数: %单引号表示转置 ...%X代表自变量输入,u代表因变量输入,myfun为函数形式 %beta0是系数向量,不知道目的,可设置为[1,1,1] %beta即为最终参数结果 [beta,r]=nlinfit(X,y,'myfun',beta0); be
  • Matlab与1stOpt多元非线性回归

    千次阅读 2020-10-29 21:08:46
    Matlab与1stOpt多元非线性回归,其中1stOpt无需设置初始值。
  • 今天遇到一个问题,是求解matlab多元函数拟合的, 但是函数关系不确定,就是需要自己定义函数关系,然后自己调试函数中需要的参数的值。 刚开始思路是自定义一个函数关系式,然后用pso求解最优参数,其最后输出的y的...
  • 另外为了对数据进行尝试,看了下《MATLAB神经网络43个案例分析》的案例,懵懵懂懂,先将第二章非线性函数拟合的代码放置如下: %% 清空环境变量 clc clear %% 训练数据预测数据提取及归一化 %下载输入输出数据 load...
  • 本文主要分两部分,第一部分介绍matlab非线性方程求解,第二部分将介绍如何用matlab去求解函数的极值。 一、非线性方程数值求解 1、单变量非线性方程求解 函数的调用格式为: x= fzero(filename,x0) 其中,...
  • 本代码主要利用MATLAB工具进行RBF网络的回归的仿真,实现非线性函数回归模拟
  • 非线性/线性函数拟合 Matlab nlinfit

    千次阅读 2018-09-07 11:21:35
    model:事先用M文件定义的非线性函数 beta0:回归系数的初始值 定义列表语法2: [Y, Delta]=nlpredci(‘model’,x,beta,r,J) 用于求取x对应的预测值Y,以及在alpha下的置信区间Delta。 代码块 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,469
精华内容 587
关键字:

matlab多元非线性函数拟合

matlab 订阅