「歴史」を持つ数学モデルのフェーズポートレートを取得するコードを作成する必要があります。私はコードの後に説明します。数学的モデリング - Matlab ode45-forループ
close all;
clear all;
times = 1990:1:2015;
hold on
b=zeros(1,26); %75-2000 per 5 years
b(1:5)=0.0358;
b(6:10)=0.0339;
b(11:15)=0.0311;
b(16:20)=0.0275;
b(21:26)=0.0249;
m=zeros(1,26); %90-2015 per 5 years
m(1:5)=0.008;
m(6:10)=0.0031;
m(11:15)=0.0137;
m(16:20)=0.0147;
m(21:26)=0.0125;
l=zeros(1,26); %90-2015 per 5 years
l(1:5)=0.015;
l(6:10)=0.031;
l(11:15)=0.026;
l(16:20)=0.015;
l(21:26)=0.014;
u=zeros(1,26); %90-2015 per 5 years
u(1:5)=0.04;
u(6:10)=0.02;
u(11:15)=0.038;
u(16:20)=0.05;
u(21:26)=0.035;
S=zeros(1,26);
I=zeros(1,26);
N=zeros(1,26);
S(1)=18442000;
I(1)=186000; %1990
N(1)=18628000;
P=zeros(1,26); %15 years before S
P(1:5)=12788000;
P(6:10)=14731000;
P(11:15)=16968000;
P(16:20)=19696000;
P(21:26)=22893000;
for i=1:26
[time, xy] = ode45('test_func',times,[S(i) I(i) N(i) P(i) b(i) m(i) l(i) u(i)]);
plot(time,xy(:,1),'-g',time,xy(:,2),'-r',time,xy(:,3),'-b');
end
function rhs = test_func(t,xx)
S = xx(1);
I = xx(2);
N = xx(3);
P = xx(4);
b = xx(5);
m = xx(6);
l = xx(7);
u = xx(8);
Sdot=b*P-m*S-l*S*I;
Idot=l*S*I-(m+u)*I;
Ndot=Sdot+Idot;
rhs = [Sdot; Idot; Ndot; P; b; m; l; u;];
end
詳細一覧:
S
=健常者集団I
=感染人口N
=総人口b
=出生率(15年前S
へ)- 012死亡率による疾患への接触
u
上は=死亡率l
=感染の確率=
P
とS
は(S
にP
= 15年前)だけ異なる時間帯に同じことを表しまた、すべてP
値が与えられます。
S
,I
およびN
のフェイズポートレートを返す必要があります。私は100%確実に私のコードが私の目的であると確信しているわけではありませんが、これは私が思いついたものです。現在、コードは実行されますが、終了しません。私のコード上の提案やエラーを修正するための助けを歓迎します。
Iはまた、右ode45は、プロット間のループのために、必要に応じて内部以下を添加することを考えていた:
if i<26
xy(i+1)=S(i+1);
xy(i+27)=I(i+1);
xy(i+53)=N(i+1);
end
エラーメッセージは、 'rhs'と' xx'のサイズが 'test_func'で同じではないために発生します。 1) 'sdot'、 'Idot'、' Ndot'の大きさはそれぞれ 'b'、' m'、 'l'、' u'の2つのリビジョンで同じ大きさにすることができます'は1 x 26です。これらのベクトルのそれぞれから関連するコンポーネントのみを使用してください。 2) 'test'関数に' b'、 'm'、' l'、 'u'と同じように' P'を与えてください。それ以外の場合は、 'Pdot'を定義する必要があります。 –
私は上記のポストに変更して寸法が一致するようにしましたが、上記のようにまだ私が望んだ結果ではありません –
ねえ。私はあなたのコードのクリーンアップ版をテストしました。走るのに不当に長い時間がかかります。 'test_func'に問題があるからだと思います。私は数量の単位に問題があると思う。 –