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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
采用ode45和lsqcurvefit结合的方法,对微分方程组的参数求最优解,效果如图,第二张表不理想,
  p  r) P, `4 T4 h9 O5 B* N感觉只获得了局部最优解。如何优化,不知有没有大神能否提供有效解决方法。
' Q- r% e3 D. S+ X+ G6 f
2 U7 X3 {6 r1 a: g
  r6 J  Y) Y/ i  H) b4 g5 ^微分方程:
" n' Z$ V6 Z6 y. tN = 11000000/250;; j" ~! l4 G" A3 M
dydt(1)=-k(1)*(y(3)/N)*y(1)-k(2)*(y(4)/N)*y(1);
% J1 Y) h- D4 z. {dydt(2)=k(1)*(y(3)/N)*y(1)+k(2)*(y(4)/N)*y(1)-k(3)*y(2);
, m" N8 m+ j% C; u, bdydt(3)=k(3)*k(4)*y(2)-k(7)*y(3);
- _( r9 H2 [, I$ O; a) udydt(4)=k(3)*k(5)*y(2)-k(6)*y(4);# |3 P! X% J8 t0 ?& m1 I; {2 o% `
dydt(5)=k(3)*(1-k(4)-k(5))*y(2);9 U7 d5 W% |$ A# `. b/ D4 ?4 ?4 h
dydt(6)=k(6)*y(4)+k(7)*y(3)-k(8)*y(6)-k(9)*y(6);% m1 ^: H& ~6 B2 K' W
dydt(7)=k(8)*y(6);
0 M2 M& C+ U+ h: H* I+ c* c! E) O+ Udydt(8)=k(9)*y(6);! L( \( d  L8 t9 I1 F3 `/ L/ c( R
dydt(9)=dydt(3)+dydt(4)+dydt(6);
: ~* j! i7 ]: k1 d9 X' c& U2 Z: D9 d6 _4 ]% j* b8 h
y0=[43994;0;1;5;0;0;0;0;6]; % 初始状态
* M0 q. ]1 G5 V& r- W# B+ C5 kk0=[7,5,0.5,0.58,0.2,0.94,0.7,0.2,0.03]; %猜测参数初值! ]+ @1 i1 N/ [
/ ]+ Z4 g1 f$ y6 ~8 c3 h: S
lb=[2 1 0.01 0.01 0.001 0.001 0.001 0.001 0.001]; % 参数下限$ w) ?: [. ]  U# v4 ?2 X
ub=[30 30 1 1 1 1 1 1 1];  % 参数上限! `" y. Y, K( Z( M! N% V6 O4 v' K
- x4 J9 q, d5 a1 e" o
代码如下:(如果不能运行可能是复制文本有错误,附件备用代码.m文件)/ W0 V* \  R+ U% X
clear;clc;close all;4 B* l$ A- K# e2 F& P2 l4 p
format long
* ?; K* s, ?$ W, A( k, e0 g7 s# f( ~5 ?& \1 }
%方程9真实数据
0 }8 K8 h( M0 a4 ~" Q. {ydata1 = [6,  12,  19,  25,  31,  38,  44,  60,  80,  131,  131,  259,  467,  688,  776 ...,
4 ^& M6 h# h$ C2 K6 M$ C$ r. [1776,  1460,  1739,  1984,  2101,  2590,  2827,  3233,  3892,  3697,  3151 ...,
+ w3 \. _! }( C4 L! U% F3387,  2653,  2984,  2473,  2022,  1820,  1998,  1506,  1278,  2051,  1772 ...,
# Y. q4 f# }# @5 X# B/ X, q% j# E1891,  399,  894,  397,  650,  415,  518,  412,  439,  441,  435,  579,  206 ...,
/ L3 }* A# U# @: g130,  120,  143,  146,  102,  46,  45,  20,  31,  26,  11,  18,  27,  29,  39,  39]';
2 k7 q- l; i+ W; C%方程8真实数据
! N' x* M* T2 q/ E- X" r) k2 k; K* H7 j- d: ~" Q
ydata2= [0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  8,  15,  15,  25,  26,  26 ...,; y" ?1 s3 ^+ {; i! h+ ~+ ~
    38,  43,  46,  45,  57,  64,  66,  73,  73,  86,  89,  97,  108,  97,  254 ...,
( S3 S1 e) E' N5 [    121,  121,  142,  106,  106,  98,  115,  118,  109,  97,  150,  71,  52,  29 ...,3 r$ }* ^, x+ r) ?. C/ f0 @
    44,  37,  35,  42,  31,  38,  31,  30,  28,  27,  23,  17,  22,  11,  7,  14 ...,$ M. ?9 E& T  s$ H
    10,  14,  13,  13]';5 c& u2 o$ V* v# W
- D4 @: P7 g9 Z3 {: ?
n=size(ydata1,1);%获取数据长度' q  r, m) m$ t) p; g4 K
tspan=1:1:n;% size=n*13 Q( V* r  L( l' `7 }4 j
4 N- A* N. X4 B: R/ f
N = 11000000/250;
9 d! i& }( R$ X: W( e  Y/ ty0=[43994;0;1;5;0;0;0;0;6]; % 初始状态5 f+ g: J  {1 a
k0=[7,5,0.5,0.58,0.2,0.94,0.7,0.2,0.03]; %猜测参数初值* e0 U6 @, A# ]% V

4 e* k  p7 R+ |lb=[2 1 0.01 0.01 0.001 0.02 0.02 0.001 0.001]; % 参数下限
7 M% u6 C0 K4 |. Q/ oub=[30 30 1 1 1 1 1 1 1];  % 参数上限
3 M6 d6 `  B6 i& ?3 R2 R* r$ v- ]
% d6 h, e" x8 N3 Q. P+ Y1 u) E%% ---------------------------------------------------------------------
% I$ l2 x. f# J" }- Z' j& L
1 z9 x) u/ x" S/ [) i( x4 N% 使用函数lsqcurvefit()进行参数估计
( J' E5 p) m; v# }options = optimset('MaxFunEvals',5000,'MaxIter',2000*12);; e- q2 \' J* ?- {; Q
[k,resnorm]=lsqcurvefit(@(k,tspan)model(k,tspan,y0),k0,tspan,[ydata2 ydata1],lb,ub,options);
0 J  c; v# }; x' u% c
. U# \/ c5 g) a%% ----------------绘制结果图-----------------------------------------------------5 N7 M4 }! I9 i1 x0 G
[t,Y]=ode45(@(t,y)rigid(t,y,k),tspan,y0);
8 T# f& @- q9 e5 c6 U- T$ k% 绘制y9人数随天数变化图以及模拟变化图
' u. q4 ^# b, G8 S' K1 u9 b0 Xfigure(1)" e0 B9 s9 ^2 p; E7 U
subplot(1,2,1);  l7 V; G$ ^+ G
plot(t,Y(:,9),'k',tspan,ydata1,'-g'),legend('模拟值','真实数据','Location','best');$ j- l6 [" X7 l+ e* E. Y  r
xlabel('时间');ylabel('确诊人数');* }5 w( C8 R( I4 Z9 V
$ j) r8 ?0 F' [' p
% 绘制y8人数随天数变化图以及模拟变化图: x& e2 ~" G1 r" ~) M1 H
subplot(1,2,2);
  K+ }4 A- x- Y5 Gplot(t,Y(:,8),'k',tspan,ydata2,'-r'),legend('模拟值','真实数据','Location','best');
8 l( d. j. F& T3 c% t9 Y6 [xlabel('时间');ylabel('人数');$ i9 o. Z% V! b& B# Y

5 P6 i2 c% _3 a) B. i; @. J$ B! xclearvars -except k %只保留k
5 o6 ~& E# R4 b; A* T1 |) \
( D5 e/ s' i- a6 T9 d$ m) y+ d1 Q%% ---------------------------------------------------------
, ]8 W* ]0 H) Y1 V  e: {4 k" }. O( t! j( w3 U' G+ g- l/ r
function p=model(k,tspan,y0) % 目标函数
( \1 t( Y+ Q9 A[~,Y]=ode45(@(t,y)rigid(t,y,k),tspan,y0);% 调用语句
$ S( ^! \0 k/ ^p=Y(:,8:9);, X5 p; L- q: J- ~( N$ C# n
end
7 F& n9 d+ U) o% S
+ G% @! N, A4 b0 P+ |# E. N%% ---------------------------------------------------------; e. F3 ?9 Y3 a( \1 ?; n
/ Y. g5 W, ~% B. c$ ^
function dydt=rigid(~,y,k)    % 微分方" U; E8 M# n- Q( I
N = 11000000/250;( K" V7 n. s: [4 e4 R
dydt = zeros(9,1);  D2 i$ i+ Z. K" |
8 g% r" g4 r  z3 L2 B
dydt(1)=-k(1)*(y(3)/N)*y(1)-k(2)*(y(4)/N)*y(1);
( |" K: [. g8 l8 mdydt(2)=k(1)*(y(3)/N)*y(1)+k(2)*(y(4)/N)*y(1)-k(3)*y(2);
1 J$ h% p$ }8 i3 Xdydt(3)=k(3)*k(4)*y(2)-k(7)*y(3);
) B2 Y4 H1 f* @: ~( {; L" Xdydt(4)=k(3)*k(5)*y(2)-k(6)*y(4);4 V; L5 x# X  S. U0 I
dydt(5)=k(3)*(1-k(4)-k(5))*y(2);4 v: ]/ J) v  x: i" }1 [
dydt(6)=k(6)*y(4)+k(7)*y(3)-k(8)*y(6)-k(9)*y(6);% d/ A: U1 m2 p& w, Y
dydt(7)=k(8)*y(6);
) l3 t7 t& c1 D) p, J/ ~dydt(8)=k(9)*y(6);5 A9 ]  u6 b- L1 m
dydt(9)=dydt(3)+dydt(4)+dydt(6);
/ L2 f) g# H0 Q( g* z  \7 I8 uend: [  R/ o! x, t/ E0 `6 ]8 d
7 m/ s" n2 r* \. x: R6 @
8 O  L, \+ X# J" W# M

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 22:15 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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