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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
采用ode45和lsqcurvefit结合的方法,对微分方程组的参数求最优解,效果如图,第二张表不理想,
  ~6 @6 d' Y2 a6 v6 m, d# U感觉只获得了局部最优解。如何优化,不知有没有大神能否提供有效解决方法。
4 }  m/ i9 K( {$ g, A& e
. U3 s- V/ a3 q. v' p! I$ o4 a: y, E- A. t  G- A1 z
微分方程:
- n" G) j% S; G; u$ \" f. WN = 11000000/250;
0 y1 a! i4 c% ^- ]- Gdydt(1)=-k(1)*(y(3)/N)*y(1)-k(2)*(y(4)/N)*y(1);2 N" U- X9 U! N
dydt(2)=k(1)*(y(3)/N)*y(1)+k(2)*(y(4)/N)*y(1)-k(3)*y(2);3 a1 d6 _; n7 V) A" q" x
dydt(3)=k(3)*k(4)*y(2)-k(7)*y(3);
; B/ m1 h7 M- ~: i' I; Gdydt(4)=k(3)*k(5)*y(2)-k(6)*y(4);' s9 c$ F0 b" S& C% N
dydt(5)=k(3)*(1-k(4)-k(5))*y(2);
5 X6 m% R9 j$ ]7 k6 k& ^) S& z% Edydt(6)=k(6)*y(4)+k(7)*y(3)-k(8)*y(6)-k(9)*y(6);
; Y+ Y) H* V0 d# {dydt(7)=k(8)*y(6);
1 R1 }0 O' W+ T5 b5 Vdydt(8)=k(9)*y(6);
: @! R# |; j+ e0 _; w4 a* Udydt(9)=dydt(3)+dydt(4)+dydt(6);$ |) h6 O& R  [3 r" A
. h9 e- \4 S& I/ R9 I9 [
y0=[43994;0;1;5;0;0;0;0;6]; % 初始状态
1 D1 }+ V" e8 V: T- jk0=[7,5,0.5,0.58,0.2,0.94,0.7,0.2,0.03]; %猜测参数初值5 e7 z) F! Y! o4 x& K9 l
/ f2 r$ |  p6 l( W  e$ c
lb=[2 1 0.01 0.01 0.001 0.001 0.001 0.001 0.001]; % 参数下限( u( W+ m* s) L- e2 F) r
ub=[30 30 1 1 1 1 1 1 1];  % 参数上限
" ^) M7 ^% I2 I, ^2 x
$ i' o1 q" P# f3 X" Z8 Y代码如下:(如果不能运行可能是复制文本有错误,附件备用代码.m文件)$ O* C! T6 R8 c& r0 w# {3 h: [
clear;clc;close all;
4 P7 F& k" L- L* N0 O& H/ A- e/ x3 \format long" b4 j5 s8 _- l9 T( A1 I' @7 \

4 m9 A# ^3 \6 r" ~' X%方程9真实数据
9 K- }) F  x8 C& U6 tydata1 = [6,  12,  19,  25,  31,  38,  44,  60,  80,  131,  131,  259,  467,  688,  776 ...,: M  C+ s2 Q2 q/ w( j
1776,  1460,  1739,  1984,  2101,  2590,  2827,  3233,  3892,  3697,  3151 ...,; A' m: C/ c9 S7 t( M* L
3387,  2653,  2984,  2473,  2022,  1820,  1998,  1506,  1278,  2051,  1772 ...,2 c" y( d. Q$ }$ J
1891,  399,  894,  397,  650,  415,  518,  412,  439,  441,  435,  579,  206 ...,: U7 }  Z3 o5 Q) H& f" b
130,  120,  143,  146,  102,  46,  45,  20,  31,  26,  11,  18,  27,  29,  39,  39]';
! i& z" N3 u! ^%方程8真实数据. W2 ?3 Q2 q% g9 x
! N& X$ f4 W$ g! r- l% D
ydata2= [0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  4,  8,  15,  15,  25,  26,  26 ...,9 a, b$ w7 r" q$ P' H
    38,  43,  46,  45,  57,  64,  66,  73,  73,  86,  89,  97,  108,  97,  254 ...,$ B" |- H$ I! I
    121,  121,  142,  106,  106,  98,  115,  118,  109,  97,  150,  71,  52,  29 ...,
9 @3 q9 n2 R+ R) F+ M    44,  37,  35,  42,  31,  38,  31,  30,  28,  27,  23,  17,  22,  11,  7,  14 ...,- t6 `& x, p9 |. O1 w* l3 S
    10,  14,  13,  13]';( l$ ~/ w9 n! I0 b' z' X) J

& n3 [# u+ {# O! \5 L, `1 cn=size(ydata1,1);%获取数据长度8 }7 C1 }7 J5 N- q! g# j
tspan=1:1:n;% size=n*16 n! O/ m5 r! D( q" q" d& B, v

+ G! x7 ?. |- DN = 11000000/250;
# ^! C" h- y# qy0=[43994;0;1;5;0;0;0;0;6]; % 初始状态. [. z' w, ~) a) ]+ S% c
k0=[7,5,0.5,0.58,0.2,0.94,0.7,0.2,0.03]; %猜测参数初值$ N; Y2 h5 g! D8 N* ?
0 T+ n2 B1 t2 }) ], [$ W9 O
lb=[2 1 0.01 0.01 0.001 0.02 0.02 0.001 0.001]; % 参数下限
+ i" l% F2 s% w# g; H) pub=[30 30 1 1 1 1 1 1 1];  % 参数上限% T0 K6 H2 g$ @! t' L! M
$ c' c* ^4 n$ E: B& B0 A4 X- `
%% ---------------------------------------------------------------------2 L0 n; O0 v8 \! y" i9 m  H/ x

& {2 u7 B: O4 g+ t% 使用函数lsqcurvefit()进行参数估计+ l& ^& n7 j) C* p1 U: ~+ t
options = optimset('MaxFunEvals',5000,'MaxIter',2000*12);
% I. h0 k& ~: Z, b, m$ E% `" P[k,resnorm]=lsqcurvefit(@(k,tspan)model(k,tspan,y0),k0,tspan,[ydata2 ydata1],lb,ub,options);
2 w5 [7 z' @3 P; x4 j/ u3 @' o5 x9 c& E
%% ----------------绘制结果图-----------------------------------------------------
) N2 L$ k3 l- S; {1 g! p7 R8 a[t,Y]=ode45(@(t,y)rigid(t,y,k),tspan,y0);1 s# O6 i9 g/ S
% 绘制y9人数随天数变化图以及模拟变化图
8 H; w; u6 z6 `3 O5 f- ~figure(1)
8 t$ `2 a$ e% u/ Y0 Z2 L8 Bsubplot(1,2,1);% w0 H1 M+ P$ G9 S5 r+ [. A
plot(t,Y(:,9),'k',tspan,ydata1,'-g'),legend('模拟值','真实数据','Location','best');
/ u& Z) R- k6 ]6 m& txlabel('时间');ylabel('确诊人数');
7 R4 `5 L$ q' I1 G, r
! q' z3 ?$ I  F, R; F0 M7 T% 绘制y8人数随天数变化图以及模拟变化图" W  Z1 t8 H. j  }, b; p* W9 P
subplot(1,2,2);
. t# {1 ~2 o2 d6 yplot(t,Y(:,8),'k',tspan,ydata2,'-r'),legend('模拟值','真实数据','Location','best');
9 K/ @' b( [6 y/ Hxlabel('时间');ylabel('人数');# H5 n* W& w" [+ L* f+ G5 i
! A/ m- [5 q6 x
clearvars -except k %只保留k8 J; E& f- b" M, f! X

4 a) D  t) ?% k%% ---------------------------------------------------------
1 k8 v, c; {, B2 `& N3 }1 W" l. C
, Q7 _' Y4 q/ h* `6 tfunction p=model(k,tspan,y0) % 目标函数# C. n: |' v0 r/ S* }# K8 T
[~,Y]=ode45(@(t,y)rigid(t,y,k),tspan,y0);% 调用语句, ^" k" n: Q! h& A: n
p=Y(:,8:9);
9 H5 U4 j0 y; F2 e( Z  b# v4 `end* _7 K" N3 r. b
, U! h; N. ~) Y- [  K
%% ---------------------------------------------------------
3 s# B4 l1 `' L
6 D' ~% u% k3 s( vfunction dydt=rigid(~,y,k)    % 微分方9 \3 U3 g9 w; C, O. b, t
N = 11000000/250;; l7 L: s7 [3 N9 }5 z
dydt = zeros(9,1);. X( m+ _- \8 S& v
1 z9 \! j& i8 `- H) v2 D
dydt(1)=-k(1)*(y(3)/N)*y(1)-k(2)*(y(4)/N)*y(1);
( i. r% w1 `/ o% N. N: c$ Wdydt(2)=k(1)*(y(3)/N)*y(1)+k(2)*(y(4)/N)*y(1)-k(3)*y(2);
( q- f7 I6 j3 v8 f4 `* ndydt(3)=k(3)*k(4)*y(2)-k(7)*y(3);
" }3 s- Q, c* t; Tdydt(4)=k(3)*k(5)*y(2)-k(6)*y(4);9 i- B3 K  }9 k% t4 [4 r
dydt(5)=k(3)*(1-k(4)-k(5))*y(2);/ B& I/ r9 P7 b9 M  v
dydt(6)=k(6)*y(4)+k(7)*y(3)-k(8)*y(6)-k(9)*y(6);
7 ?* n+ a! @2 E  T1 l- D9 Sdydt(7)=k(8)*y(6);
' a1 T: w) T# L* edydt(8)=k(9)*y(6);' D/ T( f& h( p
dydt(9)=dydt(3)+dydt(4)+dydt(6);: N0 @3 i5 t* M4 Y' H7 Q; S5 l
end/ ~" Y" C5 @4 U# Z4 @+ @6 Y

  q2 v- _3 `1 E+ n
& U( D# h* Q+ k, S, w

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 03:08 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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