当前位置: 首页 > 计算模拟 >求解微分方程参数拟合的问题并模拟混沌现象

求解微分方程参数拟合的问题并模拟混沌现象

作者 shengyw
来源: 小木虫 150 3 举报帖子
+关注

新人金币终于够了,可以发帖了。
现在写论文遇到了一个障碍,是希望通过实际数据进行一个微分方程的参数辨识,然后利用拟合出来的参数进行混沌现象的模拟以及时间序列图的模拟等。
之前看过一篇参考文献对实际数据的处理如下图所示,参考这篇文献我也想对我的方程进行实际数据的参数辨识,我的方程如下所示:
用到的原始数据如下:
                    x                       y                z
2008        3923        797.24        6589.35
2009        5843        481.14        7295.21
2010        8194        574.47        9387.21
2011        12781        737.65        13217.37
2012        15247        833.77        15486.97
2013        18052        923.19        16735.09
2014        22168        1022.37        19691.06
2015        20820        1076.14        20126.82
2016        25212        1133.57        22801.22
2017        24211        1246.67        22653.54
归一化插值法以后得到的数据如下:
X        Y        Z
0        0.412916541        0
0.045093711        0.206458271        0.021769852
0.090187421        0        0.043539703
0.14540373        0.060957768        0.108060329
0.200620039        0.121915536        0.172580955
0.308351731        0.228495291        0.290709215
0.416083423        0.335075046        0.408837475
0.474000658        0.397855081        0.478835569
0.531917892        0.460635116        0.548833663
0.597796985        0.519039098        0.58732768
0.663676077        0.577443079        0.625821697
0.760345719        0.642221729        0.71698854
0.85701536        0.707000379        0.808155382
0.825355818        0.742119839        0.821594918
0.793696275        0.777239298        0.835034453
0.896848138        0.814749259        0.917517227
1        0.852259219        1
0.976490206        0.92612961        0.995445313
0.952980412        1        0.990890625
求大神帮忙看看怎么用代码实现,可有偿!

求解微分方程参数拟合的问题并模拟混沌现象
微信图片_20200109201816.png


求解微分方程参数拟合的问题并模拟混沌现象-1
图片1.png@月只蓝 返回小木虫查看更多

今日热帖
  • 精华评论
  • shengyw

    引用回帖:
    2楼: Originally posted by 独孤神宇 at 2020-01-09 20:47:02
    微分方程组参数拟合 ,参考

    http://blog.sina.com.cn/s/blog_c0cb8ce60102ysqu.html

    function ODEfunctiongroup
    clear all;
    clc;
    k0 = [0.01  0.01  0.01  0.01  0.01  0.01  0.01  0.01  0.01  0.01  0.01  0.01  0.01  0.01];         % 参数初值
    lb = [0  0  0  0  0  0  0  0  0  0  0  0  0  0];                   % 参数下限
    ub = [+inf  +inf  +inf  +inf  +inf  +inf  +inf  +inf  +inf  +inf  +inf  +inf  +inf  +inf];    % 参数上限
    x0 = [0.015   0.758   1.83];  %初始状态
    % 动力学数据:
    %  t          y1            y2          y3      
    ExpData = ...
    [  0           0           0.412916541   0
       1       0.045093711  0.206458271 0.021769852
       2       0.090187421      0       0.043539703
       3       0.14540373   0.060957768 0.108060329
       4       0.200620039  0.121915536 0.172580955
       5       0.308351731  0.228495291 0.290709215
       6       0.416083423  0.335075046 0.408837475
       7       0.474000658  0.397855081 0.478835569
       8       0.531917892  0.460635116 0.548833663
       9       0.597796985  0.519039098 0.58732768
       10      0.663676077  0.577443079 0.625821697
       11      0.760345719  0.642221729 0.71698854
       12      0.85701536   0.707000379 0.808155382
       13      0.825355818  0.742119839 0.821594918
       14      0.793696275  0.777239298 0.835034453
       15      0.896848138  0.814749259 0.917517227
       16          1        0.852259219       1
       17      0.976490206  0.92612961  0.995445313
       18      0.952980412      1       0.990890625

    ];
    yexp = ExpData(:,2:4);                  % yexp: 对应实验数据[x1   x4  x5  x6]
    % 使用函数fmincon()进行参数估计
    [k,fval,flag] = fmincon(@ObjFunc4Fmincon,k0,[],[],[],[],[],[],[],[],[],[],[],[],[],lb,ub,[],[],x0,yexp);
    fprintf('\n使用函数fmincon()估计得到的参数值为:\n')
    fprintf('\tk1 = %.4f\n',k(1))
    fprintf('\tk2 = %.4f\n',k(2))
    fprintf('\tk3 = %.4f\n',k(3))
    fprintf('\tk4 = %.4f\n',k(4))
    fprintf('\tk5 = %.4f\n',k(5))
    fprintf('\tk5 = %.4f\n',k(6))
    fprintf('\tk5 = %.4f\n',k(7))
    fprintf('\tk5 = %.4f\n',k(8))
    fprintf('\tk5 = %.4f\n',k(9))
    fprintf('\tk5 = %.4f\n',k(10))
    fprintf('\tk5 = %.4f\n',k(11))
    fprintf('\tk5 = %.4f\n',k(12))
    fprintf('\tk5 = %.4f\n',k(13))
    fprintf('\tk5 = %.4f\n',k(14))
    fprintf('The sum of the squares is: %.1e\n\n',fval)
    k_fmincon = k;

    % 这一步通常被省略,通过反复迭代初始值得到最优解,加上后可以降低对初始值的依赖。
    % 以函数fmincon()估计得到的结果为初值,使用函数lsqnonlin()进行参数估计
    % 需要指出,这种方法并非在所有场合均有效,但有时确实可以改善求解效果。

    % 使用函数lsqnonlin()进行参数估计
    [k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
        lsqnonlin(@ObjFunc4LNL,k0,lb,ub,[],x0,yexp);      
    ci = nlparci(k,residual,jacobian);
    fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
    Output(k,ci,resnorm)
    % 以函数fmincon()估计得到的结果为初值,使用函数lsqnonlin()进行参数估计
    k0 = k_fmincon;
    [k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
        lsqnonlin(@ObjFunc4LNL,k0,lb,ub,[],x0,yexp);      
    ci = nlparci(k,residual,jacobian);
    fprintf('\n\n以fmincon()的结果为初值,使用函数lsqnonlin()估计得到的参数值为:\n')
    Output(k,ci,resnorm)
    function dxdt = KineticEqs(t,x,k)
    dxdt =[k(1)*x(1)*(1-x(2)/k(10))+k(2)*x(2)+k(3)*x(3)
           k(4)*x(1)*(1-x(1)/k(14))+k(5)*x(2)*(1-x(2)/k(12))+k(6)*x(3)*(1-x(3)/k(13))
           k(8)*x(1)*(1-x(1)/k(14))+k(8)*x(2)*(x(2)/k(12)-1)+k(9)*x(3)*(x(2)/k(11)-1)];
       
    这是我根据您的那篇文章修改的代码,但是跑不出来,希望您指导一下,MATLAB小白太痛苦了

  • 独孤神宇

    数据归一化后,模型也需要归一化处理。

    另外,你的模型只有9个参数。

猜你喜欢
下载小木虫APP
与700万科研达人随时交流
  • 二维码
  • IOS
  • 安卓