找回密码
 注册
关于网站域名变更的通知
查看: 586|回复: 3
打印 上一主题 下一主题

ode45和lsqcurvefit结合,对微分方程组的参数求最优解

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-2-24 13:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
采用ode45和lsqcurvefit结合的方法,对微分方程组的参数求最优解,效果如图,第二张表不理想,% h' g2 D& n' P1 n
感觉只获得了局部最优解。如何优化,不知有没有大神能否提供有效解决方法。
0 Z! y% W" F+ o: U* i9 x( b- g! A
( W  h# ~; ?9 u2 h9 _1 z
微分方程:3 N9 r' z: {) B9 b
N = 11000000/250;
% P: C- i- R& V2 U8 ~dydt(1)=-k(1)*(y(3)/N)*y(1)-k(2)*(y(4)/N)*y(1);
# U+ a: V% [/ u* g( E7 T- T+ Kdydt(2)=k(1)*(y(3)/N)*y(1)+k(2)*(y(4)/N)*y(1)-k(3)*y(2);
7 T  s8 g5 \1 l" pdydt(3)=k(3)*k(4)*y(2)-k(7)*y(3);& N2 G# F9 V4 v" A' V
dydt(4)=k(3)*k(5)*y(2)-k(6)*y(4);( P" f0 ^8 d4 Z6 l
dydt(5)=k(3)*(1-k(4)-k(5))*y(2);
3 \( c4 d% T' s$ Edydt(6)=k(6)*y(4)+k(7)*y(3)-k(8)*y(6)-k(9)*y(6);9 u- p2 _( L- s( Q: J! e' A9 z+ D* B
dydt(7)=k(8)*y(6);4 O3 F, k5 ^# n
dydt(8)=k(9)*y(6);
5 T6 Y& ^. V- ^& Z' _8 ]dydt(9)=dydt(3)+dydt(4)+dydt(6);
8 z# ]0 i- J8 g
- E1 ?, V% ?7 R/ Z) }8 qy0=[43994;0;1;5;0;0;0;0;6]; % 初始状态
& K8 @  u) u5 \( h9 N# q* Jk0=[7,5,0.5,0.58,0.2,0.94,0.7,0.2,0.03]; %猜测参数初值: ~! g; x: J2 o/ j! }
& d* t2 B  i% I; F3 k
lb=[2 1 0.01 0.01 0.001 0.001 0.001 0.001 0.001]; % 参数下限( s3 Z7 x& S+ N# s6 h
ub=[30 30 1 1 1 1 1 1 1];  % 参数上限
& ?' l9 F9 T5 f, I* ?) x
: M2 f7 p) Q2 Z& E. r代码如下:(如果不能运行可能是复制文本有错误,附件备用代码.m文件)3 M3 A! S6 l) ~9 ~) R
clear;clc;close all;
3 l! i- W! ]8 A6 [+ }, kformat long$ y' ?+ Y( x7 C7 |2 K
% v: h# b" R8 a# i6 W1 ?
%方程9真实数据
4 d5 S0 t* q- W* dydata1 = [6,  12,  19,  25,  31,  38,  44,  60,  80,  131,  131,  259,  467,  688,  776 ...,  ], \* j1 _2 K7 B9 l
1776,  1460,  1739,  1984,  2101,  2590,  2827,  3233,  3892,  3697,  3151 ...,
4 p, M" j# X  n. V' |+ W3387,  2653,  2984,  2473,  2022,  1820,  1998,  1506,  1278,  2051,  1772 ...,
3 j7 K3 B; z% O1 }' V2 Y! H1891,  399,  894,  397,  650,  415,  518,  412,  439,  441,  435,  579,  206 ...,' [3 U) Y% O7 k/ X' N  [2 `" _, P
130,  120,  143,  146,  102,  46,  45,  20,  31,  26,  11,  18,  27,  29,  39,  39]';' {  p& M6 r6 r! X0 I( g0 [
%方程8真实数据$ Q: l* I& e( [0 ]& p1 U+ e5 T
! s- |6 a3 o, Y. v8 r/ p  T
ydata2= [0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  8,  15,  15,  25,  26,  26 ...,* O- D1 |  |. f2 t) b
    38,  43,  46,  45,  57,  64,  66,  73,  73,  86,  89,  97,  108,  97,  254 ...,
  t3 _7 y8 G4 U+ a3 Z+ q0 a    121,  121,  142,  106,  106,  98,  115,  118,  109,  97,  150,  71,  52,  29 ...,/ B6 ~( I7 i  M6 o6 @
    44,  37,  35,  42,  31,  38,  31,  30,  28,  27,  23,  17,  22,  11,  7,  14 ...,/ l, T6 N9 V9 K( r, l" M* O
    10,  14,  13,  13]';
. v* n0 f+ x( T! T7 E4 h" V5 ]- L* M( G4 K+ D
n=size(ydata1,1);%获取数据长度
3 `# `. [) r+ {0 ztspan=1:1:n;% size=n*1
/ J6 Z* J$ U5 A% F, G" E
, f( I& }0 c  N$ [N = 11000000/250;
; N; N1 |& J6 ]2 l* F7 ?: E! d* A+ n! jy0=[43994;0;1;5;0;0;0;0;6]; % 初始状态
# T- o- O5 i0 s9 r8 [3 tk0=[7,5,0.5,0.58,0.2,0.94,0.7,0.2,0.03]; %猜测参数初值4 R2 a  P3 X2 K* D, E. U  L: ]

3 k4 q/ Q- H7 }lb=[2 1 0.01 0.01 0.001 0.02 0.02 0.001 0.001]; % 参数下限
( a& p- _- _9 l8 `! @' g2 Y5 Qub=[30 30 1 1 1 1 1 1 1];  % 参数上限% @. P2 @  ~; c4 o4 K8 |2 P" V

5 `) [8 ?5 r8 U* N) p! ^%% ---------------------------------------------------------------------* k6 j- z, r& j+ ]1 }) _

% r4 l" k3 D; w: u' q% 使用函数lsqcurvefit()进行参数估计
, Y. f1 z$ H# Poptions = optimset('MaxFunEvals',5000,'MaxIter',2000*12);3 B+ n) Y2 ~0 l, v5 L
[k,resnorm]=lsqcurvefit(@(k,tspan)model(k,tspan,y0),k0,tspan,[ydata2 ydata1],lb,ub,options);  @/ M( h9 p; i1 _" r$ R* t- N

% h: }' [/ B7 `! d& L" G, b+ f%% ----------------绘制结果图-----------------------------------------------------
% F9 W: O. ^/ z' `6 ~3 B[t,Y]=ode45(@(t,y)rigid(t,y,k),tspan,y0);
  V" I# ~0 v# N% G4 P$ j, X# q% 绘制y9人数随天数变化图以及模拟变化图1 q% h( s9 o7 u6 y* O
figure(1)
' `7 P2 [. W- X7 J* dsubplot(1,2,1);
# f. u( N+ d# M! iplot(t,Y(:,9),'k',tspan,ydata1,'-g'),legend('模拟值','真实数据','Location','best');% W- i2 m$ N3 i& D! \% a$ u
xlabel('时间');ylabel('确诊人数');
: u6 U$ R. J9 Z" W) N  Z  \, q+ P! n) ?' g, S
% 绘制y8人数随天数变化图以及模拟变化图# k6 {9 h5 @' D
subplot(1,2,2);
7 X& Y2 _4 p: U2 g2 ?1 tplot(t,Y(:,8),'k',tspan,ydata2,'-r'),legend('模拟值','真实数据','Location','best');9 d  e5 `/ Z: b2 N) h5 l: Q8 ~
xlabel('时间');ylabel('人数');" n% y# s, }, P0 E( I4 ?( A

& K/ q  o1 X( g  ?2 r+ s% p, y4 Dclearvars -except k %只保留k
* l6 o% r  @+ d$ w& U2 J9 J5 @. x* N  V7 s6 e  L5 ?
%% ---------------------------------------------------------& b1 P* j  K& V6 n4 d7 A; Z9 R
' r8 p! P+ r5 K7 p3 C7 p
function p=model(k,tspan,y0) % 目标函数
, \& }" ~7 T1 P+ }0 i[~,Y]=ode45(@(t,y)rigid(t,y,k),tspan,y0);% 调用语句
; O; @$ D5 m3 g/ m" h5 j$ ^2 r3 op=Y(:,8:9);
1 e7 Q* h$ O6 e1 ^: v6 o; U9 jend
: w5 `1 \8 D: p2 ^" h& B( B  F- v6 G8 u+ ^
%% ---------------------------------------------------------
& W* O% g: V1 |! ^+ Y
+ H2 R; n; N6 R7 W: q* L1 vfunction dydt=rigid(~,y,k)    % 微分方
1 H9 X$ L7 f, o6 |7 Y  v( ?; eN = 11000000/250;
/ t/ m1 c* w8 B+ _dydt = zeros(9,1);" k; `1 u* }1 K$ J

5 h' S% f% @" x/ P& {: tdydt(1)=-k(1)*(y(3)/N)*y(1)-k(2)*(y(4)/N)*y(1);* O" G, o# O4 l- F0 h2 |: {. z
dydt(2)=k(1)*(y(3)/N)*y(1)+k(2)*(y(4)/N)*y(1)-k(3)*y(2);
5 C. d. n+ `3 Y9 \( T7 e% cdydt(3)=k(3)*k(4)*y(2)-k(7)*y(3);
$ Q/ V5 D# ~& ]# |% v* S9 {/ Adydt(4)=k(3)*k(5)*y(2)-k(6)*y(4);, I2 y& B# i! _5 z+ r
dydt(5)=k(3)*(1-k(4)-k(5))*y(2);
; Y& s4 k+ I/ k+ B0 a( E+ Ldydt(6)=k(6)*y(4)+k(7)*y(3)-k(8)*y(6)-k(9)*y(6);+ W% ?6 _8 j' O+ e6 J7 D
dydt(7)=k(8)*y(6);
- X+ P' l% v( r" M6 n: Kdydt(8)=k(9)*y(6);5 S! x. Q" p- w
dydt(9)=dydt(3)+dydt(4)+dydt(6);, q1 [& c: f1 ~# j* v
end
* O  ^$ b3 C0 }+ O2 X4 i! O# b* A+ W, u

1 F) G6 C( U; O5 b% C7 U' x7 k

该用户从未签到

2#
发表于 2021-2-24 14:12 | 只看该作者
你的实验数据明显有几个毛刺或者说疑似异常值(outlier),现实中的实际数据的确不会完美地全部分布在模型对应的曲线上,但如果严重偏离,那么这种数据究竟是否仍旧有效,都是值得探讨的。没有对数据的有效性做判断就一股脑把原始数据全扔进去,寄望于模型能匹配出合适的参数,这种做法值得商榷。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-3 00:19 , Processed in 0.109375 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表