數學建模python matlab 編程(疾病傳播模型)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM