例12:一隻遊船上有800(1000)人,一名遊客不慎患傳染病,12(10)小時後有3人發病,由于船上不能及時隔離,問經過60(30)小時,72小時,患此病的人數。(與人口模型和Logistic模型類似)
先用python和matlab模拟
我的python代碼
# -*- coding: utf-8 -*-
import numpy as np
import random
import matplotlib
matplotlib.rcParams['font.sans-serif']=[u'simHei']
matplotlib.rcParams['axes.unicode_minus']=False
import pandas as pd
import matplotlib.pyplot as plt
p_size=10000
get_ill_p = 0.1
is_ill = np.zeros(p_size)
is_ill[0]=1
ill_n =1
x=[]
y=[]
for time in range(100):
x.append(time)
y.append(ill_n)
# 周遊每一個交往的人數
for i in range(ill_n):
# 交往的人數再0-2個人内
renshu = np.random.randint(0,2)
for j in range(renshu):
# 随機挑一個人
p = np.random.randint(0,p_size)
# 如果p沒患病
if is_ill[p]==0 and random.random()<0.5:
is_ill[p]=1
ill_n += 1
plt.plot(x,y)

我的matlab代碼
clear;
p_size=10000;
get_ill_p = 0.1;
is_ill = zeros(1,p_size);
is_ill(1)=1;
ill_n =1;
y(1)=1;
for time =1:150
y(time)=ill_n;
% 周遊每一個交往的人數
for i =1:ill_n
% 交往的人數再0-2個人内
renshu = randperm(2,1); % 産生0到2内的随機整數
for j =1:renshu
% 随機挑一個人
p = randperm(p_size,1); % 産生0到p_size内的随機整數
% 如果p沒患病
if is_ill(p)==0 && rand(1)<get_ill_p
is_ill(p)=1;
ill_n = ill_n+ 1;
end
end
end
end
plot(y,'o');
老師的matlab代碼1
clear
d=800; %%%總的患病人數。
y=ones(1,d);%%%“1”表示健康的人。
y(1)=0; %%%第1個人患病了。
for n=1:240 %%%考慮200個時間機關後的情況。
y=y(randperm(d)); %%%将y的順序打亂。
z=[y(2:d)];z(d)=y(1); %%%考慮 y 後面一個人, 最後一個人的後面拟定為第一個人。
%%%每一個人可随機與另一個人接觸,在一維中足夠可表達這個意思.
R=find((y==0)&z==1); %%%找出患者即将傳染的人。隻有健康的人才會成為新的患者。
for k=1:size(R,2) %%%size(R,2)為第 n 個機關時間的總的“傳播機會”.
w=randperm(15);p=(w(1)>=2); %%%不是隻要一個健康的人接觸患者就會成為病人的。傳染病有感染程度的不同。
z(R(k))=1.*p;
end
y=z; %%%經過一個時段後新的分布産生了。
s(n)=numel(find(z==0)); %%%計算總的患病人數。
end
s;plot(s) %%%畫出患病人數曲線圖。
老師的matlab代碼2
clear
t=1:240;
y=800./(1+799.*exp(-0.09176.*t));
plot(y)
老師的matlab代碼3
clear
d=800; %%%總的患病人數。
y=ones(1,d);%%%“1”表示健康的人。
y(1)=0; %%%第1個人患病了。
for n=1:240 %%%考慮200個時間機關後的情況。
y=y(randperm(d)); %%%将y的順序打亂。
z=[y(2:d)];z(d)=y(1); %%%考慮 y 後面一個人, 最後一個人的後面拟定為第一個人。
%%%每一個人可随機與另一個人接觸,在一維中足夠可表達這個意思.
R=find((y==0)&z==1); %%%找出患者即将傳染的人。隻有健康的人才會成為新的患者。
for k=1:size(R,2) %%%size(R,2)為第 n 個機關時間的總的“傳播機會”.
w=randperm(15);p=(w(1)>=2); %%%不是隻要一個健康的人接觸患者就會成為病人的。傳染病有感染程度的不同。
z(R(k))=1.*p;
end
y=z; %%%經過一個時段後新的分布産生了。
s(n)=numel(find(z==0)); %%%計算總的患病人數。
end
s;plot(s) %%%畫出患病人數曲線圖。
s(72)
老師的matlab代碼4
clear
d=800; %%%總的患病人數。
y=ones(1,d);%%%“1”表示健康的人。
y(1)=0; %%%第1個人患病了。
for n=1:240 %%%考慮200個時間機關後的情況。
y=y(randperm(d)); %%%将y的順序打亂。
z=[y(2:d)];z(d)=y(1); %%%考慮 y 後面一個人, 最後一個人的後面拟定為第一個人。
%%%每一個人可随機與另一個人接觸,在一維中足夠可表達這個意思.
R=find((y==0)&z==1); %%%找出患者即将傳染的人。隻有健康的人才會成為新的患者。
for k=1:size(R,2) %%%size(R,2)為第 n 個機關時間的總的“傳播機會”.
w=randperm(11);p=(w(1)>=2); %%%不是隻要一個健康的人接觸患者就會成為病人的。傳染病有感染程度的不同。
z(R(k))=1.*p;
end
y=z; %%%經過一個時段後新的分布産生了。
s(n)=numel(find(z==0)); %%%計算總的患病人數。
end
s;plot(s) %%%畫出患病人數曲線圖。
s(72)
轉載于:https://www.cnblogs.com/caiyishuai/p/11193338.html