Sadržaj:

Vakcinisati se ili ne? projekt o promatranju imuniteta stada kroz simulaciju bolesti: 15 koraka
Vakcinisati se ili ne? projekt o promatranju imuniteta stada kroz simulaciju bolesti: 15 koraka

Video: Vakcinisati se ili ne? projekt o promatranju imuniteta stada kroz simulaciju bolesti: 15 koraka

Video: Vakcinisati se ili ne? projekt o promatranju imuniteta stada kroz simulaciju bolesti: 15 koraka
Video: The Hidden Pandemic Screening and Talkback Session with Pamela Westphal and Adel B. Korkor, M.D. 2024, Juli
Anonim
Vakcinisati se ili ne? projekt o promatranju imuniteta stada putem simulacije bolesti
Vakcinisati se ili ne? projekt o promatranju imuniteta stada putem simulacije bolesti

Pregled projekta:

Naš projekt istražuje imunitet stada i nada se da će potaknuti ljude na cijepljenje kako bi se smanjila stopa infekcije u našim zajednicama. Naš program simulira kako bolest inficira populaciju s različitim postotkom cijepljenih i nevakcinisanih. Pokazuje imunitet stada pokazujući kako povećani broj cijepljene populacije može smanjiti broj oboljelih.

Ovo modeliramo u Matlabu koristeći koncepte teorije grafova. Teorija grafova je matematički način predstavljanja odnosa između objekata. U teoriji grafova grafovi imaju vrhove (ili čvorove) povezane rubovima (ili linijama). Za naš projekt čvorovi su dotični pojedinci, a rubovi su njihove veze. Na primjer, ako su dva čvora povezana rubom, to znači da su "prijatelji" ili da imaju neki oblik međusobnog kontakta. Ovaj kontakt je način širenja bolesti. Zbog toga smo za modeliranje našeg koncepta koristili teoriju grafova jer smo htjeli vidjeti kako se bolest širi među pojedincima koji su povezani u populaciji.

Naš projekt također uključuje Monte Carlo metodu. Metoda Monte Carlo su algoritmi koji stvaraju ponavljano slučajno uzorkovanje za primanje numeričkih rezultata. U našem projektu ovu metodu koristimo za pokretanje simulacije nekoliko puta mijenjajući postotak početne nevakcinisane kako bismo vidjeli stopu zaraze ljudi.

Sav kôd projekta je povezan na dnu!

PC kredit:

Matlabov link do teorije grafova:

Korak 1: Kreirajte Matricu susjedstva

Kreirajte matricu susjedstva
Kreirajte matricu susjedstva
Kreirajte matricu susjedstva
Kreirajte matricu susjedstva

Kreirajte novu skriptu. Našu ćemo nazvati 'infekcijaSim.m'.

Napravit ćemo varijablu 'NUMOFPEOPLE'. Možete ga dodijeliti bilo kojoj cijeloj vrijednosti. Ovo će predstavljati broj ljudi u vašoj populaciji.

Od sada ćemo to pretpostaviti

NUMOFPEOPLE = 20;

Prvo počnite koristiti Matlabove funkcije teorije grafova za neusmjereni graf.

Ako ste zainteresirani za saznanje više, ovdje je link za detaljnije čitanje o tome.

www.mathworks.com/help/matlab/math/directed-and-undirected-graphs.html

Kreirana matrica susjednosti.

adjMatrix = nule (NUMOFPEOPLE);

Ovo će stvoriti kvadratnu matricu od 0s. Svaki red u matrici je osoba. Svaka kolona u matrici je osoba ili prijatelj koje osoba sreće tokom dana.

Pogledajte sliku 100 (gore) kako biste lakše zamislili kako adjMatrix izgleda za 20 ljudi.

** Od ovog trenutka ćemo pretpostaviti da je NUMOFPEOPLE jednako 20. **

Možete pokušati iscrtati ovu matricu susjednosti. Evo malo više informacija o iscrtavanju ovih vrsta matrica.

Napomena: Kako matrica susjedstva funkcionira.

Npr:

%izrada susjedne matrice

a = [0, 1, 0, 0, 0; 1, 0, 1, 1, 1; 0, 1, 0, 0, 0; 0, 1, 0, 0, 0; 0, 1, 0, 0, 0] %iscrtavanje g = grafikon (a); %pomoću funkcije grafikona (teorija grafova) broj (1); h = parcela (g);

Pogledajte sliku 1 (gore) da vidite kako dodati ivice u matricu susjedstva, koristeći kôd u "Napomena".

Korak 2: Stvorite odnose

Stvorite odnose
Stvorite odnose

Sada kada su ljudi (vrhovi ili čvorovi) stvoreni, moramo stvoriti mrežu odnosa (linije ili rubovi grafikona). Ovo će simulirati kako ljudi komuniciraju i upoznaju druge ljude tokom dana.

To se može učiniti na mnogo načina. Jedan od načina da se dovrši ovaj zadatak je da se svakoj osobi najprije dodijeli slučajan broj kako bi se utvrdilo s koliko će osoba svaka osoba komunicirati u jednom danu.

numOfFriendsMatrix = randi ([najmanjeFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);

Ovo čini matricu 1 prema 20 nasumičnih cijelih brojeva koji predstavljaju broj interakcija koje svaka osoba ima dnevno. Stupci ove matrice bili bi broj koji odgovara svakoj osobi. Na primjer, ako dodijelimo najmanjeFriendsPersonCanHave = 2 i mostFriendsPersonCanHave = 5, dobili bismo slučajne vrijednosti između 2 i 5.

Imate problema s randi ()? U terminalu upišite

help randi

Zatim izrađujemo randomiziranu matricu (koja se naziva "allFriendsmatrix") o tome kako je svaka osoba u populaciji povezana/komunicira unutar populacije.

tempMatrix = ;

count = 0; allFriendsMatrix = ; za k = 1: NUMOFPEOPLE dok je dužina (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (count) = temp; end clear every while length (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; kraj allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; count = 0; kraj

Detaljno objašnjenje koda:

Prvo stvaramo praznu privremenu matricu koja će sadržati listu prijatelja/interakciju svake osobe. Pokrećemo i count, koji samo prati gdje staviti novu slučajnu vezu u tempMatrix. For petlje se pokreću 20 puta tako da se to dogodi svakoj pojedinačnoj osobi u populaciji. Prva while petlja traje sve dok tempMatrix svake osobe ne bude iste dužine nasumično dodijeljenog broja interakcija. U ovoj petlji, slučajni broj koji odgovara osobi u populaciji se generira i stavlja u tempMatrix. Budući da su dužine svake od tempMatrixova različite, morali smo stvoriti neke NaN vrijednosti tako da možemo sve te tempMaticies spojiti u jednu matricu ('allFriendsMatrix'). Druga while petlja rješava ovaj problem dodavanjem NaN u svaku tempMatrix. Dok je petlja postavljena da radi 9 puta jer je to broj veći od 5, što je bila gornja granica prijatelja kojima se može dodijeliti osoba. Vrijednost '9' je promjenjiva i može se/mora promijeniti kada je 'mostFriendsPersonCanHave' veće od 9. Posljednja tri retka koda (isključujući kraj) dodaje tempMatrix u sljedeći red 'allFriendsMatrix'. Zatim briše tempMatrix i računa za sljedeću osobu.

Output

Ovako bi izlaz trebao izgledati pri prvom pokretanju for petlje (prije posljednja tri retka).

tempMatrix = 16 8 17 16 13 NaN NaN NaN NaN

allFriendsMatrix =

16 8 17 16 13 NaN NaN NaN NaN NaN 8 8 2 7 11 NaN NaN NaN NaN NaN 10 13 NaN NaN NaN NaN NaN NaN NaN NaN 11 17 2 NaN NaN NaN NaN NaN NaN NaN 10 12 NaN NaN NaN NaN NaN NaN NaN NaN 4 13 2 12 NaN NaN NaN NaN NaN NaN 17 10 9 3 1 NaN NaN NaN NaN 16 16 6 NaN NaN NaN NaN NaN NaN NaN 3 8 17 17 14 NaN NaN NaN NaN NaN 20 19 3 NaN NaN NaN NaN NaN NaN NaN 13 10 NaN NaN NaN NaN NaN NaN NaN 2 18 10 16 NaN NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN NaN NaN 8 16 14 8 NaN NaN NaN NaN NaN 7 7 NaN NaN NaN NaN NaN NaN NaN NaN 19 10 9 NaN NaN NaN NaN NaN NaN NaN 10 19 NaN NaN NaN NaN NaN NaN NaN NaN 5 18 NaN NaN NaN NaN NaN NaN NaN NaN 1 7 NaN NaN NaN NaN NaN NaN NaN NaN 16 7 13 10 1 NaN NaN NaN NaN NaN

Zatim dodajte ove odnose u adjMatrix.

za svaki red = 1: NUMOFPEOPLE

for eachCol = 1: 9 if isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; kraj kraj kraj

Šifra Objašnjenje

Ova dvostruka for petlja prolazi kroz svaki red i stupac 'allFriendsMatrix'. Naredba if će se izvoditi za sve vrijednosti koje nisu 'NaN'. U osnovi će stvoriti rubove ili linije grafikona. Dakle, prvi red koji će ovo napraviti je osoba 1 prema osobi 16 i osoba 16 prema osobi 1. Budući da nije usmjeren, 1 se mora promijeniti za oboje! Ne možemo imati samo rub od 1 do 16, a ne 16 do 1. Oni moraju biti simetrični da bi mogao pravilno raditi u Matlabu.

U našoj simulaciji smo ustanovili da ljudi ne mogu komunicirati sami sa sobom. Kada smo randomizirali vrijednosti, postoji mogućnost da naša susjedna matrica ima ove greške.

Riješimo ovo sljedećim kodom:

za svaki = 1: NUMOFPEOPLE

adjMatrix (svaki, svaki) = 0; kraj

Šifra Objašnjenje

Ova petlja for osigurava da osoba 1 nije povezana s osobom 1, osoba 2 nije povezana s osobom 2, itd. Čineći ih sve 0. Kao što možete vidjeti ispod u odjeljku izlaza, imamo dijagonalu kvadrata matrica odozgo lijevo dolje desno su sve 0.

Output

Ovo je konačni adjMatrix za ovu trenutnu simulaciju. Ovo uzima u obzir sve linije na grafikonu (slika 2).

adjMatrix =

0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0

Pogledajte sliku 2 da vidite grafikon 'adjMatrix'.

Korak 3: Dodajte statistiku bolesti

Sada kada vaš program može stvoriti grafikon sa skupom slučajnih ljudi i stvoriti nasumične odnose, moramo unijeti podatke o bolesti ili statistiku da vidimo kako te interakcije unutar populacije mogu povećati ili smanjiti infekciju.

Kreirajte ove varijable:

unvacc %tip: double; posto šanse da nevakcinisani ljudi ne dobiju bolest

vakcina %tip: dvostruka; postotak šanse da vakcinisani ljudi ne dobiju bolest unvacc_perc %tip: dvostruko; posto nevakcinisane populacije init_infect %tip: int; posto vakcinisanog stanovništva

Zatim moramo napraviti neke proračune.

Napravit ćemo 'infekcijaMat' koja je 3*NUMOFPEOPLE matrica.

vakc_perc = 1-unvacc_perc;

infekcijaMat = nan (3, NUMOFPEOPLE); broj = okrugli (vakc_perc * NUMOFPEOPLE); infekcijaMat (1, 1: broj) = vakcina; infectionMat (1, broj+1: kraj) = unvacc; infekcijaMat (2, 1: kraj) = 0; infectionMat (2, 1: init_infect) = 1;

Šifra Objašnjenje

linija 1: Izračunato postotak nevakcinisane populacije

red 2: stvorite matricu 3*N broja ljudi

red 3: saznajte broj vakcinisanih osoba iz procenta vakcinisanih

linija 4: vakcinisanim osobama dajte imunitet povezan sa vakcinacijom. Ova vrijednost se dodjeljuje na osnovu istraživanja o bolesti.

red 5: za ostatak stanovništva (nevakcinisane osobe) dajte im postotak imuniteta. Ova vrijednost se dodjeljuje na osnovu istraživanja o bolesti.

red 6: u početku postavite sve ljude da nisu zaraženi.

red 7: za broj prvobitno zaraženih osoba, popunite prvih nekoliko kolona u skladu s tim.

Sada kada smo postavili sve parametre za simulaciju bolesti, randomizirat ćemo šansu da se osoba (i cijepljena i nevakcinisana) zarazi. To je učinjeno u sljedećem koraku dodjeljivanjem slučajnih vrijednosti između 0 i 1 svakoj osobi u trećem redu ovog 'infekcijeMat'.

Korak 4: Nasumično odaberite mogućnost vakcinisane i nevakcinisane osobe da se inficira

Zatim dodijelite svakoj osobi nasumičan broj, koji će se kasnije koristiti za utvrđivanje da li se osoba inficirala ili ne.

za w = 1: dužina (infekcijaMat)

infekcijaMat (3, w) = rand; kraj

Objašnjenje koda

Ova petlja for bavi se trećim redom 'infectionMat -a' kreiranom u posljednjem koraku. 'rand' dodjeljuje vrijednost između 0 i 1 svakom indeksu reda 3.

Output

infekcijaMat je sada gotova! To je bilo sa populacijom sa 100% cijepljenjem i 1 osobom koja je u početku bila zaražena.

infekcijaMat =

Kolone 1 do 12 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 1.0000 0 0 0 0 0 0 0 0 0 0 0.0869 0.5489 0.3177 0.9927 0.7236 0.5721 0.7172 0.9766 0.4270 0.9130 0.8973 0.700 0.0075 0.0075 0.0075 0,7500 0,7500 0 0 0 0 0 0 0 0 0,0480 0,3593 0,2958 0,6291 0,1362 0,3740 0,8648 0,2503

red 1: Procenat mogućnosti da NE dobijete bolest

red 2: Zaraženo ili nezaraženo (logička vrijednost)

red 3: Broj koji se koristi za provjeru zaraženosti osobe koja nije zaražena ako upozna zaraženu osobu. Ako nezaražena osoba sretne zaraženu osobu, taj broj je veći od broja u retku 1 (za istu kolonu), tada je zaražena. Ovu ćemo funkcionalnost kodirati u koraku 7.

Korak 5: Stvorite matrice ljudi koji nisu vakcinisani i zaraženi su od početnih informacija

Napravite 2 matrice pod nazivom "matrixUnvacc" i "matrixInfected" koje pohranjuju sve zaražene ljude od infekcijeMat. Ovo će se koristiti kako bismo mogli obojati grafikon onih koji su zaraženi, nevakcinisani ili vakcinisani, pomažući u vizualizaciji uticaja nevakcinisanih na vakcinisane pojedince.

obrišite svaku

matrixInfected = ; matricaUnvacc = ; za h = 1: dužina (infekcijaMat) ako je infekcijaMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; kraj kraj za osobu = 1: NUMOFPEOPLE ako je infekcijaMat (2, osoba) == 1 matrixInfected = [matrixInfected, person]; end end

Šifra Objašnjenje

Napravite dvije prazne matrice za pohranu broja nevakcinisanih i zaraženih osoba. Obje for petlje izvode se 20 puta i ako je if naredba zadovoljena, tada se broj dodaje ispravnoj matrici.

Output

matrixUnvacc =

matrixInfected =

[1]

Korak 6: Iscrtajte početni grafikon

Nacrt početnog grafikona
Nacrt početnog grafikona

Zatim ćemo iscrtati matricu susjednosti.

g = grafikon (adjMatrix);

figure (1) p = plot (g, 'NodeColor', 'b', 'MarkerSize', 7); highlight (p, matrixUnvacc, 'NodeColor', 'g') highlight (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Procenat ljudi koji nisu vakcinisani:', num2str (title_unvacc), '%']); pauza (brzina)

Objašnjenje koda

Teorija grafova u Matlabu ima ugrađene funkcije. Kada koristimo funkciju graph (), možemo prevesti 'adjMatrix' u stvarni neusmjereni graf. Zatim moramo stvoriti zaplet pomoću funkcije plot () da bismo zaista vidjeli kako izgleda. Ovaj plot () smo postavili na varijablu tako da možemo lakše manipulirati i mijenjati boje grafikona tokom simulacije. Svi ljudi (ili čvorovi) u početku su postavljeni na boju 'plava'. Zatim su svi nevakcinisani postavljeni na boju 'zelena'. Zaraženi ljudi tada se podešavaju na boju 'crvena'. Naslov se postavlja prema određenoj postotnoj vrijednosti nevakcinisanih osoba koje se testiraju. Funkcija pause () privremeno zaustavlja izvršavanje MatLaba. Prolazimo kroz promjenjivu brzinu koja se širi i koja se računa u sekundama.

Pogledajte sliku (gore) da vidite nasumični grafikon označen bojama.

Saznajte više o funkciji highlight () u MatLabu.

Korak 7: Simulirajte napredovanje infekcije

Zatim moramo saznati ko se zarazi nakon interakcija (zabilježeno u adjMatrix) i ažurirati grafikon kada se neko zarazi.

Koristite adjMatrix da odredite koji su ljudi zaraženi nakon njihove interakcije s ljudima u jednom danu.

za svaki red = 1: dužina (adjMatrix)

ako je infectionMat (2, svakiRow) == 1 za svakiCol = 1: dužina (adjMatrix) ako je adjMatrix (svakiRow, svakiCol) == 1 % svakiRow = osoba % eachCol = njen prijatelj % prijatelj svake osobe i provjerite je li zaražen. ako je infekcijaMat (3, svakiCol)> infekcijaMat (1, svakiCol) infekcijaMat (2, svakiCol) = 1; označi (p, eachCol, 'NodeColor', 'r') pauza (brzina) kraj kraj kraj kraj kraj

For petlja se petlja kroz svaku osobu. On provjerava da li je osoba zaražena, provjerit će svaku od osoba/prijatelja s kojima je komunicirao i provjeriti je li nivo imuniteta prijatelja bio veći od jačine bolesti. Ovdje dolazi u obzir 'infekcijaMat' koju smo ranije stvorili. Upoređuje se prvi i treći red svake kolone prijatelja, a ako je treći red veći, to znači da prijatelj nije imao dovoljno visok imunitet da izbjegne bolest i na kraju se inficira. Također mijenjamo boju koristeći highlight () u crvenu ako se zaraze.

Sada bi vaš kod za simulaciju trebao funkcionirati! i za bilo koju veličinu populacije, samo promijenite NUMOFPEOPLE!

Korak 8: Upotrijebite Monte Carlo teoriju

Da bismo napravili još jedan korak dalje i izvukli podatke iz našeg simulatora ('infekcijaSim.m'), htjeli smo izračunati i grafički prikazati trend u postotku nevakcinisanih osoba koje su se zarazile i postotku cijepljenih osoba koje su se zarazile. Pretpostavljamo da bi postotak vakcinisanih osoba koji su se zarazili trebao biti znatno manji od postotka nevakcinisanih ljudi koji su se zarazili.

Korak 9: Pretvorite datoteku ('infekcijaSim.m') sa simulacijom u funkciju

Da bismo pokrenuli Monte Carlo, htjeli bismo pokrenuti simulaciju više puta i prikupiti podatke kako bismo ih mogli koristiti za grafikoniranje postotaka ljudi koji su se zarazili.

Funkcija se može postaviti ovako:

izlaz funkcije = infekcijaSim (unvacc, vakcina, NUMOFPEOPLE, unvacc_perc, init_infect, brzina)

Komentirajte varijable u vašoj simulaciji jer ih sada prosljeđujete kroz glavnu datoteku (počet ćemo to pisati u koraku 12):

unvacc, vakcina, NUMOFPEOPLE, unvacc_perc, init_infect

Nova varijabla

brzina

bit će dodijeljen u glavnoj datoteci (Monte_Carlo.m).

Napomena: Ne zaboravite kraj na dnu datoteke funkcije da biste završili funkciju!

Korak 10: Izračunajte postotak nevakcinisanih i cijepljenih osoba koje su zaražene

Ovo izračunava postotak nevakcinisanih ljudi koji su se zarazili. Ovaj kôd se nalazi na dnu datoteke 'infectionSim.m'.

broj_unvacc = 0;

broj_infekcije_unvacc = 0; %izračunava postotak nevakcinisanih ljudi koji su se inficirali za x = 1: dužina (infekcijaMat) ako je infekcijaMat (1, x) == unvacc broj_unvacc = broj_unvacc+1; kraj ako je infekcijaMat (1, x) == unvacc & infekcijaMat (2, x) == 1 broj_infec_unvacc = broj_infec_unvacc +1; procenat završetka_invacc_and_infec_kraj = = broj_infec_unvacc / broj_unvacc)*100;

Objašnjenje koda

U for petlji će se ponavljati NUMOFPEOPLE puta. Svaki put kada broj u infekcijskom matu odgovara broju nevakcinisanih (tj. 0,95 == 0,95), tada će se broj nevakcinisanih ljudi povećati za 1. Svaki put kada broj u infektivnom matu odgovara nevakcinisanom broju i oni su zaraženi, broj zaraženih i nevakcinisanih povećava se za 1. Posljednji red dijeli broj zaraženih, nevakcinisanih ljudi na ukupan broj nevakcinisanih osoba. Zatim se iz toga računa postotak.

Izazov:

Pokušajte izračunati postotak cijepljenih osoba koje su se zarazile! (Savjet: vrlo je sličan ovom gornjem kodu, međutim neke varijable se mijenjaju i nazivi se prilagođavaju.)

Zatim se izračunava postotak zaraženih na temelju ukupne populacije:

pre_per_infect = cumsum (infekcijaMat (2,:));

per_infect = (pre_per_infect (1, NUMOFPEOPLE)/NUMOFPEOPLE)*100;

Objašnjenje koda

Kumulativna suma izračunava se pomoću drugog reda infekcijskog mat, koji pohranjuje 1s i 0s ovisno o tome je li osoba zaražena ili nije. Budući da funkcija cumsum () vraća matricu, uzimamo posljednju vrijednost u matrici ('pre_per_infect (1, NUMOFPEOPLE)'), koja bi trebala biti stvarni zbroj svih vrijednosti iz 'infectionMat (2,:)'. Dijeljenjem zbroja sa NUMOFPEOPLE i množenjem sa 100, dobivamo konačni postotak zaraženih u ukupnoj populaciji.

Korak 11: Kreirajte izlaznu varijablu u svojoj funkciji 'infekcijaSim.m'

output = [per_infect, percent_of_unvacc_and_infec, percent_of_vacc_and_infec];

Objašnjenje koda

Pohranite ove podatke u izlaz, koji će biti poslan natrag u glavni (Monte_Carlo.m) kada se funkcija pozove i završi s radom. Ti se podaci koriste za grafički prikaz postotka zaraženih onih koji su cijepljeni i nevakcinisani.

Vaša funkcija 'infekcijaSim.m' trebala bi biti učinjena sada! Međutim, neće se pokrenuti jer još uvijek moramo napisati glavno!

Korak 12: Kreirajte meni za preuzimanje početnih uslova simulacije od korisnika

Sjetite se kako smo rekli varijabla

brzina

bi se kreiralo i proslijedilo kroz glavnu funkciju? Moramo dobiti vrijednosti da bismo prešli u funkciju. Napomena, redoslijed vrijednosti pri pozivanju funkcije je bitan!

Počnite tako što ćete zamoliti korisnika da upiše neke odgovore u terminal.

> Izaberi bolest. Imajte na umu da su velika i mala slova >> Hripavac >> Gripa >> Ospice >> Odabrana bolest: Gripa >> Odaberite veličinu populacije. >> 20 >> 200 >> Odabrana populacija: 20 >> Odaberite brzinu simulacije. >> Brzo >> Sporo >> Odabrana brzina: Brzo

Ovaj kôd u nastavku pita korisnika koju bolest želi ispitati.

disp ('Odaberite bolest. Imajte na umu da je osjetljivo na slučaj')

fprintf ('Pertusis / n Gripa / nOspice / n') bolest = input ('Izabrana bolest:', 's'); ako je jednaka (bolest, 'Pertussis') vakcina = 0,85; %15 %šanse da dobijete bolest unvacc =.20; %80 %šanse da se dobije drugačija bolest ako je jednaka (bolest, 'gripa') vakcina = 0,75; %25 %šanse da dobijete bolest unvacc = 0,31; %69 %šanse da dobijete drugu bolest ako je jednaka (bolest, "ospice") vakcina =, 97; %3 posto šanse da dobijete bolest unvacc =.10; %90 %šanse da se bolest okonča

Objašnjenje koda:

Funkcija disp () ispisuje iskaz na ekranu, a ispisuje i različite opcije. Bolest će se prema tome dodijeliti. Ova verzija trenutno ne uzima u obzir nevažeći unos. Neispravan unos će proizvesti grešku i potpuno zaustaviti program. Svaka bolest ima povezane vrijednosti vakcine i unvacc. Ove vrijednosti NISU slučajne. Ove vrijednosti smo dobili iz istraživanja statistike o bolestima.

Zatim moramo pitati korisnika želi li testirati veliku ili malu populaciju na odabranu bolest.

disp ('Odaberite veličinu populacije.')

fprintf ('20 / n200 / n ') speed = input (' Izabrana populacija: ',' s '); ako je jednako (brzina, '20') populacija_size = 20; inače je jednaka (brzina, '200') veličina_populacije = 200; kraj

Objašnjenje koda

Ovo ispisuje izjavu korisniku i traži od korisnika da unese veličinu populacije koju želi testirati. Ova verzija trenutno ne uzima u obzir nevažeći unos. Neispravan unos će proizvesti grešku i potpuno zaustaviti program. 20 je odabrano jer je to mali uzorak koji još uvijek daje dobru predodžbu o tome kako se infekcija širi na malu populaciju. 200 ljudi je odabrano kao veća opcija jer 200 tačaka iscrtanih na grafikonu jedva da se preklapaju, tako da se sve moglo lako vidjeti i razlikovati jedno od drugog.

Zatim moramo pronaći brzinu simulacije.

disp ('Odaberite brzinu simulacije.')

fprintf ('Brzi / nSpori / n') brzina = ulaz ('Odabrana brzina:', 's'); if isequal (speed, 'Fast') sim_speed = 0; elseif isequal (speed, 'Slow') sim_speed = 0.25; kraj

Objašnjenje koda

Ovaj proces je bio isti kao dobijanje vrste bolesti i veličine populacije. Za brzo, neće biti pauze. a za sporo, bit će kašnjenje od 0,25 sekundi u for petlji prilikom izvođenja simulacije.

Odlično! Sada imamo sve unose od korisnika koji su nam potrebni! Prijeđimo na prikupljanje podataka za različite postotke necijepljenih osoba.

Korak 13: Odaberite % nevakcinisanih ljudi i izračunajte prosjek nevakcinisanih i zaraženih za odabrani postotak

Ovaj kod je za 0% nevakcinisanih osoba.

% ------- % 0 Nevakcinisano ------------

per_infect_av_0 = ; postotak_unvacc_and_infec_av_0 = ; za i = 1:20 out = infekcijaSim (unvacc, vakcina, veličina_populacije, 0, 1, sim_brzina); per_infect_av_0 = [per_infect_av_0, out (1, 1)]; procenat_unvacc_and_infec_av_0 = [procenat_unvacc_and_infec_av_0, out (1, 2)]; kraj prosječno_inficirano_0 = prosjek (po_infektu_v_0); prosječan_unvacc_i_infektiran_0 = prosjek (postotak_unvacc_i_infec_av_0);

Objašnjenje koda:

For petlja se izvodi 20 puta. Izlaz iz funkcije, infectionSim (), pohranjen je u van. Svaki put kada se for petlja pokrene, tada se postotak zaraženih u ukupnoj populaciji dodaje u matricu, 'per_infect_av_0'. Osim toga, postotak nevakcinisanih i zaraženih se također dodaje svaki put u matricu "postotak_unvacc_i_infec_av_0". U posljednja dva retka, ove dvije gore spomenute matrice se zatim usrednjavaju i pohranjuju u varijable. Ukratko, postoci se pohranjuju za svaku simulaciju, izračunavaju ih prosjek i grafički prikazuju. Monte Carlo se koristi za prikaz prosječne vrijednosti izvođenja simulacije i prikaza rezultata. Za naše eksperimentalne svrhe, odlučili smo pokrenuti simulaciju 20 puta i prosječiti te vrijednosti.

Izazov:

Ponovite za sve postotke koje želite testirati! To se može učiniti promjenom naziva varijabli prema postotnom broju. Testirali smo 0%, 5%, 10%, 20%, 30%i 50%.

Nagovještaj:

Jedina linija koja se mora promijeniti u stvarnom kodu je

out = infekcijaSim (unvacc, vakcina, veličina_populacije, 0, 1, sim_brzina);

Promijenite nulu na postotak u decimalnom obliku. Na primjer, za 5% nevakcinisane simulacije, 0 treba zamijeniti sa 0,5.

Korak 14: Grafikon: 'Trend infekcije kod nevakcinisanih vs. Vakcinisani protiv određene bolesti '

Ovo je kôd za izradu grafikona trenda infekcije kod nevakcinisanih osoba u odnosu na nevakcinisane osobe.

graph_mat_y = [average_infected_0, average_infected_5, average_infected_10, average_infected_20, average_infected_30, average_infected_50];

graph_mat_x = [0, 5, 10, 20, 30, 50]; nagib = (prosječno_zaraženo_5-prosječno_zaraženo_0)/5; linija_y = [prosječno_zaraženo_0, (nagib*50)+prosječno_zaraženo_0]; linija_x = [0, 50]; slika (2) grafikon (graph_mat_x, graph_mat_y); line (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); title (['Trend nevakcinacije za', bolest]); xlabel ('Postotak početne nevakcinisane'); ylabel ('Postotak posljednje zaražene')

Objašnjenje koda

red 1: dodijeljene vrijednosti y prosjecima procenata zaraženih

red 2: dodijeljene vrijednosti x postotku početnog postotka nevakcinisanih

linija 3: izračunajte nagib od 0% i 5%

red 4: spremi y vrijednosti linije. Ovo je nastavak odjeljka 0% do 5%.

red 5: spremi y vrijednosti linije. Ova linija se proteže dužinom grafikona.

red 6: kreirajte figuru

red 7: iscrtajte grafikon x i y vrijednosti procenta zaraženih, koji nisu vakcinisani.

linija 8: iscrtajte liniju. Ovo se koristi da pokaže da se ne povećava linearno, već eksponencijalno.

red 9: Postavite naslov grafikona.

red 10-11: Postavite oznake x i y za grafikon.

Sada biste trebali moći vidjeti da što je veći postotak stanovništva nevakcinisan, veće su količine infekcije. Takođe ćete vidjeti da su većina tačaka koje postaju crvene zelene tačke, što pokazuje da vakcina u određenoj mjeri pomaže! Nadam se da vam se dopao ovaj vodič. Komentirajte ako imate pitanja!

Korak 15: Finalni proizvod: Kako simulacija izgleda

Sav kod možete pronaći ovde

Preporučuje se: