例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)