Мне нужно сделать код, чтобы получить фазовые портреты для математической модели с «историей». Я объясню после кода.Математическое моделирование - Matlab ode45-for loop
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
)- = летальность
l
= инфекция шанс на контактu
= уровень смертности из-за болезни
P
и S
представляют то же самое только в разные периоды времени (P
= 15 лет до S
) , также указаны все значения P
.
Код должен вернуть фазовый портрет S
, I
и N
. Я определенно не на 100% уверен, что мой код прав для того, что я намереваюсь сделать, но это то, что я придумал. В настоящее время код работает, но никогда не заканчивается. Любые предложения по моему коду или помощь в исправлении ошибки приветствуются.
Я также думал о добавлении следующего внутри для петли прямо между 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'. Вы можете сделать измерения одинаковыми с 2 ревизиями: 1) Размеры 'Sdot',' Idot' и 'Ndot' равны 1 x 26, потому что' b', 'm',' l' и 'u '1 x 26. Вы должны использовать только соответствующий компонент из каждого из этих векторов. 2) Вы должны предоставить 'P' функции' test_func' так же, как вы предоставляете 'b',' m', 'l' и' u'. В противном случае вам нужно будет определить 'Pdot'. –
Я сделал замену на вышеприведенную запись, так что размеры совпадают, но, как я сказал выше, все еще не результат, который я надеялся на –
Эй. Я проверил очищенную версию вашего кода. Требуется неоправданно долгое время для запуска. Я думаю, это потому, что в 'test_func' есть проблема. Я подозреваю, что есть проблемы с единицами количества. –