Sisukord:

Kas vaktsineerida või mitte? projekt karja immuunsuse jälgimiseks haiguste simulatsiooni kaudu: 15 sammu
Kas vaktsineerida või mitte? projekt karja immuunsuse jälgimiseks haiguste simulatsiooni kaudu: 15 sammu

Video: Kas vaktsineerida või mitte? projekt karja immuunsuse jälgimiseks haiguste simulatsiooni kaudu: 15 sammu

Video: Kas vaktsineerida või mitte? projekt karja immuunsuse jälgimiseks haiguste simulatsiooni kaudu: 15 sammu
Video: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, November
Anonim
Kas vaktsineerida või mitte? projekt karja immuunsuse jälgimiseks haiguste simulatsiooni kaudu
Kas vaktsineerida või mitte? projekt karja immuunsuse jälgimiseks haiguste simulatsiooni kaudu

Projekti ülevaade:

Meie projekt uurib karja immuunsust ja loodab julgustada inimesi vaktsineerima, et vähendada meie kogukondades nakatumise määra. Meie programm simuleerib seda, kuidas haigus nakatab populatsiooni, kellel on erinev protsent vaktsineeritud ja vaktsineerimata. See näitab karja immuunsust, näidates, kuidas vaktsineeritud populatsiooni suurenenud arv võib vähendada mõjutatud inimeste arvu.

Me modelleerime seda Matlabis, kasutades graafiteooria kontseptsioone. Graafikuteooria on matemaatiline viis objektidevaheliste suhete kujutamiseks. Graafiteoorias on graafidel tipud (või sõlmed), mis on servadega (või joontega) ühendatud. Meie projekti jaoks on sõlmed asjaomased isikud ja servad on nende ühendused. Näiteks kui kaks sõlme on servaga ühendatud, tähendab see, et nad on "sõbrad" või on üksteisega mingil viisil kontaktis. See kontakt on haiguse leviku viis. Seetõttu kasutasime oma kontseptsiooni modelleerimiseks graafiteooriat, sest tahtsime näha, kuidas haigus levib populatsiooniga seotud inimeste seas.

Meie projekt hõlmab ka Monte Carlo meetodit. Monte Carlo meetod on algoritmid, mis loovad numbriliste tulemuste saamiseks korduva juhusliku valimi. Meie projektis kasutame seda meetodit oma simulatsiooni läbiviimiseks mitu korda, muutes esialgse vaktsineerimata protsendi, et näha inimeste nakatumise kiirust.

Kogu projekti kood on allosas lingitud!

Arvuti krediit:

Matlabi link graafikuteooriale:

Samm: looge külgmaatriks

Looge külgmaatriks
Looge külgmaatriks
Looge külgmaatriks
Looge külgmaatriks

Looge uus skript. Me nimetame oma nakkust nakatumiseksSim.m.

Loome muutuja 'NUMOFPEOPLE'. Saate selle määrata mis tahes täisarvuväärtusele. See näitab teie elanikkonna inimeste arvu.

Edaspidi eeldame seda

NUMOFPEOPLE = 20;

Alustuseks kasutage Matlabi graafiteooria funktsioone suunamata graafi jaoks.

Kui soovite rohkem teada saada, on siin link, mille abil saate selle kohta põhjalikumalt lugeda.

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

Lõi külgnevusmaatriksi.

adjMatrix = nullid (NUMOFPEOPLE);

See loob ruutmaatriksi 0 -st. Maatriksi iga rida on inimene. Iga maatriksi veerg on isik või sõber, kellega inimene kohtub kogu päeva jooksul.

Vaadake joonist 100 (ülal), et aidata visualiseerida, kuidas adjMatrix 20 inimese jaoks välja näeb.

** Sellest hetkest alates eeldame, et NUMOFPEOPLE on 20. **

Võite proovida joonistada selle külgnevusmaatriksi. Siin on natuke rohkem teavet seda tüüpi maatriksite joonistamise kohta.

Märkus. Kuidas külgnevusmaatriks töötab.

Näiteks:

%teeb külgneva maatriksi

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] %joonistus g = graafik (a); %, kasutades graafifunktsiooni (graafiteooria) joonis (1); h = graafik (g);

Vaadake joonist 1 (ülal), et näha, kuidas lisada servi külgnevusmaatriksisse, kasutades koodi "Märkus".

2. samm: looge suhteid

Loo suhteid
Loo suhteid

Nüüd, kui inimesed (tipud või sõlmed) on loodud, peame looma suhete võrgustiku (graafiku jooned või servad). See simuleerib inimeste suhtlemist ja kohtumist teiste inimestega kogu päeva jooksul.

Seda saab teha mitmel viisil. Üks viis selle ülesande täitmiseks on kõigepealt määrata igale inimesele juhuslik number, et määrata, kui paljude inimestega iga inimene päevas suhtleb.

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

See teeb 1–20 maatriksi juhuslike täisarvude kohta, mis tähistab iga inimese interaktsioonide arvu päevas. Selle maatriksi veerud oleksid igale inimesele vastav number. Näiteks kui määrame kõige vähem sõbradPersonCanHave = 2 ja mostFriendsPersonCanHave = 5, saame juhuslikud väärtused vahemikus 2 kuni 5.

Kas teil on randiga () probleeme? Tippige terminali

aita randi

Järgmisena koostame randomiseeritud maatriksi (nimega "allFriendsmatrix") selle kohta, kuidas iga populatsiooni inimene on populatsioonis ühendatud/suhtleb.

tempMatrix = ;

loendus = 0; allFriendsMatrix = ; k = 1 jaoks: NUMOFPEOPLE, samas pikkus (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (loend) = temp; lõpp on selge, kui pikkus (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; end allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; loendus = 0; lõpp

Koodi põhjalik selgitus:

Kõigepealt loome tühja ajutise maatriksi, et hoida iga inimese sõprade/suhtluste loendit. Samuti lähtestame loendamise, mis lihtsalt jälgib, kuhu tempMatrixis uus juhuslik ühendus kleepida. For -ahelad toimivad 20 korda, nii et see juhtub iga elanikkonna üksikisiku puhul. Esimese aja tsükkel kestab seni, kuni iga inimese tempMatrix on sama pikkusega juhuslikult määratud interaktsioonide arvust. Selles silmus genereeritakse juhuslik arv, mis vastab elanikkonnale ja paigutatakse tempMatrixi. Kuna iga tempMatrixi pikkus on erinev, pidime looma mõned NaN väärtused, et saaksime kõik need tempMaticies ühendada üheks maatriksiks ('allFriendsMatrix'). Teine aeg -tsükkel lahendab selle probleemi, lisades igasse tempMatrixisse NaN -i. While -tsükkel käivitati 9 korda, kuna see on arv suurem kui 5, mis oli sõprade ülemine piir, kellele saab määrata isiku. Väärtus „9” on muutuv ja seda saab/tuleb muuta, kui „mostFriendsPersonCanHave” on suurem kui 9. Kolm viimast koodirida (välja arvatud lõpp) lisavad tempMatrixi „allFriendsMatrix” järgmisele reale. Seejärel kustutab see tempMatrixi ja loeb järgmise inimese jaoks.

Väljund

Selline peaks väljund välja nägema esimese käivitamise korral (enne kolme viimast rida).

tempMatrix = 16 8 17 16 13 NaN NaN NaN NaN

allFriendsMatrix =

16 8 17 16 13 NaN NaN NaN NaN 8 8 2 7 11 NaN NaN NaN NaN 10 13 NaN NaN NaN NaN NaN NaN NaN 11 17 2 NaN NaN NaN NaN NaN NaN 10 12 NaN NaN NaN NaN NaN NaN NaN 4 13 2 12 NaN NaN NaN NaN NaN 17 10 9 3 1 NaN NaN NaN NaN 16 16 6 NaN NaN NaN NaN NaN NaN 3 8 17 17 14 NaN NaN NaN NaN 20 19 3 NaN NaN NaN NaN NaN NaN 13 10 NaN NaN NaN NaN NaN NaN NaN 2 18 10 16 NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN NaN 8 16 14 8 NaN NaN NaN NaN NaN 7 7 NaN NaN NaN NaN NaN NaN NaN 19 10 9 NaN NaN NaN NaN NaN NaN 10 19 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 16 7 13 10 1 NaN NaN NaN NaN

Seejärel lisage need seosed adjMatrixisse.

iga rea jaoks = 1: NUMOFPEOPLE

for eachCol = 1: 9 if isnan (allFriendsMatrix (everyRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; ots otsa lõpp

Koodi selgitus

See topelt silmuse jaoks läbib iga allika „AllFriendsMatrix” rea ja veeru. Lause if käivitub kõigi väärtuste puhul, mis ei ole „NaN”. Põhimõtteliselt loob see graafiku servad või jooned. Nii et esimene rida, mida see teeb, on inimene 1 inimesele 16 ja inimene 16 inimesele 1. Kuna see on suunamata, tuleb 1 muuta mõlema jaoks! Meil ei saa olla ainult serv 1 kuni 16 ja mitte 16: 1. Need peavad olema sümmeetrilised, et see Matlabis korralikult töötaks.

Simulatsioonis tegime kindlaks, et inimesed ei saa iseendaga suhelda. Väärtuste randomiseerimisel on tõenäoline, et meie külgneval maatriksil on need vead.

Parandame selle järgmise koodiga:

iga = 1: NUMOFPEOPLE

adjMatrix (iga, iga) = 0; lõpp

Koodi selgitus

See silmus tagab, et inimene 1 ei ole seotud isikuga 1, isik 2 ei ole seotud isikuga 2 jne, muutes need kõik 0. Nagu näete allpool väljundi jaotises, on meil ruudu diagonaal maatriks vasakult ülevalt alla paremale on kõik 0.

Väljund

See on praeguse simulatsiooni viimane adjMatrix. See moodustab kõik graafiku read (joonis 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

Vt joonist 2, et näha 'adjMatrix' graafikut.

Samm: lisage haigusstatistika

Nüüd, kui teie programm suudab luua graafiku juhuslike inimeste hulgaga ja luua juhuslikke seoseid, peame sisestama haiguse teabe või statistika, et näha, kuidas need suhted elanikkonnas võivad infektsiooni suurendada või vähendada.

Looge need muutujad:

unvacc %tüüp: topelt; tõenäosus, et vaktsineerimata inimesed seda haigust ei saa

vaktsiini %tüüp: topelt; tõenäosus, et vaktsineeritud inimesed ei saa haigust unvacc_perc %type: double; populatsiooni protsent vaktsineerimata init_infect %tüüp: int; protsenti elanikkonnast vaktsineeritud

Järgmisena peame tegema mõned arvutused.

Teeme infektsioonimatti, mis on 3*NUMOFPEOPLE maatriks.

vacc_perc = 1-unvacc_perc;

nakkusMat = nan (3, NUMOFPEOPLE); number = ümmargune (vacc_perc * NUMOFPEOPLE); nakkusMat (1, 1: arv) = vaktsiin; infektsioonMat (1, number+1: lõpp) = unvacc; infektsioonMat (2, 1: lõpp) = 0; infektsioonMat (2, 1: init_infect) = 1;

Koodi selgitus

rida 1: arvutatud vaktsineerimata elanikkonna protsent

rida 2: looge maatriks 3*N inimeste arvuga

rida 3: uurige vaktsineeritud inimeste arvu vaktsineeritud protsendist

rida 4: andke vaktsineeritud inimestele vaktsiini saamisega seotud immuunsus. See väärtus määratakse haiguse uurimise põhjal.

rida 5: ülejäänud elanikkonnale (vaktsineerimata isikud) andke neile puutumatuse protsent. See väärtus määratakse haiguse uurimise põhjal.

rida 6: seadke esialgu kõik inimesed nakatumata.

rida 7: esialgu nakatunud inimeste arvu täitmiseks täitke paar esimest veergu.

Nüüd, kui oleme määranud kõik haiguse simulatsiooni parameetrid, randomiseerime võimaluse, kas inimene (nii vaktsineeritud kui ka vaktsineerimata) nakatub. Seda tehakse järgmises etapis, määrates igale selle infektsiooniMat 'kolmanda rea inimesele juhuslikud väärtused vahemikus 0 kuni 1.

Samm 4: randomiseerige võimalus, et vaktsineeritud ja vaktsineerimata inimene võib nakatuda

Seejärel määrake igale inimesele juhuslik number, mida kasutatakse hiljem, et teha kindlaks, kas inimene nakatub või mitte.

w = 1: pikkus (infektsioonMat)

nakkusMat (3, w) = rand; lõpp

Koodi selgitus

See tsükkel käsitleb viimases etapis loodud 'infektsiooniMat' kolmandat rida. „rand” määrab 3. rea igale indeksile väärtuse vahemikus 0–1.

Väljund

infektsioonMat on nüüd valmis! See oli 100% vaktsineeritud elanikkonnaga ja 1 inimene, kes oli algselt nakatunud.

nakkusMat =

Veerud 1 kuni 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 0 0,0869 0,5489 0,3177 0,9927 0,7236 0,5721 0,7172 0,9766 0,4270 0,9130 0,8973 0,00 0,7500 Veerud 0.7500 0.7500 0 0 0 0 0 0 0 0 0 0.0480 0.3593 0.2958 0.6291 0.1362 0.3740 0.8648 0.2503

rida 1: tõenäosus, et haigus ei haigestu protsentides

rida 2: nakatunud või mitte nakatunud (loogiline väärtus)

rida 3: number, mida kasutatakse selleks, et kontrollida, kas nakatunud inimene nakatub nakatunud inimesega kohtudes. Kui nakatumata inimene kohtub nakatunud isikuga, on see arv suurem kui rea 1 (sama veeru puhul), siis on ta nakatunud. Kodeerime selle funktsionaalsuse välja sammus 7.

Samm: looge esialgse teabe põhjal vaktsineerimata ja nakatunud inimeste maatriksid

Looge 2 maatriksit nimega "matrixUnvacc" ja "matrixInfected", mis salvestab kõik nakatunud inimesed infektsiooniMat. Seda kasutatakse selleks, et saaksime nakatunud, vaktsineerimata või vaktsineeritud inimeste graafiku värvikoodiga kodeerida, aidates visualiseerida vaktsineerimata ja vaktsineeritud isikute mõju.

puhastage igaüks

matrixInfected = ; maatriksUnvacc = ; jaoks h = 1: pikkus (infektsioonMat), kui infektsioonMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; end end for person = 1: NUMOFPEOPLE if infektsioonMat (2, inimene) == 1 matrixInfected = [matrixInfected, isik]; lõpp lõpp

Koodi selgitus

Looge kaks tühja maatriksit, et salvestada vastavalt vaktsineerimata ja nakatunud inimeste arv. Nii tsüklite puhul, mida käitatakse 20 korda, kui ka juhul, kui avaldus on täidetud, lisatakse number õigele maatriksile.

Väljund

matrixUnvacc =

matrixInfected =

[1]

6. samm: joonistage esialgne graafik

Joonista esialgne graafik
Joonista esialgne graafik

Järgmisena joonistame külgnevusmaatriksi.

g = graafik (adjMatrix);

joonis (1) p = graafik (g, 'NodeColor', 'b', 'MarkerSize', 7); highlight (p, matrixUnvacc, 'NodeColor', 'g') highlight (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Vaktsineerimata inimeste protsent:', num2str (title_unvacc), '%']); paus (kiirus)

Koodi selgitus

Graafiteoorial Matlabis on sisseehitatud funktsioonid. Funktsiooni graph () kasutamisel saame tõlkida 'adjMatrix' tegelikuks suunamata graafiks. Seejärel peame looma krundi, kasutades funktsiooni plot (), et tegelikult näha, kuidas see välja näeb. Seadsime selle graafiku () muutujaks, et saaksime kogu simulatsiooni jooksul hõlpsamini manipuleerida ja muuta graafiku värve. Kõik inimesed (või sõlmed) on algselt seatud värvile "sinine". Seejärel määratakse kõik vaktsineerimata inimesed rohelisele värvile. Seejärel määratakse nakatunud inimestele punane värv. Pealkiri määratakse vastavalt testitavate vaktsineerimata inimeste teatud protsentuaalsele väärtusele. Funktsioon pause () peatab ajutiselt MatLabi täitmise. Me läbime muutuva kiiruse, mis jaotatakse sekunditega.

Vaadake pilti (ülal), et näha juhuslikku värvikoodiga graafikut.

Lisateave MatLabi funktsiooni highlight () kohta.

Samm: simuleerige nakkuse progresseerumist

Järgmisena peame välja selgitama, kes nakatub pärast interaktsioone (registreeritud adjMatrixis) ja värskendama graafikut, kui keegi nakatub.

Kasutage adjMatrixit, et teha kindlaks, millised inimesed on nakatunud pärast inimestega suhtlemist päevas.

iga rea jaoks = 1: pikkus (adjMatrix)

kui infektsioonMat (2, iga rida) == 1 iga kolli kohta = 1: pikkus (adjMatrix), kui adjMatrix (iga rida, iga kollane) == 1 % iga rida = inimene % iga kollane = selle sõber % iga inimese sõber ja vaata, kas nad on nakatunud. kui infektsioonMat (3, igaCol)> infektsioonMat (1, igaCol) infektsioonMat (2, igaCol) = 1; esiletõstmine (p, eachCol, 'NodeColor', 'r') paus (kiirus) lõpp lõpp lõpp lõpp

For -silmus ringleb läbi iga inimese. See kontrollib, et kui inimene on nakatunud, kontrollib see kõiki inimesi/sõpru, kellega nad suhtlesid, ja kontrollis, kas sõbra immuunsus oli kõrgem kui haiguse tugevus. Siin tuleb mängu meie loodud infektsioonimatt. Sõbra iga veeru esimest ja kolmandat rida võrreldakse ja kui kolmas rida on suurem, tähendab see, et sõbral ei olnud haigusest pääsemiseks piisavalt kõrget immuunsust ja lõpuks nakatub. Samuti muudame värvi, kasutades esiletõstmist () punaseks, kui nad nakatuvad.

Nüüd peaks teie simulatsiooni kood töötama! ja mis tahes suurusega elanikkonna jaoks muutke lihtsalt NUMOFPEOPLE!

Samm: kasutage Monte Carlo teooriat

Selle sammu võrra edasi astumiseks ja meie simulaatorist ('infekcijaSim.m') andmete väljavõtmiseks tahtsime arvutada ja joonistada trendi nakatunud vaktsineerimata inimeste protsendi ja nakatunud vaktsineeritud inimeste protsendi kohta. Me oletame, et nakatunud vaktsineeritud inimeste protsent peaks olema palju väiksem kui nakatunud vaktsineerimata inimeste protsent.

Samm 9: muutke fail ('infekcijaSim.m') simulatsiooniga funktsiooniks

Monte Carlo käitamiseks tahaksime simulatsiooni mitu korda läbi viia ja andmeid koguda, et saaksime seda kasutada nakatunud inimeste protsendi graafiku koostamiseks.

Funktsiooni saab seadistada järgmiselt:

funktsiooni väljund = infektsioonSim (unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, speed)

Kommenteerige oma simulatsiooni muutujaid, kuna nüüd sisestate need põhifaili kaudu (hakkame seda kirjutama 12. sammus):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

Uus muutuja

kiirus

määratakse põhifaili (Monte_Carlo.m).

Märkus. Funktsiooni lõpetamiseks ärge unustage lõppu funktsiooni faili allosas!

10. samm: arvutage nakatunud vaktsineerimata ja vaktsineeritud inimeste protsent

See arvutab vaktsineerimata inimeste protsendi, kes nakatusid. See kood asub faili „infekcijaSim.m” allosas.

arv_un_cc = 0;

number_of_infec_unvacc = 0; %arvutab vaktsineerimata inimeste protsendi, kes said nakkuse x = 1: pikkus (infektsioonMat), kui infektsioonMat (1, x) == unvacc number_of_unvacc = number_of_unvacc+1; lõpp, kui nakkusMat (1, x) == unvacc & infektsioonMat (2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; lõpu lõpp protsent_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc)*100;

Koodi selgitus

For -tsüklis ringleb see üle NUMOFPEOPLE korra. Iga kord, kui nakatumismatis olev arv vastab vaktsineerimata arvule (st 0,95 == 0,95), suurendatakse vaktsineerimata inimeste arvu 1 võrra. Iga kord, kui nakkusmatis olev number vastab vaktsineerimata arvule ja nad on nakatunud, nakatunud ja vaktsineerimata inimeste arv suureneb 1. Viimane rida jagab nakatunud, vaktsineerimata inimeste arvu vaktsineerimata inimeste koguarvuga. Seejärel arvutatakse selle põhjal protsent.

Väljakutse:

Proovige arvutada nakatunud inimeste vaktsineeritud protsent! (Vihje: see on ülaltoodud koodiga väga sarnane, kuid mõningaid muutujaid muudetakse ja nimesid kohandatakse.)

Järgmisena arvutatakse kogu elanikkonna põhjal nakatunud inimeste protsent:

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

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

Koodi selgitus

Kumulatiivne summa arvutatakse infektsiooniMat teise rea abil, mis salvestab 1 ja 0 sekundit sõltuvalt sellest, kas inimene on nakatunud või mitte. Kuna funktsioon cumsum () annab maatriksi tagasi, võtame maatriksi viimase väärtuse ('pre_per_infect (1, NUMOFPEOPLE)'), mis peaks olema 'infektsiooniMat (2,:)' kõigi väärtuste tegelik summa. Jagades summa NUMOFPEOPLE'iga ja korrutades selle 100 -ga, saame lõpliku nakatunud protsendi kogu elanikkonnast.

Samm 11: looge väljundmuutuja oma funktsioonis "infekcijaSim.m"

väljund = [per_infect, protsenti_of_unvacc_and_infec, protsenti_of_vacc_and_infec];

Koodi selgitus

Salvestage see teave väljundisse, mis saadetakse tagasi põhile (Monte_Carlo.m), kui funktsioon on kutsutud ja tehtud. Neid andmeid kasutatakse vaktsineeritud ja vaktsineerimata nakatunute protsendi graafiku koostamiseks.

Funktsioon „infektsioonimim.m“tuleks teha kohe! Kuid see ei käivitu, sest me peame ikkagi peamise kirjutama!

12. samm: looge menüü, et saada kasutajalt simulatsiooni algtingimused

Pidage meeles, kuidas me muutujat ütlesime

kiirus

loodaks ja läbiks põhifunktsiooni? Peame hankima funktsioonile edastatavad väärtused. Pange tähele, et väärtuste järjekord funktsiooni kutsumisel on oluline!

Alustuseks paluge kasutajal tippida mõned vastused terminali.

> Valige haigus. Pange tähele, et see on tõstutundlik >> Läkaköha >> Gripp >> Leetrid >> Haigus Valitud: gripp >> Valige populatsiooni suurus. >> 20 >> 200 >> Valitud populatsioon: 20 >> Vali simulatsiooni kiirus. >> Kiire >> Aeglane >> Valitud kiirus: kiire

See allpool olev kood küsib kasutajalt, millist haigust ta soovib uurida.

disp ("Valige haigus. Pange tähele, et see on tõstutundlik")

fprintf ('Läkaköha / nGripi / leetrid / n') haigus = sisend ('Valitud haigus:', 's'); kui isequal (haigus, 'läkaköha') vaktsiin =.85; %15 %tõenäosus haigestuda unvacc =.20; %80 %tõenäosus haigestuda muul viisil, kui on samaväärne (haigus, "gripp") vaktsiin = 0,75; %25 %tõenäosus haigestuda unvacc =.31; %69 %tõenäosus haigestuda muul viisil, kui pole (haigus, leetrid) vaktsiin = 0,97; %3 %tõenäosus haigestuda unvacc =.10; 90 %tõenäosus haigestuda

Koodi selgitus:

Funktsioon disp () prindib avalduse ekraanile ja prindib välja ka erinevad valikud. Haigus määratakse vastavalt. See versioon ei arvesta praegu kehtetut sisendit. Vale sisend põhjustab vea ja peatab programmi täielikult. Igal haigusel on vaktsiin ja vaktsineerimata väärtused. Need väärtused EI ole juhuslikud. Need väärtused saime haiguste statistikat uurides.

Järgmisena peame kasutajalt küsima, kas ta soovib testida oma valitud haiguse suhtes suurt või väikest populatsiooni.

disp ('Vali populatsiooni suurus.')

fprintf ('20 / n200 / n ') speed = input (' Valitud populatsioon: ',' s '); kui isequal (kiirus, '20') populatsiooni_suurus = 20; elseif isequal (kiirus, '200') populatsiooni_suurus = 200; lõpp

Koodi selgitus

See prindib kasutajale avalduse ja palub kasutajal sisestada, millise elanikkonna suurust ta soovib testida. See versioon ei arvesta praegu kehtetut sisendit. Vale sisend põhjustab vea ja peatab programmi täielikult. 20 valiti, kuna see on väike valimi suurus, mis annab endiselt hea ettekujutuse sellest, kuidas nakkus levib väikeses populatsioonis. Suurema variandina valiti 200 inimest, kuna graafikule kantud 200 punkti puhul ei olnud punktid peaaegu üldse kattunud, nii et kõike oli lihtne näha ja üksteisest eristada.

Järgmisena peame leidma simulatsiooni kiiruse.

disp ('Vali simulatsiooni kiirus.')

fprintf ('Kiire / nAeglane / n') kiirus = sisend ('Valitud kiirus:', 's'); kui isequal (kiirus, 'Kiire') sim_kiirus = 0; elseif isequal (kiirus, 'aeglane') sim_kiirus = 0,25; lõpp

Koodi selgitus

See protsess oli sama, mis haiguse tüübi ja populatsiooni suuruse saamine. Paastu jaoks ei tehta pausi. ja aeglase puhul on simulatsiooni käivitamisel silmus for for 0,25 sekundilise viivitusega.

Suurepärane! Nüüd on meil kõik vajalikud sisendid kasutajalt! Läheme edasi andmete kogumisele vaktsineerimata inimeste erinevate protsentide kohta.

Samm: valige % vaktsineerimata inimestest ja arvutage vaktsineerimata ja nakatunud inimeste keskmine protsent

See kood on 0% vaktsineerimata inimestele.

% ------- % 0 Vaktsineerimata ------------

per_infect_av_0 = ; protsent_un_cc_and_infec_av_0 = ; i = 1:20 välja = infektsioonSim (vaktsineerimata, vaktsiin, populatsiooni suurus, 0, 1, sim_kiirus); per_infect_av_0 = [per_infect_av_0, läbi (1, 1)]; percent_of_unvacc_and_infec_av_0 = [percent_of_unvacc_and_infec_av_0, out (1, 2)]; lõpp keskmine_ nakatunud_0 = keskmine (per_infect_av_0); keskmine_unvacc_and_infected_0 = keskmine (%_of_unvacc_and_infec_av_0);

Koodi selgitus:

For -tsüklit käivitatakse 20 korda. Funktsiooni infektsioon Sim () väljund salvestatakse välja. Iga kord, kui for for loop käivitatakse, lisatakse maatriksile „per_infect_av_0” nakatunute protsent kogu populatsioonist. Lisaks lisatakse vaktsineerimata ja nakatunud protsent iga kord maatriksisse „percent_of_unvacc_and_infec_av_0”. Kahes viimases reas keskmistatakse need kaks ülalmainitud maatriksit ja salvestatakse muutujatesse. Kokkuvõtteks võib öelda, et protsendid salvestatakse iga simulatsiooni jaoks, keskmistatakse ja joonistatakse. Monte Carlot kasutatakse simulatsiooni läbimise ja tulemuse kuvamise keskmise väärtuse näitamiseks. Katse eesmärgil valime simulatsiooni 20 korda ja keskmistame need väärtused.

Väljakutse:

Korrake kõiki protsente, mida soovite testida! Seda saab teha muutujate nimede muutmisega vastavalt protsentarvudele. Testisime 0%, 5%, 10%, 20%, 30%ja 50%.

Vihje:

Ainus rida, mida tuleb tegelikus koodis muuta, on

out = infektsioonSim (unvacc, vaktsiin, populatsiooni_suurus, 0, 1, sim_kiirus);

Muutke null kümnendvormis protsendiks. Näiteks 5% vaktsineerimata simulatsiooni korral tuleks 0 asendada 0,5 -ga.

14. samm: graafik: „Nakatumise suundumus vaktsineerimata vs. Vaktsineeritud spetsiifilise haiguse vastu”

See on kood, mis teeb graafiku vaktsineerimata ja vaktsineerimata inimeste nakatumise suundumuste kohta.

graafik_mat_y = [keskmine_ nakatunud_0, keskmine_ nakatunud_5, keskmine_ nakatunud_10, keskmine_ nakatunud_20, keskmine_ nakatunud_30, keskmine_ nakatunud_50];

graafik_mat_x = [0, 5, 10, 20, 30, 50]; kalle = (keskmine_ nakatunud_ 5-keskmine_ nakatunud_0)/5; rida_y = [keskmine_ nakatunud_0, (kalle*50)+keskmine_ nakatunud_0]; rida_x = [0, 50]; joonis (2) graafik (graph_mat_x, graph_mat_y); rida (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); title (['Vaktsineerimata suundumus', haigus]); xlabel ('Esmase vaktsineerimata protsendi'); ylabel ('Lõplikult nakatunute protsent')

Koodi selgitus

rida 1: määratud y väärtused nakatunud protsendi keskmistele

rida 2: määratud x väärtused vaktsineerimata esialgse protsendi protsendile

rida 3: arvutage kalle 0% ja 5%

rida 4: salvestage rea y väärtused. See on jätkuks jaotisele 0% kuni 5%.

rida 5: salvestage rea y väärtused. See joon ulatub graafiku pikkusele.

rida 6: kujundi loomine

rida 7: joonistage vaktsineerimata nakatunud protsendi graafiku x ja y väärtused.

rida 8: joonistage joon. Seda kasutatakse näitamaks, et see ei suurene lineaarselt, vaid eksponentsiaalselt.

rida 9: määrake graafiku pealkiri.

rida 10-11: määrake graafikule x ja y sildid.

Nüüd peaksite nägema, et mida suurem osa elanikkonnast on vaktsineerimata, seda suurem on nakatumine. Samuti näete, et enamik punaseks muutuvaid täppe on rohelised, mis näitab, et vaktsiin aitab teatud määral! Loodan, et teile meeldis see õpetus. Kommenteerige, kui teil on küsimusi!

15. samm: lõpptoode: kuidas simulatsioon välja näeb

Kogu koodi leiate siit

Soovitan: