Përmbajtje:

Të vaksinohesh apo jo? një projekt mbi vëzhgimin e imunitetit të tufës përmes simulimit të sëmundjes: 15 hapa
Të vaksinohesh apo jo? një projekt mbi vëzhgimin e imunitetit të tufës përmes simulimit të sëmundjes: 15 hapa

Video: Të vaksinohesh apo jo? një projekt mbi vëzhgimin e imunitetit të tufës përmes simulimit të sëmundjes: 15 hapa

Video: Të vaksinohesh apo jo? një projekt mbi vëzhgimin e imunitetit të tufës përmes simulimit të sëmundjes: 15 hapa
Video: The Choice is Ours (2016) Official Full Version 2024, Korrik
Anonim
Të vaksinohesh apo jo? një projekt mbi vëzhgimin e imunitetit të tufës përmes simulimit të sëmundjeve
Të vaksinohesh apo jo? një projekt mbi vëzhgimin e imunitetit të tufës përmes simulimit të sëmundjeve

Pasqyrë e projektit:

Projekti ynë eksploron imunitetin e tufës dhe shpreson të inkurajojë njerëzit të bëjnë vaksinime për të ulur shkallën e infeksionit në komunitetet tona. Programi ynë simulon sesi një sëmundje infekton një popullatë me përqindje të ndryshme të normave të vaksinuara dhe të pavaksinuara. Ajo tregon imunitetin e tufës duke treguar sesi një numër i shtuar i popullsisë së vaksinuar mund të zvogëlojë numrin e njerëzve të prekur.

Ne e modelojmë këtë në Matlab duke përdorur konceptet e teorisë së grafikut. Teoria e grafikut është një mënyrë matematikore për të përfaqësuar marrëdhëniet midis objekteve. Në teorinë e grafikëve, grafikët kanë kulme (ose nyje) të lidhura me skajet (ose linjat). Për projektin tonë, nyjet janë individët në fjalë dhe skajet janë lidhjet e tyre. Për shembull, nëse dy nyje janë të lidhura me një skaj atëherë kjo do të thotë se ata janë "miq" ose kanë një formë kontakti me njëri -tjetrin. Ky kontakt është një mënyrë për përhapjen e sëmundjes. Kjo është arsyeja pse ne përdorëm teorinë e grafikut për të modeluar konceptin tonë sepse donim të shihnim se si përhapet sëmundja midis individëve që janë të lidhur në një popullatë.

Projekti ynë përfshin gjithashtu Metodën Monte Carlo. Metoda Monte Carlo janë algoritme që krijojnë mostra të përsëritura të rastësishme për të marrë rezultate numerike. Në projektin tonë, ne e përdorim këtë metodë për të drejtuar simulimin tonë disa herë duke ndryshuar përqindjen e pavaksinuar fillestare për të parë shkallën në të cilën njerëzit infektohen.

I gjithë kodi i projektit është i lidhur në fund!

Kredia e PC:

Lidhja e Matlab me Teorinë e Grafikut:

Hapi 1: Krijoni Matricën e Afërsisë

Krijo Matricën e Afërsisë
Krijo Matricën e Afërsisë
Krijo Matricën e Afërsisë
Krijo Matricën e Afërsisë

Krijoni një skenar të ri. Ne do ta quajmë tonën "infeksionSim.m".

Ne do të krijojmë një ndryshore 'NUMOFPEOPLE'. Mund ta caktoni në çdo vlerë të plotë. Kjo do të përfaqësojë numrin e njerëzve në popullatën tuaj.

Tani e tutje, ne do të supozojmë se

NUMOFETO = 20;

Filloni së pari duke përdorur funksionet e teorisë së grafikut të Matlab për një graf të padrejtuar.

Nëse jeni të interesuar të mësoni më shumë, këtu është një lidhje për ju që të lexoni më shumë në lidhje me të.

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

Krijoi një matricë ngjitjeje.

adjMatrix = zero (NUMOFOPOPLE);

Kjo do të krijojë një matricë katrore prej 0s. Çdo rresht në matricë është një person. Çdo kolonë në matricë është një person ose mik që personi takon gjatë gjithë ditës.

Shihni Figurën 100 (më sipër) për të ndihmuar në përfytyrimin se si duket adjMatrix për 20 persona.

** Nga kjo pikë e tutje ne do të supozojmë se NUMOPOPLE është e barabartë me 20. **

Mund të provoni të vizatoni këtë matricë ngjitjeje. Këtu keni pak më shumë informacion në lidhje me komplotimin e këtyre llojeve të matricave.

Shënim: Si funksionon matrica e afërsisë.

P.sh.:

%duke bërë matricën ngjitur

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] %vizatim g = grafik (a); %duke përdorur funksionin e grafikut (teoria e grafit) figura (1); h = komploti (g);

Shihni Figurën 1 (më sipër) për të parë se si të shtoni skajet në matricën e afërsisë, duke përdorur kodin në "Shënim".

Hapi 2: Krijoni marrëdhënie

Krijoni marrëdhënie
Krijoni marrëdhënie

Tani që njerëzit (kulmet ose nyjet) janë krijuar, ne duhet të krijojmë një rrjet marrëdhëniesh (linja ose skaje të grafikut). Kjo do të simulojë sesi njerëzit ndërveprojnë dhe takohen me njerëz të tjerë gjatë gjithë ditës.

Kjo mund të bëhet në shumë mënyra. Një mënyrë për të përfunduar këtë detyrë është që së pari t'i caktoni një numër rastësor secilit person për të përcaktuar se me sa njerëz do të ndërveprojë secili person në një ditë.

numOfFriendsMatrix = randi ([minimumFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFOPOLE);

Kjo bën një matricë 1 me 20 të numrave të plotë të rastësishëm që përfaqësojnë numrin e ndërveprimeve që secili person ka në ditë. Kolonat e kësaj matricë do të ishin numri që korrespondon me secilin person. Për shembull, nëse caktojmë më pakFriendsPersonCanHave = 2 dhe mostFriendsPersonCanHave = 5, do të merrnim vlera të rastësishme midis 2 dhe 5.

Keni probleme me randin ()? Në terminal, shkruani

ndihma randi

Tjetra, ne bëjmë një matricë të rastit (e quajtur "allFriendsmatrix") se si çdo person në popullatë është i lidhur/ndërvepron brenda popullatës.

tempMatrix = ;

numërimi = 0; allFriendsMatrix = ; për k = 1: NUMOFPEOPLE ndërsa gjatësia (tempMatrix) ~ = numOfFriendsMatrix (k) numërimi = numërimi +1; temp = randi ([1, NUMOFOPEOPLE]); tempMatrix (numërimi) = temp; përfundoni qartë secilën ndërsa gjatësia (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; përfundoni allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; numërimi = 0; fund

Shpjegim i thellë i kodit:

Së pari ne krijojmë një matricë të zbrazët të përkohshme për të mbajtur listën e miqve/ndërveprimeve të secilit person. Ne gjithashtu fillojmë numërimin, i cili thjesht mban shënime se ku të vendoset lidhja e re e rastësishme në tempMatrix. Lakrat for drejtohen 20 herë në mënyrë që kjo të ndodhë për secilin person individual në popullatë. Cikli i parë ndërkohë që funksionon derisa tempMatrix i secilit person është e njëjta gjatësi e numrit të caktuar rastësisht të ndërveprimeve. Në këtë lak, një numër i rastësishëm që korrespondon me personin në popullsi gjenerohet dhe vendoset në tempMatrix. Për shkak se gjatësia e secilës prej tempMatrixes është e ndryshme, na duhej të krijonim disa vlera NaN në mënyrë që të mund t'i bashkojmë të gjitha këto tempMaticies të gjitha në një matricë ('allFriendsMatrix'). Cikli i dytë while zgjidh këtë problem duke shtuar NaN në çdo tempMatrix. Cikli while ishte vendosur të ekzekutohej 9 herë sepse është një numër më i madh se 5, i cili ishte kufiri i sipërm i miqve që mund t'i caktohet një personi. Vlera '9' është e ndryshueshme dhe mund/duhet të ndryshohet kur 'mostFriendsPersonCanHave' është më e madhe se 9. Tre rreshtat e fundit të kodit (duke përjashtuar fundin) shton tempMatrix në rreshtin tjetër të 'allFriendsMatrix'. Pastaj pastron tempMatrix dhe llogaritet për personin tjetër.

Dalje

Kjo është ajo që duhet të duket dalja për kalimin e parë përmes lakut for (para tre rreshtave të fundit).

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 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 NaN 16 16 6 NaN NaN NaN NaN NaN NaN NaN 3 8 17 17 14 NaN NaN NaN NaN 20 19 3 NaN NaN NaN NaN NaN NaN NaN 13 10 NaN NaN NaN NaN NaN NaN NaN NaN 2N 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 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

Tjetra, shtoni këto marrëdhënie në adjMatrix.

për secilën Rresht = 1: NUMOFPEOPLE

për çdoCol = 1: 9 nëse isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; fund fund fund

Shpjegimi i Kodit

Ky lak i dyfishtë për lak kalon nëpër çdo rresht dhe kolonë të 'allFriendsMatrix'. Deklarata if do të funksionojë për të gjitha vlerat që nuk janë 'NaN'. Në thelb do të krijojë skajet ose linjat e grafikut. Pra, vija e parë që do të bëjë është personi 1 në person 16 dhe personi 16 person 1. Për shkak se nuk është i drejtuar, 1 duhet të ndryshohet për të dy! Ne nuk mund të kemi vetëm skajin 1 deri në 16 dhe jo 16 me 1. Ato duhet të jenë simetrike që të funksionojë siç duhet në Matlab.

Në simulimin tonë, ne vërtetuam se njerëzit nuk mund të ndërveprojnë me veten e tyre. Kur kemi randomizuar vlerat, ka një shans që matrica jonë ngjitur të ketë këto gabime.

Le ta rregullojmë këtë me kodin e mëposhtëm:

për secilin = 1: NUMOFOPOLE

adjMatrix (secila, secila) = 0; fund

Shpjegimi i Kodit

Ky për lak siguron që personi 1 nuk është i lidhur me personin 1, personi 2 nuk është i lidhur me personin 2, etj duke i bërë të gjithë ata 0. Siç mund ta shihni më poshtë në pjesën e daljes, ne kemi diagonalen e katrorit matrica nga lart majtas poshtë poshtë djathtas janë të gjitha 0.

Dalje

Ky është adjMatrix përfundimtar për këtë simulim aktual. Kjo llogarit të gjitha linjat në grafik (Figura 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

Shih Figurën 2 për të parë grafikun e 'adjMatrix'.

Hapi 3: Shtoni Statistikat e Sëmundjeve

Tani që programi juaj mund të krijojë një grafik me një grup njerëzish të rastit dhe të krijojë marrëdhënie të rastësishme, ne duhet të futim informacionin ose statistikat e sëmundjes për të parë se si këto ndërveprime brenda një popullate mund të rrisin ose ulin infeksionin.

Krijoni këto ndryshore:

unvacc %lloji: dyfish; për qind mundësi që njerëzit e pavaksinuar të mos sëmuren

% %e vaksinës: dyfish; për qind shans që njerëzit e vaksinuar të mos e marrin sëmundjen unvacc_perc %lloji: dyfish; përqind e popullsisë e pavaksinuar init_infect %lloji: int; përqind e popullsisë të vaksinuar

Tjetra duhet të bëjmë disa llogaritje.

Ne do të bëjmë një 'infeksionMat' i cili është një matricë 3*NUMOPOOPLE.

vac_perc = 1-unvacc_perc;

infeksionMat = nan (3, NUMOPOOPLE); numër = i rrumbullakët (vaksina_perc * NUMOFPEOPLE); infeksionMat (1, 1: numri) = vaksinë; infeksionMat (1, numri+1: fund) = unvacc; infeksionMat (2, 1: fund) = 0; infeksionMat (2, 1: init_infect) = 1;

Shpjegimi i Kodit

rreshti 1: Përqindja e popullsisë e pavaksinuar e llogaritur

rreshti 2: krijoni një matricë 3*N të njerëzve

rreshti 3: zbuloni numrin e njerëzve të vaksinuar nga përqindja e vaksinuar

rreshti 4: për njerëzit e vaksinuar, jepuni atyre një imunitet që lidhet me vaksinimin. Kjo vlerë është caktuar bazuar në hulumtimet në lidhje me sëmundjen.

rreshti 5: për pjesën tjetër të popullsisë (persona të pavaksinuar), jepini atyre përqindjen e imunitetit. Kjo vlerë është caktuar bazuar në hulumtimet në lidhje me sëmundjen.

rreshti 6: fillimisht vendosni që të gjithë njerëzit të mos infektohen.

rreshti 7: për numrin e njerëzve të infektuar fillimisht, plotësoni kolonat e para çift në përputhje me rrethanat.

Tani që kemi vendosur të gjithë parametrat për simulimin e sëmundjes, do të rastësisim mundësinë nëse personi (i vaksinuar dhe i pavaksinuar) infektohet. Kjo bëhet në hapin tjetër duke caktuar vlera të rastësishme midis 0 dhe 1 për secilin person në rreshtin e tretë të këtij 'infeksioni Mat'.

Hapi 4: Randomizoni mundësinë që një person i vaksinuar dhe i pavaksinuar të infektohet

Tjetra, caktoni secilit person një numër të rastësishëm, ky do të përdoret më vonë për të përcaktuar nëse personi infektohet apo jo.

për w = 1: gjatësi (infeksionMat)

infeksionMat (3, w) = rand; fund

Shpjegimi i kodit

Kjo për ciklin merret me rreshtin e tretë të 'infeksionMat' të krijuar në hapin e fundit. 'rand' i jep një vlerë midis 0 dhe 1 secilit indeks të rreshtit 3.

Dalje

infeksionMat tani është kompletuar! Kjo ishte me një popullsi me 100% vaksinim dhe 1 person i infektuar fillimisht.

infeksionMat =

Kolona 1 deri 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.0869 0,5489 0,3177 0,9927 0,7236 0,5721 0,7172 0,9766 0,4270 0,9130 0.8973 0,8352 kolona 13 deri ne 20 0,7500 0,7500 0,7500 0,7500 0,7500 0.7500 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

rreshti 1: Përqindja e shanseve për të MOS marrë këtë sëmundje

rreshti 2: I infektuar ose jo i infektuar (vlera boolean)

rreshti 3: Numri i përdorur për të kontrolluar nëse personi që nuk është i infektuar infektohet nëse takon një person të infektuar. Nëse personi i pa infektuar takon personin e infektuar, ky numër është më i madh se numri në rreshtin 1 (për të njëjtën kolonë), atëherë ata janë të infektuar. Ne do ta kodojmë këtë funksionalitet në hapin 7.

Hapi 5: Krijoni matrica të njerëzve që janë të pavaksinuar dhe të infektuar nga informacioni fillestar

Krijoni 2 matrica të quajtura "matrixUnvacc" dhe "matrixInfected" që ruan të gjithë njerëzit e infektuar nga infeksioniMat. Kjo do të përdoret në mënyrë që të mund të kodojmë me ngjyra grafikun e atyre që janë të infektuar, të pavaksinuar ose të vaksinuar, duke ndihmuar në përfytyrimin e ndikimit të individëve të pavaksinuar kundrejt atyre të vaksinuar.

pastroni secilën

matrixInfektuar = ; matrixUnvacc = ; për h = 1: gjatësi (infeksionMat) nëse infeksionMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; fundi përfundimtar për personin = 1: NUMOPOPLE nëse infeksionMat (2, person) == 1 matricëInfektuar = [matrixInfektuar, person]; fund fund

Shpjegimi i Kodit

Krijoni dy matrica boshe për të ruajtur numrat e njerëzve që janë të pavaksinuar dhe të infektuar, respektivisht. Të dyja për sythe ekzekutohen 20 herë dhe nëse deklarata if është e kënaqur, atëherë numri i shtohet matricës së saktë.

Dalje

matrixUnvacc =

matricëI infektuar =

[1]

Hapi 6: Grafiku fillestar i komplotit

Grafiku fillestar i komplotit
Grafiku fillestar i komplotit

Tjetra ne do të vizatojmë matricën e afërsisë.

g = grafik (adjMatrix);

figura (1) p = grafiku (g, 'NodeColor', 'b', 'MarkerSize', 7); nxjerr në pah (p, matrixUnvacc, 'NodeColor', 'g') nxjerr në pah (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; titulli (['Përqindja e njerëzve të pavaksinuar:', num2str (titulli_unvacc), '%']); pauzë (shpejtësia)

Shpjegimi i kodit

Teoria e grafikut në Matlab ka ndërtuar funksione. Kur përdorim funksionin grafik (), ne jemi në gjendje të përkthejmë 'adjMatrix' në një grafik aktual të padrejtuar. Atëherë duhet të krijojmë një komplot duke përdorur funksionin plot () për të parë në të vërtetë se si duket. Ne e vendosim këtë komplot () në një ndryshore në mënyrë që të mund të manipulojmë dhe ndryshojmë ngjyrat e komplotit më lehtë gjatë gjithë simulimit. Të gjithë njerëzit (ose nyjet) janë vendosur fillimisht në ngjyrën "blu". Tjetra, të gjithë njerëzit e pavaksinuar vendosen në ngjyrën "jeshile". Njerëzit e infektuar më pas vendosen në ngjyrën "e kuqe". Titulli është vendosur sipas vlerës së caktuar të përqindjes së personave të pavaksinuar që testohen. Funksioni pause () ndalon përkohësisht ekzekutimin e MatLab. Kalojmë nëpër shpejtësinë e ndryshueshme e cila përhapet e cila llogaritet në sekonda.

Shikoni foton (lart) për të parë një grafik të koduar me ngjyra të rastësishme.

Mësoni më shumë rreth funksionit të theksuar () në MatLab.

Hapi 7: Simuloni përparimin e infeksionit

Tjetra ne duhet të kuptojmë se kush infektohet pas ndërveprimeve (të regjistruara në adjMatrix) dhe të azhurnojmë grafikun kur dikush infektohet.

Përdorni adjMatrix për të përcaktuar se cilët njerëz janë të infektuar pas ndërveprimit të tyre me njerëzit në një ditë.

për secilën Rresht = 1: gjatësi (adjMatrix)

nëse infeksionMat (2, secila Rresht) == 1 për secilinCol = 1: gjatësi (adjMatrix) nëse adjMatrix (eachRow, eachCol) == 1 % secila Rresht = personi % eachCol = shoku i saj % shoku i secilit person dhe shikoni nëse janë infektuar Me nëse infeksionMat (3, secilaCol)> infeksionMat (1, secilaCol) infeksionMat (2, secilaCol) = 1; nxjerr në pah (p, çdoCol, 'NodeColor', 'r') pauzë (shpejtësi) fund fund fund fund fund fund

Lakrat për lak përmes secilit person. Ai kontrollon që nëse personi është i infektuar, ai do të kontrollojë secilin nga njerëzit/shokët me të cilët kanë ndërvepruar dhe kontrollon nëse niveli i imunitetit të mikut ishte më i madh se forca e sëmundjes. Këtu hyn në lojë "infeksioni Mat" që krijuam më herët. Rreshti i parë dhe i tretë i secilës kolonë të shokut krahasohen dhe nëse rreshti i tretë është më i madh, do të thotë që shoku nuk kishte një imunitet mjaft të lartë për t'i shpëtuar sëmundjes dhe përfundimisht infektohet. Ne gjithashtu ndryshojmë në ngjyrë duke përdorur highlight () në të kuqe nëse infektohen.

Tani kodi juaj për simulimin duhet të funksionojë! dhe për çdo madhësi të popullsisë, thjesht ndryshoni NUMOFOOPLE!

Hapi 8: Përdorni Teorinë e Monte Karlos

Për ta bërë këtë një hap më tej dhe për të nxjerrë të dhëna nga imituesi ynë ('infeksionSim.m'), ne donim të llogaritnim dhe grafikon trendin në përqindjen e njerëzve të pavaksinuar që u infektuan dhe përqindjen e njerëzve të vaksinuar që u infektuan. Ne supozojmë se përqindja e njerëzve të vaksinuar që u infektuan duhet të jetë shumë më e ulët se përqindja e njerëzve të pavaksinuar që u infektuan.

Hapi 9: Bëni Skedarin ('infeksionSim.m') Me Simulimin në një Funksion

Për të drejtuar Monte Carlo, ne do të donim të ekzekutonim simulimin disa herë dhe të grumbullonim të dhëna në mënyrë që ta përdorim atë për të grafikuar përqindjet e njerëzve që u infektuan.

Funksioni mund të vendoset kështu:

dalja e funksionit = infeksioni Sim (unvacc, vac, NUMOFPEOPLE, unvacc_perc, init_infect, shpejtësia)

Komentoni variablat në simulimin tuaj pasi tani po i kaloni këto në skedarin kryesor (ne do të fillojmë ta shkruajmë këtë në hapin 12):

unvacc, vac, NUMOFPEOPLE, unvacc_perc, init_infect

Variabli i ri

shpejtësia

do të caktohet në skedarin kryesor (Monte_Carlo.m).

Shënim: Mos harroni fundin në fund të skedarit të funksionit për të përfunduar funksionin!

Hapi 10: Llogaritni përqindjen e njerëzve të pavaksinuar dhe të vaksinuar që u infektuan

Kjo llogarit përqindjen e njerëzve të pavaksinuar që u infektuan. Ky kod shkon në fund të skedarit 'infeksionSim.m'.

numri_i_unvacc = 0;

numri_i_infec_unvacc = 0; %llogarit përqindjen e njerëzve të pavaksinuar që u infektuan për x = 1: gjatësi (infeksionMat) nëse infeksionMat (1, x) == unvacc number_of_unvacc = number_of_unvacc+1; mbaron nëse infeksionMat (1, x) == unvacc & fundi përfundimi përqindja_ e_unvacc_d_infec = (numri_i_infec_unvacc / numri_of_unvacc)*100;

Shpjegimi i kodit

Në lakin for, ai do të lakojë mbi NUMOFPEOPLE herë. Sa herë që numri në infeksionMat i përgjigjet numrit të pavaksinuar (dmth 0.95 == 0.95), atëherë numri i njerëzve të pavaksinuar do të rritet me 1. Çdo herë që numri në infeksionMat i përgjigjet numrit të pavaksinuar dhe ata janë të infektuar, numri i të infektuarve dhe të pavaksinuarve rritet me 1. Linja e fundit ndan numrin e personave të infektuar, të pavaksinuar me numrin e përgjithshëm të njerëzve të pavaksinuar. Pastaj përqindja llogaritet nga kjo.

Sfida:

Mundohuni të llogaritni përqindjen e vaksinuar të njerëzve që u infektuan! (Këshillë: është shumë e ngjashme me këtë kod të mësipërm, megjithatë disa nga ndryshoret ndryshohen dhe emrat përshtaten.)

Më pas llogaritet përqindja e njerëzve të infektuar në bazë të popullsisë së përgjithshme:

pre_per_infect = cumsum (infeksioni Mat (2,:));

per_infekt = = (para_per_infekt (1, NUMOFPEOPLE)/NUMOFPEOPLE)*100;

Shpjegimi i kodit

Shuma kumulative llogaritet duke përdorur rreshtin e dytë të infeksionit Mat, i cili ruan 1 dhe 0 në varësi të faktit nëse personi është i infektuar apo jo. Meqenëse funksioni cumsum () jep një matricë, ne marrim vlerën e fundit në matricë ('pre_per_infect (1, NUMOFPEOPLE)', e cila duhet të jetë shuma aktuale e të gjitha vlerave nga 'infeksionMat (2,:)'. Duke e ndarë shumën me NUMOFOPOPLE dhe duke e shumëzuar me 100, marrim përqindjen përfundimtare të të infektuarve në popullsinë e përgjithshme.

Hapi 11: Krijoni një ndryshore dalëse në funksionin tuaj 'infeksionSim.m'

dalja = [për_infekt, përqindje_in_vacc_d_infec, përqindje_v_vacc_d_infec];

Shpjegimi i kodit

Ruani këtë informacion në dalje, i cili do të dërgohet përsëri në kryesore (Monte_Carlo.m) kur të thirret dhe të përfundojë funksioni. Këto të dhëna përdoren për të grafikuar pikat e përqindjes së të infektuarve të atyre që janë të vaksinuar dhe të pavaksinuar.

Funksioni juaj "infeksionSim.m" duhet të bëhet tani! Sidoqoftë, nuk do të funksionojë sepse ne ende duhet të shkruajmë kryesore!

Hapi 12: Krijoni një meny për të marrë kushtet fillestare të simulimit nga përdoruesi

Mos harroni se si e thamë ndryshoren

shpejtësia

do të krijohej dhe kalohej përmes funksionit kryesor? Duhet të marrim vlerat për t'i kaluar funksionit. Shënim, rendi i vlerave kur thërret funksionin ka rëndësi!

Filloni duke i kërkuar përdoruesit të shkruajë disa përgjigje në terminal.

> Zgjidh një sëmundje. Vini re se është i ndjeshëm ndaj shkronjave të mëdha >> Pertusis >> Gripi >> Fruthi >> Sëmundje të Zgjedhura: Gripi >> Zgjedh madhësinë e popullsisë. >> 20 >> 200 >> Popullsia e zgjedhur: 20 >> Zgjidh shpejtësinë e simulimit. >> I shpejtë >> I ngadalshëm >> Shpejtësia e zgjedhur: E shpejtë

Ky kod më poshtë pyet përdoruesin se në cilën sëmundje duan të shikojnë.

disp ("Zgjidh një sëmundje. Vini re se është e ndjeshme ndaj shkronjave të mëdha")

fprintf ('Pertussis / nFlu / n Fruthi / n') sëmundje = input ('Sëmundja e zgjedhur:', 's'); nëse është i barabartë (sëmundja, 'Pertussis') vaksina =.85; %15 për qind shanse për të marrë sëmundje unvacc =.20; %80 për qind shanse për të marrë sëmundje në të kundërtën është e barabartë (sëmundje, 'Gripi') vaksinë =.75; %25 për qind shanse për të marrë sëmundje unvacc =.31; %69 për qind shanse për të marrë sëmundje në të kundërtën (sëmundje, 'Fruthi') vaksina =.97; %3 për qind shanse për të marrë sëmundje unvacc =.10; %90 për qind shanse për t’i dhënë fund sëmundjes

Shpjegimi i kodit:

Funksioni disp () printon deklaratën në ekran dhe gjithashtu printon opsionet e ndryshme. Sëmundja do të caktohet në përputhje me rrethanat. Ky version aktualisht nuk llogarit hyrje të pavlefshme. Hyrja e pavlefshme do të prodhojë një gabim dhe do të ndalojë programin plotësisht. Çdo sëmundje ka vlera vaksine dhe unvacc që lidhen me të. Këto vlera NUK janë të rastësishme. Ne i kemi marrë këto vlera nga hulumtimi i statistikave në lidhje me sëmundjet.

Tjetra, ne duhet të pyesim përdoruesin nëse dëshiron të testojë një madhësi të madhe apo të vogël të popullsisë për sëmundjen e tyre të zgjedhur.

disp ('Zgjedh madhësinë e popullsisë.')

fprintf ('20 / n200 / n ') shpejtësia = hyrja (' Popullsia e zgjedhur: ',' s '); nëse është e barabartë (shpejtësia, '20') madhësia e popullsisë = 20; elseif është e pabarabartë (shpejtësia, '200') madhësia e popullsisë = 200; fund

Shpjegimi i kodit

Kjo printon një deklaratë për përdoruesin dhe i kërkon përdoruesit të shkruajë se çfarë madhësie të popullsisë dëshiron të testojë. Ky version aktualisht nuk llogarit hyrje të pavlefshme. Hyrja e pavlefshme do të prodhojë një gabim dhe do të ndalojë programin plotësisht. 20 u zgjodh sepse është një madhësi e vogël e mostrës që ende jep një ide të mirë se si përhapet infeksioni në një popullsi të vogël. 200 persona u zgjodhën si opsioni më i madh sepse 200 pikë të vizatuara në grafik nuk kishin pothuajse asnjë mbivendosje të pikave, kështu që gjithçka mund të shihej dhe dallohej lehtësisht nga njëra -tjetra.

Tjetra, ne duhet të gjejmë shpejtësinë e simulimit.

disp ('Zgjedh shpejtësinë e simulimit.')

fprintf ('Fast / nSlow / n') shpejtësia = hyrja ('Shpejtësia e zgjedhur:', 's'); nëse është e barabartë (shpejtësia, 'e shpejtë') sim_speed = 0; elseif është i pabarabartë (shpejtësia, 'Ngadalë') sim_speed = 0.25; fund

Shpjegimi i kodit

Ky proces ishte i njëjtë me marrjen e llojit të sëmundjes dhe madhësisë së popullsisë. Për shpejtësi, nuk do të ketë pauzë. dhe për ngadalë, do të ketë një vonesë prej 0.25 sekondash në lakun for gjatë ekzekutimit të simulimit.

Shkëlqyeshëm! Tani kemi të gjitha hyrjet nga përdoruesi që na duhen! Le të kalojmë në mbledhjen e të dhënave për përqindje të ndryshme të njerëzve të pavaksinuar.

Hapi 13: Zgjidhni një % të njerëzve të pavaksinuar dhe llogaritni mesataren e të pavaksinuarve dhe të infektuarve në përqindje të zgjedhur

Ky kod është për 0% të njerëzve të pavaksinuar.

% ------- % 0 Pa vaksinuar ------------

per_infekt_av_0 = ; përqindja_ e_unvacc_and_infec_av_0 = ; për i = 1:20 jashtë = infeksionSim (unvacc, vaksinë, madhësia e popullsisë, 0, 1, shpejtësia sim_); per_infekt_av_0 = [per_infekt_av_0, jashtë (1, 1)]; përqindja_ e_unvacc_and_infec_av_0 = [përqindja_ e_unvacc_and_infec_av_0, jashtë (1, 2)]; fundi mesatar_infektuar_0 = mesatarja (për_infekt_av_0); mesatare_unvacc_dhe_infektuar_0 = mesatarja (përqindja_ e_unvacc_ dhe_infec_av_0);

Shpjegimi i kodit:

Cikli for ekzekutohet 20 herë. Dalja nga funksioni, infeksionSim (), ruhet jashtë. Sa herë që qarku for shkon, atëherë përqindja e të infektuarve në popullsinë e përgjithshme shtohet në matricë, 'per_infect_av_0'. Për më tepër, përqindja e të pavaksinuarve dhe të infektuarve shtohet gjithashtu çdo herë në matricën 'përqindja_ e_unvacc_d_infec_av_0'. Në dy rreshtat e fundit, këto dy matrica të lartpërmendura më pas mesatarizohen dhe ruhen në variabla. Për ta përmbledhur, përqindjet ruhen për secilin simulim, mesatarizohen dhe grafikohen. Monte Carlo përdoret për të treguar vlerën mesatare të drejtimit të një simulimi dhe shfaqjes së rezultatit. Për qëllimet tona eksperimentale, ne zgjedhim të ekzekutojmë simulimin 20 herë dhe të mesatarizojmë ato vlera.

Sfida:

Përsëriteni për të gjitha përqindjet që dëshironi të provoni! Kjo mund të bëhet duke ndryshuar emrat e ndryshoreve sipas numrave të përqindjes. Ne testuam për 0%, 5%, 10%, 20%, 30%dhe 50%.

Këshillë:

Linja e vetme që duhet të ndryshohet në kodin aktual është

jashtë = infeksioni Sim (unvacc, vaksina, madhësia e popullsisë, 0, 1, shpejtësia sim_);

Ndryshoni zero në përqindje në formë dhjetore. Për shembull, për 5% simulim të pavaksinuar, 0 duhet të zëvendësohet me 0.5.

Hapi 14: Grafiku: 'Trendi i Infeksionit në të Pavaksinuar Vs. Vaksinuar për sëmundje të specifikuara '

Ky është kodi për të bërë një grafik të trendit të infeksionit tek personat e pavaksinuar kundrejt personave të pavaksinuar.

grafik_mat_y = [mesatarisht_infektuar_0, mesatarisht_infektuar_5, mesatarisht_infektuar_10, mesatarisht_infektuar_20, mesatarisht_infektuar_30, mesatarisht_infektuar_50];

grafik_mat_x = [0, 5, 10, 20, 30, 50]; pjerrësia = (mesatarja_infektuar_5-mesatarja_infektuar_0)/5; line_y = [mesatarisht_infektuar_0, (pjerrësia*50)+mesatarisht_infektuar_0]; line_x = [0, 50]; figura (2) komploti (grafik_mat_x, graf_mat_y); rresht (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); titulli (['Trendi në mosvaksinimin për', sëmundje]); xlabel ('Përqindja e pavaksinuar fillestare'); ylabel ("Përqindja e të infektuarve përfundimtarë")

Shpjegimi i kodit

rreshti 1: caktohen vlerat y në mesataret e përqindjes së infektuar

rreshti 2: caktohen vlerat x në përqindjen e përqindjes fillestare të pavaksinuar

rreshti 3: llogarisni pjerrësinë prej 0% dhe 5%

rreshti 4: ruani vlerat y të rreshtit. Kjo është një vazhdim i seksionit 0% deri në 5%.

rreshti 5: ruani vlerat y të rreshtit. Kjo linjë përfshin gjatësinë e grafikut.

rreshti 6: krijoni figurën

rreshti 7: vizatoni vlerat e grafikut x dhe y të përqindjes së infektuar, të cilët janë të pavaksinuar.

rreshti 8: vizatoni vijën. Kjo përdoret për të treguar se nuk rritet në mënyrë lineare, por në mënyrë eksponenciale.

rreshti 9: Vendosni titullin për grafikun.

rreshti 10-11: Vendosni etiketat x dhe y për grafikun.

Tani duhet të jeni në gjendje të shihni që përqindja më e madhe e popullsisë e pavaksinuar, sasi më të mëdha të infeksionit. Ju gjithashtu do të shihni se shumica e pikave që bëhen të kuqe janë pika jeshile, duke treguar se vaksina ndihmon në një farë mase! Shpresoj se ju ka pëlqyer ky mësim. Komentoni nëse keni ndonjë pyetje!

Hapi 15: Produkti Final: Si duket Simulimi

I gjithë kodi mund të gjendet këtu

Recommended: