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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
采用ode45和lsqcurvefit结合的方法,对微分方程组的参数求最优解,效果如图,第二张表不理想,; o$ C8 K. E& V1 \) h- K  @
感觉只获得了局部最优解。如何优化,不知有没有大神能否提供有效解决方法。
4 V' {! s: t7 h+ O- S/ x. `
% d, M* H1 p' X& \! x
  [( i: Z/ ?" A. H7 e; i( z/ b微分方程:1 [8 c# E/ n& T. `' B- A
N = 11000000/250;
+ x: C# I2 N  U% b( z. V' ~& I8 z( d5 N9 jdydt(1)=-k(1)*(y(3)/N)*y(1)-k(2)*(y(4)/N)*y(1);) s3 k# w+ f7 R2 G
dydt(2)=k(1)*(y(3)/N)*y(1)+k(2)*(y(4)/N)*y(1)-k(3)*y(2);0 A9 U: t: o/ h1 Q' N4 `
dydt(3)=k(3)*k(4)*y(2)-k(7)*y(3);
5 q( `5 u6 u' u1 m! \' ?dydt(4)=k(3)*k(5)*y(2)-k(6)*y(4);# S9 Q5 U& v! W
dydt(5)=k(3)*(1-k(4)-k(5))*y(2);* ~7 |$ U  b. F( [6 F9 ~7 G
dydt(6)=k(6)*y(4)+k(7)*y(3)-k(8)*y(6)-k(9)*y(6);
6 n3 d7 J; V, h  Fdydt(7)=k(8)*y(6);( R) z! D* K6 I% n/ q- a9 L7 I
dydt(8)=k(9)*y(6);6 Q" l5 i5 P4 s- {' l
dydt(9)=dydt(3)+dydt(4)+dydt(6);
( V. F: ^( c4 z- T; o# {9 [
6 e5 C5 Y0 F  B" Z% \- w" Zy0=[43994;0;1;5;0;0;0;0;6]; % 初始状态) P$ @4 K2 o( W$ x" _  Z
k0=[7,5,0.5,0.58,0.2,0.94,0.7,0.2,0.03]; %猜测参数初值/ b  X) {  y6 I" G3 i9 ]) F
& L" [3 \, E/ G7 M2 f0 }8 D: X
lb=[2 1 0.01 0.01 0.001 0.001 0.001 0.001 0.001]; % 参数下限
: |$ J/ u6 s  f  r4 z+ i$ q4 cub=[30 30 1 1 1 1 1 1 1];  % 参数上限1 ?) x: `+ l6 @3 ?2 M4 Y
4 }4 m; z( x/ h( U
代码如下:(如果不能运行可能是复制文本有错误,附件备用代码.m文件)6 c- E& X( g. J# [: I! r
clear;clc;close all;; T2 w/ Q; U) P  U7 N7 w' K
format long
  _% j8 G. k: g, r$ J
+ j' E8 e: w7 L: e$ E%方程9真实数据
) G- n0 [6 k+ m  P, \+ xydata1 = [6,  12,  19,  25,  31,  38,  44,  60,  80,  131,  131,  259,  467,  688,  776 ...,
% c5 d% ?; i% ?# q" Y+ I; `+ p1776,  1460,  1739,  1984,  2101,  2590,  2827,  3233,  3892,  3697,  3151 ...,
5 y; ~5 W' q- [! l& I3387,  2653,  2984,  2473,  2022,  1820,  1998,  1506,  1278,  2051,  1772 ...,. G4 G  p3 X/ Z7 J0 @8 D$ C, |
1891,  399,  894,  397,  650,  415,  518,  412,  439,  441,  435,  579,  206 ...,
1 Z% j8 {, G' L130,  120,  143,  146,  102,  46,  45,  20,  31,  26,  11,  18,  27,  29,  39,  39]';# X) G* [$ |; R
%方程8真实数据
2 E4 C/ T! }4 T: g# o1 {0 o  }( Z2 @: q+ Y  R
ydata2= [0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  8,  15,  15,  25,  26,  26 ...,
3 a1 r; }; s* ^* \; k! f. S9 {    38,  43,  46,  45,  57,  64,  66,  73,  73,  86,  89,  97,  108,  97,  254 ...,
9 W5 {$ k& R% H* l: j2 a# e    121,  121,  142,  106,  106,  98,  115,  118,  109,  97,  150,  71,  52,  29 ...,2 j* u* G2 A$ I% h( ~8 @) j
    44,  37,  35,  42,  31,  38,  31,  30,  28,  27,  23,  17,  22,  11,  7,  14 ...,8 @& ]" }& P# g  p, }
    10,  14,  13,  13]';3 a, D0 n+ V/ r6 X4 v3 X
9 c# R, c( C% O: m& \, R
n=size(ydata1,1);%获取数据长度9 Y1 E, e9 ]' g
tspan=1:1:n;% size=n*1$ d5 }! T+ z5 f; p
4 y, M3 [2 S* D) ?
N = 11000000/250;6 d$ j  I6 v- r7 |3 v* M% M. x
y0=[43994;0;1;5;0;0;0;0;6]; % 初始状态; }3 Q) c- [9 U
k0=[7,5,0.5,0.58,0.2,0.94,0.7,0.2,0.03]; %猜测参数初值
6 y6 O" G# f5 I! o" T$ A/ w' t( O8 L0 J* C" b
lb=[2 1 0.01 0.01 0.001 0.02 0.02 0.001 0.001]; % 参数下限
( X: ]( B6 f6 y5 z! @ub=[30 30 1 1 1 1 1 1 1];  % 参数上限
- [8 i5 S* N6 Y0 R$ B2 F9 Z# ^% a1 d+ ?6 p0 f9 p- {
%% ---------------------------------------------------------------------: v* V% O( @- P, {
* ~! }1 H/ R3 P$ O  F
% 使用函数lsqcurvefit()进行参数估计
: ^( |" k# }4 K* C# h; soptions = optimset('MaxFunEvals',5000,'MaxIter',2000*12);
- F  L) U: M5 p) q# D( W[k,resnorm]=lsqcurvefit(@(k,tspan)model(k,tspan,y0),k0,tspan,[ydata2 ydata1],lb,ub,options);$ _- Z& A2 O: `4 R/ B" q7 w
* D* ?( [1 C! k) e0 P3 s' e
%% ----------------绘制结果图-----------------------------------------------------7 S2 z, l. G8 {& J9 s9 G- e. B
[t,Y]=ode45(@(t,y)rigid(t,y,k),tspan,y0);
5 q8 a) {* ?) G4 y4 k- n0 z. S% 绘制y9人数随天数变化图以及模拟变化图
8 k7 E' g4 l* V, \% Efigure(1)
+ o1 n) @  q* `$ M6 ^subplot(1,2,1);
2 B1 k1 w: ]3 u: d# }/ a7 Qplot(t,Y(:,9),'k',tspan,ydata1,'-g'),legend('模拟值','真实数据','Location','best');
& O8 X+ B* K! A$ K3 f# M; N4 }xlabel('时间');ylabel('确诊人数');- t; I* g' i( P  n! C7 M

6 d- X% ?& U0 z; D) _+ U6 y: K4 [( G% 绘制y8人数随天数变化图以及模拟变化图
% y  {. c- w' Xsubplot(1,2,2);) O/ K& }8 E: ]+ s7 E9 y' @- o
plot(t,Y(:,8),'k',tspan,ydata2,'-r'),legend('模拟值','真实数据','Location','best');4 R2 o8 `. e$ i2 C
xlabel('时间');ylabel('人数');
* v, r1 P1 G" C& j" C$ X4 T2 e" |7 u* F) m& @9 Y* y
clearvars -except k %只保留k% }) n6 ]1 g: P

3 B+ D$ w! I  j7 W%% ---------------------------------------------------------
0 b& q8 x1 P4 C' b, g" L9 I; H! ~+ F% M
function p=model(k,tspan,y0) % 目标函数
" H0 l0 V* |- Y5 T7 I[~,Y]=ode45(@(t,y)rigid(t,y,k),tspan,y0);% 调用语句
  Z2 r9 z9 d( m8 P7 m! np=Y(:,8:9);
0 s6 ]  T- a4 W- R& D7 l+ E6 }end
0 y/ \% z! g$ ~2 z$ j
4 V6 ~! |+ E# X4 T$ ^# v1 m9 B%% ---------------------------------------------------------# l: T: K1 b- O8 Q2 ?$ D2 l

1 F8 W/ J' c  ]; |3 F6 yfunction dydt=rigid(~,y,k)    % 微分方
/ g3 N/ {5 [" h1 HN = 11000000/250;  _% s/ x8 r" \
dydt = zeros(9,1);
( `2 H5 t/ j' k/ R  y# D4 Y" z0 q5 I" }' T
dydt(1)=-k(1)*(y(3)/N)*y(1)-k(2)*(y(4)/N)*y(1);6 ^& o: T; K1 ]9 e* K
dydt(2)=k(1)*(y(3)/N)*y(1)+k(2)*(y(4)/N)*y(1)-k(3)*y(2);, \# d4 C: i# U9 C4 u! t5 B4 {
dydt(3)=k(3)*k(4)*y(2)-k(7)*y(3);2 T# h! h3 O8 y; d9 ?7 R. O& i/ g9 V
dydt(4)=k(3)*k(5)*y(2)-k(6)*y(4);" t# S) j( G$ y; [; ^8 T2 z4 H; Z# y
dydt(5)=k(3)*(1-k(4)-k(5))*y(2);
' i; t/ a* a! E1 C1 ^: ]dydt(6)=k(6)*y(4)+k(7)*y(3)-k(8)*y(6)-k(9)*y(6);" E8 e- c* i4 U
dydt(7)=k(8)*y(6);0 m: o2 {; o) `7 l+ p* i
dydt(8)=k(9)*y(6);
2 O) H5 @% e+ M( idydt(9)=dydt(3)+dydt(4)+dydt(6);
9 a+ g- U9 `" a- a/ H1 _( vend# @$ |- s, X! a5 ~) J
6 r+ W# u6 t3 P

/ A3 p1 Z- i/ {% x

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-5 03:06 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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