Sadržaj:

Cjepiti se ili ne? projekt promatranja imuniteta stada kroz simulaciju bolesti: 15 koraka
Cjepiti se ili ne? projekt promatranja imuniteta stada kroz simulaciju bolesti: 15 koraka

Video: Cjepiti se ili ne? projekt promatranja imuniteta stada kroz simulaciju bolesti: 15 koraka

Video: Cjepiti se ili ne? projekt promatranja imuniteta stada kroz simulaciju bolesti: 15 koraka
Video: Часть 1 — Аудиокнига «Скарамуш» Рафаэля Сабатини — Книга 1 (гл. 01–06) 2024, Studeni
Anonim
Cjepiti se ili ne? projekt promatranja imuniteta stada putem simulacije bolesti
Cjepiti se ili ne? projekt promatranja 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 zaraze u našim zajednicama. Naš program simulira kako bolest zaražava populaciju s različitim postocima cijepljenih i necijepljenih. Pokazuje imunitet stada pokazujući kako povećani broj cijepljene populacije može smanjiti broj oboljelih.

To modeliramo u Matlabu koristeći koncepte teorije grafova. Teorija grafova matematički je način prikaza 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 necijepljenosti kako bismo vidjeli stopu zaraze ljudi.

Sav kôd projekta povezan je na dnu!

PC kredit:

Matlab veza na teoriju grafova:

Korak 1: Stvorite Matricu susjedstva

Stvorite Matricu susjedstva
Stvorite Matricu susjedstva
Stvorite Matricu susjedstva
Stvorite Matricu susjedstva

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

Stvorit ćemo varijablu 'NUMOFPEOPLE'. Možete ga dodijeliti bilo kojoj cijeloj vrijednosti. To ć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 saznati više, evo vam poveznice za detaljnije čitanje o tome.

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

Stvorena je matrica susjednosti.

adjMatrix = nule (NUMOFPEOPLE);

To će stvoriti kvadratnu matricu od 0s. Svaki red u matrici je osoba. Svaki stupac u matrici je osoba ili prijatelj s kojim se osoba susreće tijekom dana.

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

** Od sada ć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 funkcionira matrica susjedstva.

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 biste vidjeli kako dodati rubove u matricu susjednosti, 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 tijekom dana.

To se može učiniti na mnogo načina. Jedan od načina za dovršenje ovog zadatka je prvo dodijeliti slučajni broj svakoj osobi kako bi se utvrdilo s koliko će osoba svaka osoba komunicirati u jednom danu.

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

To č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

pomozi randi

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

tempMatrix = ;

count = 0; allFriendsMatrix = ; za k = 1: NUMOFPEOPLE dok je duljina (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (count) = temp; kraj očisti svaki dok je duljina (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; kraj allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; count = 0; kraj

Detaljno objašnjenje koda:

Prvo stvaramo praznu privremenu matricu za pohranu prijatelja/popisa interakcija svake osobe. Također inicijaliziramo count, koji samo prati gdje staviti novu slučajnu vezu u tempMatrix. Petlje for pokreću se 20 puta, tako da se to dogodi svakoj pojedinačnoj osobi u populaciji. Prva petlja while traje sve dok tempMatrix svake osobe ne bude iste duljine nasumično dodijeljenog broja interakcija. U ovoj petlji generira se slučajni broj koji odgovara osobi u populaciji i stavlja u tempMatrix. Budući da su duljine svake tempMatrixes različite, morali smo stvoriti neke NaN vrijednosti kako bismo sve te tempMaticies mogli spojiti u jednu matricu ('allFriendsMatrix'). Druga while petlja rješava ovaj problem dodavanjem NaN u svaku tempMatrix. Dok je petlja bila postavljena za pokretanje 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. Zadnja tri retka koda (isključujući kraj) dodaje tempMatrix u sljedeći redak 'allFriendsMatrix'. Zatim briše tempMatrix i računa za sljedeću osobu.

Izlaz

Ovako bi izlaz trebao izgledati za prvu vožnju kroz for petlju (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 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 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 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 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

Objašnjenje koda

Ova dvostruka for petlja prolazi kroz svaki redak i stupac "allFriendsMatrix". Naredba if će se izvoditi za sve vrijednosti koje nisu 'NaN'. U osnovi će stvoriti rubove ili crte grafikona. Dakle, prvi redak 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. Moraju biti simetrični da bi mogao pravilno raditi u Matlabu.

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

Riješimo to sljedećim kodom:

za svaki = 1: NUMOFPEOPLE

adjMatrix (svaki, svaki) = 0; kraj

Objašnjenje koda

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 matrice s gornje lijeve na donju desnu stranu su sve 0.

Izlaz

Ovo je posljednji adjMatrix za ovu trenutnu simulaciju. Time su obuhvaćene 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

Na slici 2 možete vidjeti 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.

Izradite ove varijable:

unvacc %tip: double; postotna šansa da necijepljeni ljudi ne dobiju bolest

vakcina %tip: dvostruka; postotak šanse da cijepljene osobe ne dobiju bolest unvacc_perc %tip: dvostruko; postotak necijepljenih init_infect %tip: int; posto cijepljene populacije

Zatim moramo napraviti neke izračune.

Napravit ćemo 'infekcijski mat' koji je 3*NUMOFPEOPLE matrica.

vakc_perc = 1-unvacc_perc;

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

Objašnjenje koda

redak 1: Izračunato postotak necijepljenih

redak 2: stvorite matricu 3*N broja ljudi

redak 3: saznajte broj cijepljenih osoba iz postotka cijepljenih

redak 4: cijepljenim osobama dajte imunitet povezan s cijepljenjem. Ova vrijednost dodjeljuje se na temelju istraživanja o bolesti.

redak 5: ostatku stanovništva (necijepljene osobe) dajte im postotak imuniteta. Ova vrijednost dodjeljuje se na temelju istraživanja o bolesti.

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

redak 7: za broj prvobitno zaraženih osoba u skladu s tim ispunite prvih nekoliko stupaca.

Sada kada smo postavili sve parametre za simulaciju bolesti, randomizirat ćemo šanse hoće li se osoba (i cijepljena i necijepljena) zaraziti. To je učinjeno u sljedećem koraku dodjeljivanjem slučajnih vrijednosti između 0 i 1 svakoj osobi u trećem redu ovog 'infekcijskog mat'.

Korak 4: Nasumično odaberite mogućnost da se cijepljena i necijepljena osoba zarazi

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

za w = 1: duljina (infekcijaMat)

infekcijaMat (3, w) = rand; kraj

Objašnjenje koda

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

Izlaz

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

infekcijaMat =

Stupci 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,7575 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: Postotna vjerojatnost da NE dobijete bolest

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

red 3: Broj kojim se provjerava je li zaražena osoba koja nije zaražena ako upozna zaraženu osobu. Ako nezaražena osoba upozna zaraženu osobu, taj je broj veći od broja u retku 1 (za isti stupac), tada je zaražena. Ovu ćemo funkcionalnost kodirati u koraku 7.

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

Izradite 2 matrice pod nazivom "matrixUnvacc" i "matrixInfected" koje pohranjuju sve zaražene osobe iz infekcijeMat. To će se koristiti kako bismo mogli obojati grafikon onih koji su zaraženi, necijepljeni ili cijepljeni, pomažući u vizualizaciji utjecaja necijepljenih na cijepljene osobe.

očisti svaku

matrixInfected = ; matricaUnvacc = ; za h = 1: duljina (infekcijaMat) ako je infekcijaMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; kraj za osobu = 1: NUMOFPEOPLE ako je infekcijaMat (2, osoba) == 1 matrica zaražena = [matrica zaražena, osoba]; kraj kraj

Objašnjenje koda

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

Izlaz

matricaUnvacc =

matricaZaražena =

[1]

Korak 6: Nacrtajte početni grafikon

Nacrt početnog grafikona
Nacrt početnog grafikona

Zatim ćemo iscrtati matricu susjednosti.

g = grafikon (adjMatrix);

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

Objašnjenje koda

Teorija grafova u Matlabu ima ugrađene funkcije. Kad koristimo funkciju graph (), u mogućnosti smo prevesti 'adjMatrix' u stvarni neusmjereni graf. Zatim moramo stvoriti ploču pomoću funkcije plot () da bismo zapravo vidjeli kako izgleda. Ovaj plot () smo postavili na varijablu tako da možemo lakše manipulirati i mijenjati boje grafikona tijekom simulacije. Svi ljudi (ili čvorovi) u početku su postavljeni na boju 'plava'. Zatim su svi necijepljeni postavljeni na boju 'zelena'. Zaraženi ljudi tada se postavljaju u boju 'crvena'. Naslov se postavlja prema određenoj postotnoj vrijednosti necijepljenih osoba koje se testiraju. Funkcija pause () privremeno zaustavlja izvršavanje MatLaba. Prolazimo kroz promjenjivu brzinu koja se širi i izračunava se 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 otkriti tko se zarazi nakon interakcija (zabilježeno u adjMatrix) i ažurirati grafikon kada se netko zarazi.

Koristite adjMatrix za utvrđivanje koji su ljudi zaraženi nakon njihove interakcije s ljudima u jednom danu.

za svaki red = 1: duljina (adjMatrix)

if infectionMat (2, eachRow) == 1 za svakiCol = 1: duljina (adjMatrix) ako je adjMatrix (svakiRow, svakiCol) == 1 % svakiRow = osoba % eachCol = njezin prijatelj % prijatelj svake osobe i provjerite je li zaražen. ako je infekcijaMat (3, svakiCol)> infekcijaMat (1, svakiCol) infekcijaMat (2, svakiCol) = 1; highlight (p, eachCol, 'NodeColor', 'r') pauza (brzina) kraj kraj kraj kraj kraj

For petlja prolazi kroz svaku osobu. Provjerava da li je osoba zaražena, provjerit će svaku od osoba/prijatelja s kojima su stupili u kontakt i provjeriti je li prijateljeva razina imuniteta veća od jačine bolesti. Ovdje dolazi u obzir 'infekcijaMat' koju smo ranije stvorili. Uspoređuje se prvi i treći redak svakog stupca prijatelja, a ako je treći red veći, to znači da prijatelj nije imao dovoljno visok imunitet da izbjegne bolest te se na kraju inficirao. Također se mijenjamo u boju pomoću 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

Kako 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 necijepljenih osoba koje su se zarazile i postotku cijepljenih osoba koje su se zarazile. Pretpostavljamo da bi postotak cijepljenih osoba koji su se zarazili trebao biti puno manji od postotka necijepljenih osoba koje su se zarazile.

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 to mogli upotrijebiti za grafiranje 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 budući da ih sada prosljeđujete kroz glavnu datoteku (počet ćemo to pisati u koraku 12):

unvacc, vakcina, NUMOFPEOPLE, unvacc_perc, init_infect

Nova varijabla

ubrzati

bit će dodijeljen u glavnu datoteku (Monte_Carlo.m).

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

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

Time se izračunava postotak necijepljenih osoba koje su se zarazile. Ovaj kôd nalazi se na dnu datoteke 'infectionSim.m'.

broj_unvacc = 0;

broj_infekcije_unvacc = 0; %izračunava postotak necijepljenih osoba koje su se inficirale za x = 1: duljina (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_infek_unvacc +1; postotak završetaka_invacc_and_infec = (broj_infec_unvacc / broj_unvacc)*100;

Objašnjenje koda

U for petlji petljat će se NUMOFPEOPLE puta. Svaki put kada broj u infekcijskom matu odgovara necijepljenom broju (tj. 0,95 == 0,95), tada će se broj necijepljenih osoba povećati za 1. Svaki put kada broj u infekcijskom matu odgovara necijepljenom broju i oni su zaraženi, broj zaraženih i necijepljenih povećava se za 1. Posljednji redak dijeli broj zaraženih, necijepljenih osoba s ukupnim brojem necijepljenih 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 se varijable 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

Kumulativni zbroj izračunava se pomoću drugog retka 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)'), što bi trebao biti stvarni zbroj svih vrijednosti iz 'infectionMat (2,:)'. Dijeljenjem zbroja s NUMOFPEOPLE i množenjem sa 100, dobivamo konačni postotak zaraženih u ukupnoj populaciji.

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

izlaz = [per_infekt, postotak_unvacc_i_infec, postotak_vacc_i_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 postotaka zaraženih onih cijepljenih i necijepljenih.

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

Korak 12: Izradite izbornik za preuzimanje početnih uvjeta simulacije od korisnika

Sjetite se kako smo rekli varijabla

ubrzati

bi se stvorio i prošao kroz glavnu funkciju? Moramo dobiti vrijednosti za prosljeđivanje funkciji. Napomena, redoslijed vrijednosti pri pozivanju funkcije je bitan!

Započnite tako da zamolite korisnika da upiše neke odgovore u terminal.

> Odaberite bolest. Imajte na umu da se razlikuju 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 ('Odabrana bolest:', 's'); ako je jednaka (bolest, 'Pertussis') vakcina = 0,85; %15 posto šanse da dobijete bolest unvacc =.20; %80 %šanse za dobivanje bolesti inače ako je jednaka (bolest, 'gripa') vakcina = 0,75; %25 posto šanse za dobivanje bolesti unvacc = 0,31; %69 posto šanse da se razboli inače ako je jednaka (bolest, 'ospice') vakcina =, 97; %3 posto šanse za dobivanje bolesti unvacc = 0,10; 90 %šanse da prestane bolest

Objašnjenje koda:

Funkcija disp () ispisuje izjavu na zaslon, 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 pogrešku i potpuno zaustaviti program. Svaka bolest ima povezane vrijednosti vakcine i unvacc. Ove vrijednosti NISU slučajne. Te smo vrijednosti dobili iz istraživanja statistike o bolestima.

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

disp ('Odaberite veličinu populacije.')

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

Objašnjenje koda

Time se ispisuje izjava korisniku i traži se 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 pogreš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 odabrano je kao veća opcija jer 200 toč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 ('Fast / nSlow / n') speed = input ('Odabrana brzina:', 's'); if isequal (speed, 'Fast') sim_speed = 0; elseif isequal (brzina, 'sporo') sim_speed = 0,25; kraj

Objašnjenje koda

Taj je proces bio isti kao dobivanje 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 tijekom izvođenja simulacije.

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

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

Ovaj kod je za 0% necijepljenih osoba.

% ------- % 0 necijepljeno ------------

per_infect_av_0 = ; postotak_unvacc_and_infec_av_0 = ; za i = 1:20 out = infekcijaSim (unvacc, vakcina, veličina_populacije, 0, 1, brzina_srm); per_infect_av_0 = [per_infect_av_0, out (1, 1)]; postotak_unvacc_and_infec_av_0 = [postotak_unvacc_and_infec_av_0, out (1, 2)]; prosječni_zaraženi_0 na kraju = srednja vrijednost (na_infekt_av_0); prosječno_unvacc_i_inficirano_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 pokrene for petlja, tada se postotak zaraženih u ukupnoj populaciji dodaje matrici, 'per_infect_av_0'. Osim toga, postotak necijepljenih i zaraženih također se dodaje svaki put u matricu "postotak_unvacc_i_infec_av_0". U posljednja dva retka ove dvije gore spomenute matrice se zatim prosječe i pohranjuju u varijable. Ukratko, postoci se pohranjuju za svaku simulaciju, izračunavaju ih prosječno i grafički. 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 postotnim brojevima. Testirali smo 0%, 5%, 10%, 20%, 30%i 50%.

Savjet:

Jedini redak koji se mora promijeniti u stvarnom kodu je

out = infekcijaSim (unvacc, vakcina, veličina_pulacije, 0, 1, brzina_srm);

Promijenite nulu na postotak u decimalnom obliku. Na primjer, za 5% necijepljenu simulaciju, 0 treba zamijeniti s 0,5.

Korak 14: Grafikon: 'Trend infekcije u necijepljenih vs. Cijepljen protiv određene bolesti '

Ovo je kôd za izradu grafikona trenda infekcije u necijepljenih osoba u odnosu na necijepljene osobe.

graph_mat_y = [prosječno_zaraženo_0, prosječno_zaraženo_5, prosječno_zaraženo_10, prosječno_zaraženo_20, prosječno_zaraženo_30, prosječno_zaraženo_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]; figure (2) grafikon (graph_mat_x, graph_mat_y); line (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); title (['Trend necijepljenja za', bolest]); xlabel ('Postotak početno necijepljenih'); ylabel ('Postotak posljednje zaražene')

Objašnjenje koda

redak 1: dodijeljene vrijednosti y prosjecima postotka zaraženih

redak 2: dodijeljene vrijednosti x postotku početnog postotka necijepljenih

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

redak 4: pohraniti y vrijednosti retka. Ovo je nastavak odjeljka 0% do 5%.

redak 5: pohranite y vrijednosti retka. Ova linija obuhvaća duljinu grafikona.

redak 6: stvorite lik

redak 7: iscrtajte grafikon x i y vrijednosti postotka zaraženih, koji nisu cijepljeni.

linija 8: iscrtajte liniju. Time se pokazuje da se ne povećava linearno, već eksponencijalno.

redak 9: Postavite naslov grafikona.

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

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

Korak 15: Završni proizvod: Kako simulacija izgleda

Sav kôd možete pronaći ovdje

Preporučeni: