Kazalo:

Se cepiti ali ne? projekt o opazovanju imunitete črede s simulacijo bolezni: 15 korakov
Se cepiti ali ne? projekt o opazovanju imunitete črede s simulacijo bolezni: 15 korakov

Video: Se cepiti ali ne? projekt o opazovanju imunitete črede s simulacijo bolezni: 15 korakov

Video: Se cepiti ali ne? projekt o opazovanju imunitete črede s simulacijo bolezni: 15 korakov
Video: Não deixe de ouvir essas palavras!!!! 2024, Julij
Anonim
Se cepiti ali ne? projekt opazovanja imunitete črede s simulacijo bolezni
Se cepiti ali ne? projekt opazovanja imunitete črede s simulacijo bolezni

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

Ustvari matriko sosedstva
Ustvari matriko sosedstva
Ustvari matriko sosedstva
Ustvari 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

Ustvarite odnose
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

Nariši začetni graf
Nariši 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: