Sadržaj:
- Korak 1: Stvorite Matricu susjedstva
- Korak 2: Stvorite odnose
- Korak 3: Dodajte statistiku bolesti
- Korak 4: Nasumično odaberite mogućnost da se cijepljena i necijepljena osoba zarazi
- Korak 5: Stvorite matrice ljudi koji nisu cijepljeni i zaraženi su od početnih informacija
- Korak 6: Nacrtajte početni grafikon
- Korak 7: Simulirajte napredovanje infekcije
- Korak 8: Upotrijebite Monte Carlo teoriju
- Korak 9: Pretvorite datoteku ('infekcijaSim.m') sa simulacijom u funkciju
- Korak 10: Izračunajte postotak necijepljenih i cijepljenih osoba koje su zaražene
- Korak 11: Izradite izlaznu varijablu u svojoj funkciji 'infekcijaSim.m'
- Korak 12: Izradite izbornik za preuzimanje početnih uvjeta simulacije od korisnika
- Korak 13: Odaberite % necijepljenih osoba i izračunajte prosjek necijepljenih i zaraženih za odabrani postotak
- Korak 14: Grafikon: 'Trend infekcije u necijepljenih vs. Cijepljen protiv određene bolesti '
- Korak 15: Završni proizvod: Kako simulacija izgleda
Video: Cjepiti se ili ne? projekt promatranja imuniteta stada kroz simulaciju bolesti: 15 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:37
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
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
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
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:
Softver za simulaciju LED kocke: 5 koraka
Softver za simulaciju LED kocke: Skoro sam završio s izgradnjom svoje LED kocke 8x8x8, a s njom je došao i ovaj softver za računalo! Pomaže vam u stvaranju animacija i simulira ih na 2D zaslonu prije nego što se učitaju na 3D. Nema podrške (još) za komunikaciju putem
Kontrola Kućanski aparati Kroz Alexa sa ESP8266 ili ESP32: 8 koraka
Upravljajte kućanskim aparatima putem Alexa s ESP8266 ili ESP32: Hej, što ima, dečki! Akarsh ovdje iz CETech -a. Ovaj moj projekt pomoći će vam da vam život postane lakšim i osjećat ćete se kao kralj nakon što kontrolirate kućanske aparate samo dajući naredbu Alexa. Glavna stvar iza ovog p
Prođite kroz RGB LED kroz spektar boja pomoću Raspberry Pi 2 i izgrebite: 11 koraka
Prođite kroz RGB LED kroz spektar boja pomoću Raspberry Pi 2 i grebanja: Bilješke o ažuriranju 25. veljače 2016 .: Poboljšao sam program Scratch i redizajnirao instrukcije. Bok dečki, s ovim projektom sam htio upotrijebiti Scratch za kretanje kroz RGB LED kroz spektar boja. Postoji mnogo projekata koji to rade s t
Kako koristiti Vivado simulaciju: 6 koraka
Kako koristiti Vivado simulaciju: Odradio sam ovaj simulacijski projekt za internetski tečaj. Projekt je napisao Verilog. Koristit ćemo simulaciju u Vivadu za vizualizaciju valnog oblika u enable_sr (omogućena znamenka) iz prethodno stvorenog projekta štoperice. Osim toga, mi ćemo
Plamenik s USB pogonom! Ovaj projekt može izgorjeti kroz plastiku / drvo / papir (zabavan projekt također mora biti vrlo fino drvo): 3 koraka
Plamenik s USB pogonom! Ovaj projekt može izgorjeti kroz plastiku / drvo / papir (zabavan projekt također mora biti vrlo fino drvo): NEMOJTE OVAJ KORISTITI USB!!! iz svih komentara saznao sam da to može oštetiti vaše računalo. moje računalo je dobro. Koristite punjač za telefon od 600m 5v. Koristio sam ovo i radi dobro i ništa se ne može oštetiti ako upotrijebite sigurnosni utikač za zaustavljanje napajanja