QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2135|回复: 4
打印 上一主题 下一主题

玩转MATLAB非线性拟合

[复制链接]
字体大小: 正常 放大

90

主题

105

听众

9483

积分

  • TA的每日心情

    2017-1-30 23:35
  • 签到天数: 318 天

    [LV.8]以坛为家I

    2010挑战赛参赛者

    2011挑战赛参赛者

    2012挑战赛参赛者

    2013挑战赛参赛者

    社区QQ达人

    群组物联网工程师培训

    群组Matlab讨论组

    群组2013认证赛C题讨论群组

    群组数学建模

    群组2013认证赛A题讨论群组

    跳转到指定楼层
    1#
    发表于 2014-5-21 14:26 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    问题:有些时候我们需要拟合一些非线性的表达式。
    比如:我们知道一个表达式的式子是y=A*sin(x).*exp(x)-B./log(x),现在我们手里面有x与y对应的一大把数据。我们如何根据x,y的值找出最佳的A、B值。则我们现在借助Matlab的函数lsqcurvefit、nlinfit,当然你也可以使用lsqnonlin.其具体用法请自己用Matlab的帮助命令进行查看。这里仅简单介绍一下常用的方式。
    , H2 I6 D4 }3 J' O4 }* D" F' @
    PS:如果使用Matlab以上函数拟合不出理想的结果的话,可以尝试使用我自己写的《数学计算器》里的nlinFit、nlinFitGA、nlinFitLM、nlinFitPSO、nlinFitPSO2
    & O' J4 Q& P7 O; k: d4 c- A  c! n
    格式:lsqcurvefit(f,a,x,y)、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的值
    . U+ @( ~, D; C$ B8 X
    例子1:
    问题:对于函数y=a*sin(x)*exp(x)-b/log(x)我们现在已经有多组(x,y)的数据,我们要求最佳的a,b值
    %针对上面的问题,我们可以来演示下如何使用这个函数以及看下其效果
    >> x=2:10;
    >> y=8*sin(x).*exp(x)-12./log(x);
    %上面假如是我们事先获得的值
    >> a=[1 2];
    >> f=@(a,x)a(1)*sin(x).*exp(x)-a(2)./log(x);
    %第一种方法使用lsqcurvefit
    >> lsqcurvefit(f,a,x,y)
    ans =
       7.999999999999987  11.999999999988997%和我们预期的值8和12结合得非常好
    >>
    %第二种方法使用nlinfit
    >> nlinfit(x,y,f,a)
    ans =
       8.000000000000000  11.999999999999998
    >>
    %**********************************
    %另一种方法,假如我们写了一个如下的m文件
    function f=test(a,x)
    f=a(1)*sin(x).*exp(x)-a(2)./log(x);
    end
    %则在上面lsqcurvefit函数调用如下,不要忘记那个@
    lsqcurvefit(@test,a,x,y)
    7 `+ Y/ M0 k% D# U$ R( p

    + E6 I0 A& r! M) b
    例子2(多元的情况,注意看格式)
    问题:我们已知z=a*(exp(y)+1)-sin(x)*b且有多组(x,y,z)的值,现在求最佳系数a,b
    >> x=2:10;
    >> y=10*sin(x)./log(x);
    >> z=4.5*(exp(y)+1)-sin(x)*13.8;
    >> f=@(a,x)a(1)*(exp(x(2,:)+1)-sin(x(1,:))*a(2);
    %第一种方法使用lsqcurvefit
    >> lsqcurvefit(f,[1 2],[x;y],z)%注意这里面的[x;y],这里的[1 2]表示我们设置f函数里的初始值a(1)=1,,a(2)=2
    ans =
       4.499999999999999  13.800000000000024
    %第二种方法使用nlinfit
    >> nlinfit([x;y],z,f,[1 2])
    ans =
       4.500000000000000  13.799999999999956
    >>
    zan
    转播转播1 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    多多发帖,受益多多

    7

    主题

    49

    听众

    3217

    积分

  • TA的每日心情
    无聊
    2016-8-1 15:33
  • 签到天数: 340 天

    [LV.8]以坛为家I

    社区QQ达人

    群组数学中国第二期SAS培训

    群组2013年美赛优秀论文解

    群组第四届cumcm国赛实训

    群组数学建模算法之matlab

    群组数模思想方法大全

    回复

    使用道具 举报

    kedi87135     中国数模人才认证   

    2

    主题

    13

    听众

    531

    积分

    升级  77%

  • TA的每日心情
    慵懒
    2016-2-8 17:28
  • 签到天数: 69 天

    [LV.6]常住居民II

    新人进步奖

    群组数学建模培训课堂1

    回复

    使用道具 举报

    20

    主题

    14

    听众

    455

    积分

    升级  51.67%

  • TA的每日心情
    开心
    2017-2-26 17:20
  • 签到天数: 139 天

    [LV.7]常住居民III

    自我介绍

    社区QQ达人

    群组第六届国赛赛前冲刺培

    群组2014国赛优秀论文解析

    群组2015国赛冲刺

    群组国赛讨论

    群组2014研究生数学建模竞

    回复

    使用道具 举报

    kedi87135     中国数模人才认证   

    2

    主题

    13

    听众

    531

    积分

    升级  77%

  • TA的每日心情
    慵懒
    2016-2-8 17:28
  • 签到天数: 69 天

    [LV.6]常住居民II

    新人进步奖

    群组数学建模培训课堂1

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-7-27 06:07 , Processed in 0.461697 second(s), 77 queries .

    回顶部