Kazalo:
- 1. korak: Ustvarite matriko sosedstva
- 2. korak: Ustvarite odnose
- 3. korak: Dodajte statistiko bolezni
- 4. korak: Naključno izberite možnost okužbe cepljene in necepljene osebe
- 5. korak: Ustvarite matrice ljudi, ki niso cepljeni in so okuženi iz prvih informacij
- Korak 6: Narišite začetni graf
- 7. korak: Simulirajte napredovanje okužbe
- 8. korak: Uporabite teorijo Monte Carlo
- 9. korak: Naj bo datoteka ('infekcijaSim.m') s simulacijo v funkciji
- 10. korak: Izračunajte odstotek necepljenih in cepljenih ljudi, ki so bili okuženi
- 11. korak: Ustvarite izhodno spremenljivko v svoji funkciji 'infekcijaSim.m'
- 12. korak: Ustvarite meni za pridobitev začetnih pogojev simulacije od uporabnika
- Korak: Izberite % necepljenih ljudi in izračunajte povprečje necepljenih in okuženih za izbrani odstotek
- Korak 14: Graf: 'Trend okužbe pri necepljenih vs. Cepljen proti določeni bolezni '
- 15. korak: Končni izdelek: Kako izgleda simulacija
Video: Se cepiti ali ne? projekt o opazovanju imunitete črede s simulacijo bolezni: 15 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:07
Pregled projekta:
Naš projekt raziskuje imuniteto črede in upa, da bo spodbudil ljudi k cepljenju, da bi zmanjšali stopnjo okužbe v naših skupnostih. Naš program simulira, kako bolezen okuži populacijo z različnimi odstotki cepljenih in necepljenih. Odkazuje imuniteto črede tako, da prikazuje, kako lahko povečano število cepljene populacije zmanjša število prizadetih ljudi.
To modeliramo v Matlabu z uporabo konceptov teorije grafov. Teorija grafov je matematični način predstavitve razmerij med predmeti. V teoriji grafov imajo grafi točke (ali vozlišča), povezana z robovi (ali črtami). V našem projektu so vozlišča zadevni posamezniki, robovi pa so njihove povezave. Na primer, če sta dve vozlišči povezani z robom, to pomeni, da sta "prijatelja" ali imata med seboj kakšno obliko stika. Ta stik je način širjenja bolezni. Zato smo za modeliranje našega koncepta uporabili teorijo grafov, ker smo želeli videti, kako se bolezen širi med posamezniki, ki so povezani v populaciji.
Naš projekt vključuje tudi metodo Monte Carlo. Metoda Monte Carlo so algoritmi, ki ustvarjajo ponavljajoče se naključno vzorčenje za prejemanje numeričnih rezultatov. V našem projektu to metodo uporabljamo za izvedbo naše simulacije, ki večkrat spreminja odstotek začetne necepljenosti, da vidimo stopnjo okužbe ljudi.
Vsa koda projekta je povezana na dnu!
PC kredit:
Matlabova povezava do teorije grafov:
1. korak: Ustvarite matriko sosedstva
Ustvarite nov skript. Našim bomo rekli "infekcijaSim.m".
Ustvarili bomo spremenljivko 'NUMOFPEOPLE'. Lahko ga dodelite kateri koli celobrojni vrednosti. To bo predstavljalo število ljudi v vaši populaciji.
Od zdaj naprej bomo to domnevali
NUMOFPEOPLE = 20;
Najprej začnite z uporabo Matlabovih funkcij teorije grafov za neusmerjen graf.
Če vas zanima več, je tukaj povezava, da o tem podrobneje preberete.
www.mathworks.com/help/matlab/math/directed-and-undirected-graphs.html
Ustvaril je matriko sosedstva.
adjMatrix = ničle (NUMOFPEOPLE);
To bo ustvarilo kvadratno matriko 0s. Vsaka vrstica v matrici je oseba. Vsak stolpec v matrici je oseba ali prijatelj, s katerim se oseba srečuje ves dan.
Oglejte si sliko 100 (zgoraj), da si lažje predstavljate, kako izgleda adjMatrix za 20 ljudi.
** Od tega trenutka dalje bomo domnevali, da je NUMOFPEOPLE 20. **
Lahko poskusite narisati to matriko sosednosti. Tukaj je nekaj več informacij o risanju tovrstnih matrik.
Opomba: Kako deluje matrika sosednosti.
Npr:
%izdelave sosednje 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] %risanje g = graf (a); %z uporabo funkcije grafa (teorija grafov) slika (1); h = ploskev (g);
Glejte sliko 1 (zgoraj), če želite videti, kako dodate robove v matriko sosednosti, s kodo v opombi.
2. korak: Ustvarite odnose
Zdaj, ko so ljudje (oglišča ali vozlišča) ustvarjeni, moramo ustvariti mrežo razmerij (črte ali robovi grafa). To bo simuliralo, kako ljudje komunicirajo in spoznavajo druge ljudi ves dan.
To je mogoče storiti na več načinov. Eden od načinov za dokončanje te naloge je, da vsaki osebi najprej dodelimo naključno število, da ugotovimo, s koliko ljudi bo posamezna oseba komunicirala v enem dnevu.
numOfFriendsMatrix = randi ([najmanjFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);
Tako dobimo matriko 1 do 20 naključnih celih števil, ki predstavljajo število interakcij, ki jih ima vsaka oseba na dan. Stolpci te matrice bi bili številka, ki ustreza vsaki osebi. Če na primer dodelimo najmanjFriendsPersonCanHave = 2 in mostFriendsPersonCanHave = 5, bi dobili naključne vrednosti med 2 in 5.
Imate težave z randi ()? V terminal vnesite
pomagaj randi
Nato naredimo naključno matriko (imenovano "allFriendsmatrix") o tem, kako je vsaka oseba v populaciji povezana/sodeluje v populaciji.
tempMatrix = ;
count = 0; allFriendsMatrix = ; for k = 1: NUMOFPEOPLE while length (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (štetje) = temp; end clear every while length (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; konec allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; count = 0; konec
Poglobljena razlaga kode:
Najprej ustvarimo prazno začasno matriko za shranjevanje seznama prijateljev/interakcij vsake osebe. Inicializiramo tudi count, ki samo spremlja, kam vstaviti novo naključno povezavo v tempMatrix. Zank for se izvaja 20 -krat, tako da se to zgodi za vsako posamezno osebo v populaciji. Prva zanka while teče, dokler tempMatrix vsake osebe ni enak dolžini naključno dodeljenega števila interakcij. V tej zanki se ustvari naključno število, ki ustreza osebi v populaciji in se postavi v tempMatrix. Ker so dolžine vsake tempMatrix različne, smo morali ustvariti nekaj vrednosti NaN, da lahko vse te tempMaticies združimo v eno matriko ('allFriendsMatrix'). Druga zanka while rešuje to težavo z dodajanjem NaN v vsako tempMatrix. Zanka while je bila nastavljena na 9 -kratni zagon, ker je število večje od 5, kar je bila zgornja meja prijateljev, ki jih lahko dodelimo osebi. Vrednost '9' je spremenljiva in se jo lahko/mora spremeniti, ko je 'mostFriendsPersonCanHave' večje od 9. Zadnje tri vrstice kode (brez konca) dodajo tempMatrix v naslednjo vrstico 'allFriendsMatrix'. Nato počisti tempMatrix in šteje za naslednjo osebo.
Izhod
Tako naj bi izgledal izhod za prvi zagon skozi zanko for (pred zadnjimi tremi vrsticami).
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 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 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 16 7 13 10 1 NaN NaN NaN NaN NaN
Nato dodajte ta razmerja v adjMatrix.
za vsako vrstico = 1: NUMOFPEOPLE
for eachCol = 1: 9 if isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; konec konec konec
Koda Pojasnilo
Ta dvojna zanka for gre skozi vsako vrstico in stolpec 'allFriendsMatrix'. Stavek if se bo izvajal za vse vrednosti, ki niso "NaN". V bistvu bo ustvaril robove ali črte grafa. Prva vrstica bo torej oseba 1 do osebe 16 in oseba 16 osebi 1. Ker ni usmerjena, je treba 1 spremeniti za oba! Ne moremo imeti samo roba 1 do 16 in ne 16 do 1. Biti morajo simetrični, da lahko pravilno deluje v Matlabu.
V simulaciji smo ugotovili, da ljudje ne morejo komunicirati sami s seboj. Ko smo vrednosti randomizirali, obstaja možnost, da ima sosednja matrika te napake.
Odpravimo to z naslednjo kodo:
za vsakega = 1: NUMOFPEOPLE
adjMatrix (vsak, vsak) = 0; konec
Koda Pojasnilo
Ta zanka for zagotavlja, da oseba 1 ni povezana z osebo 1, oseba 2 ni povezana z osebo 2 itd., Tako da je vse skupaj 0. Kot lahko vidite spodaj v odseku izhoda, imamo diagonalo kvadrata matrika od zgoraj levo navzdol desno so vse 0.
Izhod
To je zadnji adjMatrix za to trenutno simulacijo. To upošteva vse vrstice v grafu (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 sliki 2 si lahko ogledate graf 'adjMatrix'.
3. korak: Dodajte statistiko bolezni
Zdaj, ko lahko vaš program ustvari graf z naborom naključnih ljudi in ustvari naključne odnose, moramo vnesti podatke ali statistiko bolezni, da vidimo, kako lahko te interakcije v populaciji povečajo ali zmanjšajo okužbo.
Ustvarite te spremenljivke:
unvacc %tip: dvojno; odstotek možnosti, da necepljeni ljudje ne zbolijo
vrsta vakcine %: dvojna; odstotek možnosti, da cepljene osebe ne zbolijo za unvacc_perc %tip: dvojno; odstotek necepljenih prebivalcev init_infect %tip: int; odstotek cepljenega prebivalstva
Nato moramo narediti nekaj izračunov.
Naredili bomo "infekcijsko mat", ki je 3*matrika NUMOFPEOPLE.
vakc_perc = 1-unvacc_perc;
infekcijaMat = nan (3, NUMOFPEOPLE); število = okroglo (cc_perc * NUMOFPEOPLE); infekcijaMat (1, 1: število) = cepivo; infekcijaMat (1, število+1: konec) = unvacc; infekcijaMat (2, 1: konec) = 0; infectionMat (2, 1: init_infect) = 1;
Koda Pojasnilo
vrstica 1: Izračunan odstotek necepljenega prebivalstva
vrstica 2: ustvarite matriko 3*N števila ljudi
vrstica 3: ugotovite število cepljenih ljudi iz odstotka cepljenih
vrstica 4: cepljenim ljudem dajte imuniteto, povezano s cepljenjem. Ta vrednost je dodeljena na podlagi raziskav o bolezni.
vrstica 5: za preostalo populacijo (necepljene osebe) jim dajte odstotek imunitete. Ta vrednost je dodeljena na podlagi raziskav o bolezni.
vrstica 6: sprva nastavite vse ljudi na neokužene.
vrstica 7: za število prvotno okuženih ljudi ustrezno vnesite prvih nekaj stolpcev.
Zdaj, ko smo določili vse parametre za simulacijo bolezni, bomo naključno izbrali možnost, da se oseba (tako cepljena kot necepljena) okuži. To se naredi v naslednjem koraku z dodelitvijo naključnih vrednosti med 0 in 1 vsaki osebi v tretji vrstici tega "infectionMat".
4. korak: Naključno izberite možnost okužbe cepljene in necepljene osebe
Nato vsaki osebi dodelite naključno število, ki bo kasneje uporabljeno za ugotavljanje, ali se oseba okuži ali ne.
za w = 1: dolžina (infekcijaMat)
infekcijaMat (3, w) = rand; konec
Razlaga kode
Ta zanka for obravnava tretjo vrstico 'infectionMat', ustvarjeno v zadnjem koraku. 'rand' vsakemu indeksu 3. vrstice dodeli vrednost med 0 in 1.
Izhod
infectionMat je zdaj končan! To je bilo pri populaciji s 100% cepljenjem in 1 prvotno okuženo osebo.
infekcijaMat =
Stolpci od 1 do 12 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
vrstica 1: Odstotek možnosti, da NE zbolite
vrstica 2: Okuženo ali neokuženo (logična vrednost)
vrstica 3: Številka, s katero se preveri, ali se okužena oseba, ki ni okužena, sreča z okuženo osebo. Če neokužena oseba sreča okuženo osebo, je to število večje od števila v prvi vrstici (za isti stolpec), potem je okužena. To funkcijo bomo kodirali v koraku 7.
5. korak: Ustvarite matrice ljudi, ki niso cepljeni in so okuženi iz prvih informacij
Ustvarite dve matrici, imenovani "matrixUnvacc" in "matrixInfected", ki shranjuje vse okužene ljudi iz infectionMat. To bomo uporabili za barvno kodiranje grafa okuženih, necepljenih ali cepljenih, kar bo pomagalo vizualizirati vpliv necepljenih na cepljene posameznike.
počisti vsakega
matrixInfected = ; matricaUnvacc = ; za h = 1: dolžina (infekcijaMat), če je infekcijaMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; konec za osebo = 1: NUMOFPEOPLE, če je infekcijaMat (2, oseba) == 1 matrixInfected = [matrixInfected, person]; konec konec
Koda Pojasnilo
Ustvarite dve prazni matrici za shranjevanje številk necepljenih in okuženih ljudi. Obe zanki se izvajata 20 -krat in če je stavek if izpolnjen, se številka doda pravilni matrici.
Izhod
matricaUnvacc =
matrixInfected =
[1]
Korak 6: Narišite začetni graf
Nato bomo narisali matriko sosednosti.
g = graf (adjMatrix);
slika (1) p = ploskev (g, 'NodeColor', 'b', 'MarkerSize', 7); highlight (p, matrixUnvacc, 'NodeColor', 'g') highlight (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Odstotek necepljenih ljudi:', num2str (title_unvacc), '%']); premor (hitrost)
Razlaga kode
Teorija grafov v Matlabu ima vgrajene funkcije. Ko uporabimo funkcijo graph (), lahko 'adjMatrix' prevedemo v dejanski neusmerjen graf. Nato moramo s funkcijo plot () ustvariti ploskev, da dejansko vidimo, kako izgleda. To ploskev () nastavimo na spremenljivko, da lahko lažje manipuliramo in spreminjamo barve ploskve v celotni simulaciji. Vsi ljudje (ali vozlišča) so sprva nastavljeni na barvo 'modra'. Nato so vsi necepljeni ljudje nastavljeni na zeleno barvo. Okuženi se nato nastavi na rdečo barvo. Naslov je določen glede na določeno odstotno vrednost necepljenih ljudi, ki se testirajo. Funkcija pause () začasno ustavi izvajanje MatLaba. Gremo skozi spremenljivo spremenljivo hitrost, ki se izračuna v sekundah.
Oglejte si sliko (zgoraj) za ogled naključno barvno označenega grafa.
Več o funkciji highlight () v MatLabu.
7. korak: Simulirajte napredovanje okužbe
Nato moramo ugotoviti, kdo se okuži po interakcijah (zapisano v adjMatrix) in posodobiti graf, ko se nekdo okuži.
Uporabite adjMatrix, da ugotovite, kateri ljudje so okuženi po interakciji z ljudmi v enem dnevu.
za vsakRow = 1: dolžina (adjMatrix)
če je infectionMat (2, eachRow) == 1 za eachCol = 1: dolžina (adjMatrix), če je adjMatrix (eachRow, eachCol) == 1 % eachRow = oseba % eachCol = njen prijatelj % prijatelj vsake osebe in poglej, če je okužen. če je infekcijaMat (3, vsakCol)> okužbaMat (1, vsakCol) infekcijaMat (2, vsakCol) = 1; highlight (p, eachCol, 'NodeColor', 'r') premor (hitrost) konec konec konec konec konec
Zanka for se vrti skozi vsako osebo. Preveri, če je oseba okužena, preveri vsako osebo/prijatelja, s katerim so sodelovali, in preveri, ali je bila prijateljeva imunost višja od jakosti bolezni. Tu nastopi "infectionMat", ki smo ga ustvarili prej. Primerjata se 1. in 3. vrstica vsakega stolpca prijatelja in če je 3. vrstica večja, to pomeni, da prijatelj ni imel dovolj visoke imunosti, da bi se izognil bolezni in se na koncu okuži. Prav tako spremenimo barvo z uporabo highlight () v rdečo, če se okužijo.
Zdaj bi morala vaša koda za simulacijo delovati! in za katero koli velikost prebivalstva samo spremenite NUMOFPEOPLE!
8. korak: Uporabite teorijo Monte Carlo
Če želimo narediti še en korak dlje in iz našega podatkovnega simulatorja ('infekcijaSim.m') izvleči podatke, smo želeli izračunati in grafično prikazati trend v odstotkih necepljenih ljudi, ki so se okužili, in v odstotku cepljenih, ki so se okužili. Predvidevamo, da bi moral biti odstotek cepljenih, ki so se okužili, precej nižji kot odstotek necepljenih ljudi, ki so se okužili.
9. korak: Naj bo datoteka ('infekcijaSim.m') s simulacijo v funkciji
Za zagon Monte Carla bi želeli simulacijo izvesti večkrat in zbrati podatke, tako da jih lahko uporabimo za grafiranje odstotkov ljudi, ki so se okužili.
Funkcijo je mogoče nastaviti tako:
izhod funkcije = infekcijaSim (unvacc, vakcina, NUMOFPEOPLE, unvacc_perc, init_infect, hitrost)
Komentirajte spremenljivke v vaši simulaciji, saj jih zdaj posredujete skozi glavno datoteko (to bomo začeli pisati v 12. koraku):
unvacc, vakcina, NUMOFPEOPLE, unvacc_perc, init_infect
Nova spremenljivka
hitrost
bo dodeljen v glavni datoteki (Monte_Carlo.m).
Opomba: Ne pozabite na konec funkcije datoteke, da končate funkcijo!
10. korak: Izračunajte odstotek necepljenih in cepljenih ljudi, ki so bili okuženi
Tako se izračuna odstotek necepljenih ljudi, ki so se okužili. Ta koda je na dnu datoteke 'infectionSim.m'.
število_unvacc = 0;
število_infec_unvacc = 0; %izračuna odstotek necepljenih ljudi, ki so se okužili za x = 1: dolžina (infekcijaMat), če je okužbaMat (1, x) == unvacc number_of_unvacc = number_of_unvacc+1; konec, če infekcijaMat (1, x) == unvacc & infekcijaMat (2, x) == 1 število_infec_unvacc = število_infec_unvacc +1; odstotek konca_unvacc_and_infec konca = (število_infec_unvacc / število_unvacc)*100;
Razlaga kode
V zanki for se bo zankalo več kot NUMOFPEOPLE krat. Vsakič, ko število v okužbi Mat ustreza številu nevakcinisanega (tj. 0,95 == 0,95), se bo število necepljenih ljudi povečalo za 1. Vsakič, ko število v okužbi Mat ustreza številu nevakcinisanih in so okuženi, število okuženih in necepljenih se poveča za 1. Zadnja vrstica deli število okuženih, necepljenih ljudi na skupno število necepljenih ljudi. Od tega se nato izračuna odstotek.
Izziv:
Poskusite izračunati odstotek cepljenih ljudi, ki so se okužili! (Namig: zelo je podoben tej zgornji kodi, vendar se nekatere spremenljivke spremenijo in imena se prilagodijo.)
Nato se izračuna odstotek okuženih na podlagi celotne populacije:
pre_per_infect = cumsum (infekcijaMat (2,:));
per_infect = (pre_per_infect (1, NUMOFPEOPLE)/NUMOFPEOPLE)*100;
Razlaga kode
Kumulativna vsota se izračuna z uporabo druge vrstice infekcijskega mat, ki shrani 1s in 0s, odvisno od tega, ali je oseba okužena ali ne. Ker funkcija cumsum () vrne matriko, vzamemo zadnjo vrednost v matriki ('pre_per_infect (1, NUMOFPEOPLE)'), ki bi morala biti dejanska vsota vseh vrednosti iz 'infectionMat (2,:)'. Z deljenjem vsote na NUMOFPEOPLE in pomnožitvijo s 100 dobimo končni odstotek okuženih v celotni populaciji.
11. korak: Ustvarite izhodno spremenljivko v svoji funkciji 'infekcijaSim.m'
output = [per_infect, percent_of_unvacc_and_infec, percent_of_vacc_and_infec];
Razlaga kode
Shranite te podatke v izhod, ki bodo poslani nazaj v glavni (Monte_Carlo.m), ko je funkcija poklicana in končana. Ti podatki se uporabljajo za prikaz točk odstotka okuženih tistih, ki so bili cepljeni in necepljeni.
Svojo funkcijo "infectionSim.m" morate narediti zdaj! Vendar se ne bo izvajal, ker moramo še vedno napisati glavno!
12. korak: Ustvarite meni za pridobitev začetnih pogojev simulacije od uporabnika
Spomnite se, kako smo rekli spremenljivko
hitrost
bi bilo ustvarjeno in posredovano skozi glavno funkcijo? Za prehod v funkcijo moramo pridobiti vrednosti. Upoštevajte, da je vrstni red vrednosti pri klicu funkcije pomemben!
Začnite tako, da prosite uporabnika, naj v terminal vnese nekaj odgovorov.
> Izberite bolezen. Upoštevajte, da so velike črke >> oslovski kašelj >> gripa >> ošpice >> Izbrana bolezen: gripa >> Izberite velikost populacije. >> 20 >> 200 >> Izbrana populacija: 20 >> Izberite hitrost simulacije. >> Hitro >> Počasno >> Izbrana hitrost: Hitro
Ta koda spodaj vpraša uporabnika, katero bolezen želi raziskati.
disp ('Izberite bolezen. Upoštevajte, da je občutljiva na primer')
fprintf ('Oslovski kamen / n gripa / n ošpice / n') bolezen = input ('Izbrana bolezen:', 's'); če je enaka (bolezen, "oslovski kašelj") cepivo = 0,85; %15 -odstotna verjetnost, da zboli za unvacc = 0,20; %80 -odstotna verjetnost za nastanek bolezni, če je enako (cepivo proti gripi) cepljenje = 0,75; %25 -odstotna verjetnost, da bo bolezen odšteta = 0,31; %69 -odstotna verjetnost za nastanek bolezni, če je enako (cepivo proti ošpicam) enako = 0,97; %3 -odstotna verjetnost, da zboli za unvacc = 0,10; 90 %verjetnost, da bo bolezen prenehala
Razlaga kode:
Funkcija disp () natisne izjavo na zaslon in natisne tudi različne možnosti. Bolezen bo ustrezno dodeljena. Ta različica trenutno ne upošteva neveljavnega vnosa. Neveljaven vnos bo povzročil napako in popolnoma ustavil program. Vsaka bolezen ima s seboj povezane vrednosti cepljenja in unvacc. Te vrednosti NISO naključne. Te vrednosti smo dobili z raziskovanjem statistike o boleznih.
Nato moramo uporabnika vprašati, ali želi testirati veliko ali majhno populacijo za izbrano bolezen.
disp ('Izberite velikost populacije.')
fprintf ('20 / n200 / n ') speed = input (' Izbrana populacija: ',' s '); če je enako (hitrost, '20') število_populacije = 20; elseif isequal (hitrost, '200') population_size = 200; konec
Razlaga kode
To uporabniku natisne izjavo in od uporabnika zahteva, da vnese, kakšno populacijo želi preizkusiti. Ta različica trenutno ne upošteva neveljavnega vnosa. Neveljaven vnos bo povzročil napako in popolnoma ustavil program. 20 je bilo izbranih, ker je majhen vzorec, ki še vedno dobro predstavi, kako se okužba širi po majhni populaciji. 200 ljudi je bilo izbranih kot večja možnost, ker je 200 točk, narisanih na grafu, komaj prekrivalo točke, tako da je bilo vse mogoče zlahka videti in razlikovati med seboj.
Nato moramo najti hitrost simulacije.
disp ('Izberite hitrost simulacije.')
fprintf ('Hitra / nPočasna / n') hitrost = vnos ('Izbrana hitrost:', 's'); if isequal (hitrost, 'Fast') sim_speed = 0; elseif isequal (hitrost, 'počasen') sim_speed = 0,25; konec
Razlaga kode
Ta proces je bil enak pridobivanju vrste bolezni in velikosti populacije. Za hitro ne bo premora. in za počasno, bo pri izvajanju simulacije zamik 0,25 sekunde v zanki for.
Super! Zdaj imamo vse vnose uporabnika, ki jih potrebujemo! Preidimo na zbiranje podatkov za različne odstotke necepljenih ljudi.
Korak: Izberite % necepljenih ljudi in izračunajte povprečje necepljenih in okuženih za izbrani odstotek
Ta koda je za 0% necepljenih ljudi.
% ------- % 0 necepljeni ------------
per_infect_av_0 = ; odstotek_unvacc_and_infec_av_0 = ; za i = 1:20 izhod = infekcijaSim (unvacc, cepivo, velikost_populacije, 0, 1, hitrost_sim); per_infect_av_0 = [per_infect_av_0, ven (1, 1)]; odstotek_unvacc_and_infec_av_0 = [odstotek_unvacc_and_infec_av_0, ven (1, 2)]; končno povprečno_inficirano_0 = povprečje (na_infektno_v_0); povprečno_unvacc_and_infected_0 = povprečje (odstotek_unvacc_and_infec_av_0);
Razlaga kode:
For zanka se izvede 20 -krat. Izhod iz funkcije, infectionSim (), je shranjen v out. Vsakič, ko se izvede zanka for, se matriki doda odstotek okuženih v celotni populaciji 'per_infect_av_0'. Poleg tega se odstotek necepljenih in okuženih vsakič doda tudi v matriko "procent_unvacc_and_infec_av_0". V zadnjih dveh vrsticah sta ti dve zgoraj omenjeni matrici nato povprečeni in shranjeni v spremenljivkah. Če povzamemo, se odstotki za vsako simulacijo shranijo, povprečijo in preslikajo. Monte Carlo se uporablja za prikaz povprečne vrednosti izvajanja simulacije in prikaza rezultata. Za naše eksperimentalne namene se odločimo, da simulacijo izvedemo 20 -krat in povprečimo te vrednosti.
Izziv:
Ponovite za vse odstotke, ki jih želite preizkusiti! To lahko storite s spreminjanjem imen spremenljivk glede na odstotne številke. Testirali smo za 0%, 5%, 10%, 20%, 30%in 50%.
Namig:
Edina vrstica, ki jo je treba spremeniti v dejanski kodi, je
out = infekcijaSim (unvacc, vakcina, velikost_populacije, 0, 1, sim_speed);
Spremenite ničlo v odstotek v decimalni obliki. Na primer, pri 5% necepljeni simulaciji je treba 0 zamenjati z 0,5.
Korak 14: Graf: 'Trend okužbe pri necepljenih vs. Cepljen proti določeni bolezni '
To je koda za izdelavo grafa trenda okužbe pri necepljenih osebah v primerjavi z necepljenimi osebami.
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]; naklon = (povprečno_infektirano_5-povprečno_infektirano_0)/5; line_y = [povprečno_okuženo_0, (naklon*50)+povprečno_inficirano_0]; vrstica_x = [0, 50]; slika (2) ploskev (graf_mat_x, graf_mat_y); vrstica (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); title (['Trend necepljenja za', bolezen]); xlabel ('Odstotek začetnega necepljenega'); ylabel ('Odstotek končno okuženih')
Razlaga kode
vrstica 1: vrednosti y je dodeljena povprečju odstotka okuženih
vrstica 2: dodeljene vrednosti x odstotku začetnega odstotka necepljenih
vrstica 3: izračunajte naklon 0% in 5%
vrstica 4: shrani vrednosti y vrstice. To je nadaljevanje oddelka 0% do 5%.
vrstica 5: shrani y vrednosti vrstice. Ta vrstica obsega dolžino grafa.
vrstica 6: ustvarite sliko
vrstica 7: nariši graf vrednosti x in y za odstotek okuženih, ki niso bili cepljeni.
vrstica 8: narišite črto. To se uporablja za prikaz, da se ne povečuje linearno, ampak eksponentno.
vrstica 9: Nastavite naslov grafa.
vrstica 10-11: Nastavite oznake x in y za graf.
Zdaj bi morali videti, da večji odstotek prebivalstva, ki ni bilo cepljeno, večja je količina okužbe. Videli boste tudi, da je večina pik, ki postanejo rdeče, zelene pike, kar kaže, da cepivo do neke mere pomaga! Upam, da vam je bila ta vadnica všeč. Komentirajte, če imate kakršna koli vprašanja!
15. korak: Končni izdelek: Kako izgleda simulacija
Vso kodo najdete tukaj
Priporočena:
(Zelo preprosto) Modeliranje bolezni (z uporabo praske): 5 korakov
(Zelo preprosto) Modeliranje bolezni (z uporabo Scratch): Danes bomo simulirali izbruh bolezni, pri čemer je to katera koli bolezen, ne nujno COVID-19. To simulacijo je navdihnil videoposnetek 3blue1brown, na katerega se bom povezal. Ker je to povleci in spusti, ne moremo storiti toliko, kot z JS ali Pytom
Programska oprema za simulacijo LED kocke: 5 korakov
Programska oprema za simulacijo LED kock: skoraj sem končal z izdelavo LED kocke 8x8x8 in z njo je prišla ta programska oprema za računalnik! Pomaga vam pri ustvarjanju animacij in jih simulira na 2D zaslonu, preden se naložijo na 3D. Zaenkrat še ni podpore za komunikacijo prek
Program MicroPython: posodobite podatke o koronavirusni bolezni (COVID-19) v realnem času: 10 korakov (s slikami)
Program MicroPython: Posodobitev podatkov o koronavirusni bolezni (COVID-19) v realnem času: V zadnjih nekaj tednih je število potrjenih primerov koronavirusne bolezni (COVID 19) po vsem svetu preseglo 100.000, Svetovna zdravstvena organizacija (WHO) pa je razglasila nova epidemija koronavirusne pljučnice je svetovna pandemija. Bil sem zelo
Detektor obraznih mask => Preprečevalec bolezni!: 5 korakov
Detektor obraznih mask => Preprečevalec COVID -a !: Zdravstveni delavci številka 1 želijo, da ljudje v času te pandemije nosijo masko, ko gredo na javna mesta, vendar nekateri še vedno zaprejo oči pred opozorilom. Vnesite ….. COVID PrevEnter! Ta robot uporablja kamero Pixy2
Kako s strojnim učenjem odkriti rastlinske bolezni: 6 korakov
Kako s strojnim učenjem odkriti rastlinske bolezni: Postopek odkrivanja in prepoznavanja obolelih rastlin je bil vedno ročen in dolgočasen proces, ki od ljudi zahteva vizualni pregled rastlinskega telesa, kar lahko pogosto vodi do napačne diagnoze. Prav tako je bilo napovedano, da bo globalno