Turinys:

Pasiskiepyti ar ne? projektas bandos imuniteto stebėjimas per ligos modeliavimą: 15 žingsnių
Pasiskiepyti ar ne? projektas bandos imuniteto stebėjimas per ligos modeliavimą: 15 žingsnių

Video: Pasiskiepyti ar ne? projektas bandos imuniteto stebėjimas per ligos modeliavimą: 15 žingsnių

Video: Pasiskiepyti ar ne? projektas bandos imuniteto stebėjimas per ligos modeliavimą: 15 žingsnių
Video: Biologija. COVID-19 vakcinos 2024, Liepa
Anonim
Pasiskiepyti ar ne? projektas dėl bandos imuniteto stebėjimo per ligos modeliavimą
Pasiskiepyti ar ne? projektas dėl bandos imuniteto stebėjimo per ligos modeliavimą

Projekto apžvalga:

Mūsų projektas tiria bandos imunitetą ir tikisi paskatinti žmones skiepytis, kad sumažėtų infekcijų skaičius mūsų bendruomenėse. Mūsų programa imituoja, kaip liga užkrečia gyventojus, turinčius skirtingą procentą skiepytų ir neskiepytų atvejų. Jis parodo bandos imunitetą, parodydamas, kaip padidėjęs skiepytų gyventojų skaičius gali sumažinti paveiktų žmonių skaičių.

Mes tai modeliuojame „Matlab“naudodami grafų teorijos sąvokas. Grafikų teorija yra matematinis būdas parodyti ryšius tarp objektų. Grafų teorijoje grafikai turi viršūnes (arba mazgus), sujungtas kraštais (arba linijomis). Mūsų projektui mazgai yra susiję asmenys, o kraštai - jų jungtys. Pavyzdžiui, jei du mazgai yra sujungti kraštu, tai reiškia, kad jie yra „draugai“arba turi tam tikrą kontaktą. Šis kontaktas yra ligos plitimo būdas. Štai kodėl mes panaudojome grafikų teoriją, kad modeliuotume savo koncepciją, nes norėjome pamatyti, kaip liga plinta tarp žmonių, susijusių su populiacija.

Mūsų projektas taip pat apima Monte Karlo metodą. Monte Karlo metodas yra algoritmai, kurie sukuria pakartotinę atsitiktinę atranką, kad gautų skaitinius rezultatus. Savo projekte mes naudojame šį metodą, kad kelis kartus atliktume savo modeliavimą, keisdami pradinių nevakcinuotų procentą, kad pamatytume žmonių užsikrėtimo greitį.

Visas projekto kodas yra susietas apačioje!

Kompiuterio kreditas:

„Matlab“nuoroda į grafikų teoriją:

1 žingsnis: sukurkite gretimumo matricą

Sukurkite gretimumo matricą
Sukurkite gretimumo matricą
Sukurkite gretimumo matricą
Sukurkite gretimumo matricą

Sukurkite naują scenarijų. Mes vadinsime savo „infekcijaSim.m“.

Mes sukursime kintamąjį „NUMOFPEOPLE“. Jį galite priskirti bet kuriai sveiko skaičiaus vertei. Tai parodys žmonių skaičių jūsų populiacijoje.

Nuo šiol mes manysime, kad

NUMOFPEOPLE = 20;

Pirmiausia naudokite „Matlab“grafų teorijos funkcijas nukreiptam grafikui.

Jei jus domina sužinoti daugiau, čia yra nuoroda, kurioje galite išsamiau apie tai perskaityti.

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

Sukūrė gretimumo matricą.

adjMatrix = nuliai (NUMOFPEOPLE);

Taip bus sukurta kvadratinė 0 matrica. Kiekviena matricos eilutė yra asmuo. Kiekvienas matricos stulpelis yra asmuo ar draugas, su kuriuo asmuo susitinka visą dieną.

Žiūrėkite 100 paveikslą (aukščiau), kad padėtumėte įsivaizduoti, kaip „adjMatrix“atrodo 20 žmonių.

** Nuo tada mes manysime, kad NUMOFPEOPLE yra lygus 20. **

Galite pabandyti nubrėžti šią gretimumo matricą. Čia yra šiek tiek daugiau informacijos apie šių tipų matricų braižymą.

Pastaba: kaip veikia gretimumo matrica.

Pvz.:

%sudaro gretimą matricą

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] %brėžinys g = grafikas (a); %naudojant grafiko funkciją (grafų teorija) figūra (1); h = grafikas (g);

Žiūrėkite 1 paveikslą (aukščiau), kad sužinotumėte, kaip pridėti kraštus gretutinėje matricoje, naudojant kodą „Pastaboje“.

2 žingsnis: kurkite santykius

Sukurkite santykius
Sukurkite santykius

Dabar, kai žmonės (viršūnės ar mazgai) yra sukurti, turime sukurti santykių tinklą (grafiko linijas ar kraštus). Tai imituos, kaip žmonės bendrauja ir susitinka su kitais žmonėmis visą dieną.

Tai galima padaryti įvairiais būdais. Vienas iš būdų atlikti šią užduotį - pirmiausia kiekvienam asmeniui priskirti atsitiktinį skaičių, kad būtų galima nustatyti, su kiek žmonių per dieną bendraus.

numOfFriendsMatrix = randi ([mažiausiaiFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);

Tai sudaro 1–20 atsitiktinių sveikųjų skaičių matricą, atspindinčią kiekvieno žmogaus sąveikos skaičių per dieną. Šios matricos stulpeliai būtų skaičius, atitinkantis kiekvieną asmenį. Pavyzdžiui, jei priskiriame mažiausiaiFriendsPersonCanHave = 2 ir mostFriendsPersonCanHave = 5, mes gautume atsitiktines vertes nuo 2 iki 5.

Turite problemų su randi ()? Terminale įveskite

padėk randi

Tada mes sudarome atsitiktinės atrankos matricą (vadinamą „allFriendsmatrix“), kaip kiekvienas populiacijos asmuo yra susijęs/sąveikauja su populiacija.

tempMatrix = ;

skaičius = 0; allFriendsMatrix = ; k = 1: NUMOFPEOPLE, o ilgis (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (skaičius) = temp; galas aiškus kiekvienas, o ilgis (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; pabaiga allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; skaičius = 0; galas

Išsamus kodo paaiškinimas:

Pirmiausia sukuriame tuščią laikiną matricą kiekvieno žmogaus draugų/sąveikos sąrašui laikyti. Mes taip pat inicijuojame skaičiavimą, kuris tiesiog stebi, kur įklijuoti naują atsitiktinį ryšį „tempMatrix“. „For“ciklai vykdomi 20 kartų, todėl tai atsitinka kiekvienam populiacijos asmeniui. Pirmasis ciklas vyksta tol, kol kiekvieno žmogaus „tempMatrix“yra tokio paties ilgio atsitiktinai priskirto sąveikų skaičiaus. Šioje cikle sugeneruojamas atsitiktinis skaičius, atitinkantis populiaciją, ir įdedamas į „tempMatrix“. Kadangi kiekvienos „tempMatrix“ilgis yra skirtingas, mums reikėjo sukurti kai kurias NaN reikšmes, kad galėtume visas šias „tempMaticies“sujungti į vieną matricą („allFriendsMatrix“). Antroji ciklas išsprendžia šią problemą pridedant NaN į kiekvieną „tempMatrix“. Nors ciklas buvo nustatytas 9 kartus, nes jis yra didesnis nei 5, o tai yra viršutinė draugų, kuriuos galima priskirti asmeniui, riba. Reikšmė „9“yra kintama ir gali būti/turi būti pakeista, kai „mostFriendsPersonCanHave“yra didesnė nei 9. Paskutinės trys kodo eilutės (išskyrus pabaigą) prideda tempMatrix į kitą „allFriendsMatrix“eilutę. Tada jis pašalina „tempMatrix“ir skaičiuoja kitą asmenį.

Išvestis

Štai kaip išvestis turėtų atrodyti pirmą kartą vykdant ciklą for (prieš paskutines tris eilutes).

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 1 7 NaN NaN NaN NaN NaN NaN NaN 16 7 13 10 1 NaN NaN NaN NaN

Tada pridėkite šiuos ryšius prie „adjMatrix“.

kiekvienai eilutei = 1: NUMOFPEOPLE

for eachCol = 1: 9 if isnan (allFriendsMatrix (everyRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; galas galas galas

Kodo paaiškinimas

Šis dvigubas ciklas eina per kiekvieną „allFriendsMatrix“eilutę ir stulpelį. Jei teiginys bus paleistas visoms reikšmėms, kurios nėra „NaN“. Iš esmės tai sukurs grafiko kraštus ar linijas. Taigi pirmoji eilutė yra asmuo 1 asmeniui 16 ir asmuo 16 asmeniui 1. Kadangi ji nėra nukreipta, 1 turi būti pakeista abiem! Mes negalime turėti tik krašto nuo 1 iki 16, o ne nuo 16 iki 1. Jie turi būti simetriški, kad jis tinkamai veiktų „Matlab“.

Imituodami mes nustatėme, kad žmonės negali bendrauti su savimi. Kai atsitiktinai suskirstėme reikšmes, yra tikimybė, kad mūsų gretimoje matricoje yra šios klaidos.

Ištaisykime tai naudodami šį kodą:

kiekvienam = 1: NUMOFPEOPLE

adjMatrix (kiekvienas, kiekvienas) = 0; galas

Kodo paaiškinimas

Tai ciklui užtikrina, kad asmuo 1 nebūtų prijungtas prie 1 asmens, asmuo 2 nebūtų prijungtas prie 2 asmens ir tt, padarius juos visus 0. Kaip matote žemiau išvesties skyriuje, turime kvadrato įstrižainę matrica iš viršaus į kairę į apačią į dešinę yra visi 0.

Išvestis

Tai yra paskutinė šio dabartinio modeliavimo „adjMatrix“. Tai sudaro visas grafiko eilutes (2 pav.).

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

Žiūrėkite 2 paveikslą, kad pamatytumėte „adjMatrix“grafiką.

3 žingsnis: pridėkite ligų statistiką

Dabar, kai jūsų programa gali sukurti grafiką su atsitiktinių žmonių rinkiniu ir sukurti atsitiktinius ryšius, turime įvesti ligos informaciją ar statistiką, kad pamatytume, kaip ši sąveika populiacijoje gali padidinti ar sumažinti infekciją.

Sukurkite šiuos kintamuosius:

unvacc %tipas: dvigubas; procentų tikimybė, kad neskiepyti žmonės nesusirgs šia liga

vakcina %tipas: dvigubas; tikimybė, kad paskiepyti žmonės nesusirgs liga unvacc_perc %type: double; procentas gyventojų neskiepytas init_infect %tipas: int; procentų gyventojų buvo paskiepyti

Toliau turime atlikti tam tikrus skaičiavimus.

Mes ketiname sukurti „infekcijos matą“, kuris yra 3*NUMOFPEOPLE matrica.

vacc_perc = 1-unvacc_perc;

infekcijaMat = nan (3, NUMOFPEOPLE); skaičius = apvalus (vacc_perc * NUMOFPEOPLE); infekcijaMat (1, 1: skaičius) = vakcina; infekcijaMat (1, skaičius+1: pabaiga) = unvacc; infekcijaMat (2, 1: pabaiga) = 0; infekcijaMat (2, 1: init_infect) = 1;

Kodo paaiškinimas

1 eilutė: apskaičiuotas nevakcinuotų gyventojų procentas

2 eilutė: sukurkite 3*N žmonių matricą

3 eilutė: sužinokite skiepytų žmonių skaičių iš skiepytų procentų

4 eilutė: skiepytiems žmonėms suteikite jiems imunitetą, susijusį su vakcinos skiepijimu. Ši vertė priskiriama remiantis ligos tyrimais.

5 eilutė: likusiems gyventojams (neskiepytiems asmenims) suteikite jiems imunitetą procentais. Ši vertė priskiriama remiantis ligos tyrimais.

6 eilutė: iš pradžių nustatykite, kad visi žmonės nebūtų užsikrėtę.

7 eilutė: pagal iš pradžių užsikrėtusių žmonių skaičių atitinkamai užpildykite pirmąsias poras.

Dabar, kai nustatėme visus ligos modeliavimo parametrus, atsitiktinai nustatysime galimybę, ar asmuo (tiek skiepytas, tiek neskiepytas) užsikrės. Tai daroma kitame žingsnyje, kiekvienam asmeniui, esančiam trečioje šios „infekcijos mato“eilutėje, priskiriant atsitiktines reikšmes nuo 0 iki 1.

4 žingsnis: atsitiktinai nustatykite tikimybę, kad skiepytas ir neskiepytas asmuo gali užsikrėsti

Tada kiekvienam asmeniui priskirkite atsitiktinį skaičių, kuris vėliau bus naudojamas nustatyti, ar asmuo užsikrečia, ar ne.

w = 1: ilgis (infekcijaMat)

infekcijaMat (3, w) = randas; galas

Kodo paaiškinimas

Šis ciklas susijęs su trečiąja „infekcijaMat“eilute, sukurta paskutiniame žingsnyje. „rand“kiekvienai 3 eilutės rodyklei priskiria reikšmę nuo 0 iki 1.

Išvestis

infekcija dabar baigta! Tai buvo 100% skiepytų gyventojų ir 1 asmuo, kuris iš pradžių buvo užsikrėtęs.

infekcijaMat =

1–12 stulpeliai 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 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

1 eilutė: procentinė tikimybė nesirgti liga

2 eilutė: užsikrėtę arba neužkrėsti (loginė vertė)

3 eilutė: skaičius, naudojamas patikrinti, ar neužsikrėtęs asmuo užsikrečia, jei susitinka su užsikrėtusiu asmeniu. Jei neužsikrėtęs asmuo susitinka su užsikrėtusiu asmeniu, šis skaičius yra didesnis nei skaičius 1 eilutėje (tame pačiame stulpelyje), tada jis yra užkrėstas. Šią funkciją koduosime atlikdami 7 veiksmą.

5 veiksmas: sukurkite neskiepytų ir užsikrėtusių žmonių matricas iš pirminės informacijos

Sukurkite 2 matricas, vadinamas „matrixUnvacc“ir „matrixInfected“, kuriose saugomi visi užsikrėtę žmonės nuo infekcijos. Tai bus panaudota tam, kad galėtume spalvotu koduoti užkrėstų, neskiepytų ar skiepytų asmenų grafiką, padėdami įsivaizduoti nevakcinuotų ir skiepytų asmenų poveikį.

išvalyti kiekvieną

matrixInfected = ; matrixUnvacc = ; h = 1: ilgis (infekcijaMat), jei infekcijaMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; pabaiga asmeniui = 1: NUMOFPEOPLE, jei infekcijaMat (2, asmuo) == 1 matrixInfected = [matrixInfected, asmuo]; pabaiga galas

Kodo paaiškinimas

Sukurkite dvi tuščias matricas, kad išsaugotumėte atitinkamai neskiepytų ir užsikrėtusių žmonių skaičių. Tiek kilpoms, kurios vykdomos 20 kartų, ir jei teiginys tenkinamas, skaičius pridedamas prie teisingos matricos.

Išvestis

matrixUnvacc =

matrixInfected =

[1]

6 žingsnis: Nubraižykite pradinę diagramą

Nubraižykite pradinę diagramą
Nubraižykite pradinę diagramą

Toliau nubraižysime gretimumo matricą.

g = grafikas (adjMatrix);

1 pav. p = grafikas (g, „NodeColor“, „b“, „MarkerSize“, 7); paryškinti (p, matrixUnvacc, 'NodeColor', 'g') paryškinti (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Nevakcinuotų žmonių procentas:', num2str (title_unvacc), '%']); pauzė (greitis)

Kodo paaiškinimas

Grafikų teorija „Matlab“turi integruotas funkcijas. Kai naudojame funkciją graph (), galime „adjMatrix“išversti į faktinį nesukreiptą grafiką. Tada mes turime sukurti sklypą naudodami plot () funkciją, kad iš tikrųjų pamatytume, kaip jis atrodo. Mes nustatome šį grafiką () į kintamąjį, kad simuliacijos metu galėtume lengviau manipuliuoti ir pakeisti sklypo spalvas. Visi žmonės (arba mazgai) iš pradžių yra nustatyti mėlynos spalvos. Be to, visi neskiepyti žmonės yra nudažyti žalia spalva. Tada užsikrėtę žmonės įgauna raudoną spalvą. Pavadinimas nustatomas pagal tam tikrą procentą neskiepytų žmonių, kurie yra tiriami. Pauzės () funkcija laikinai sustabdo „MatLab“vykdymą. Mes einame per kintamą greitį, kuris yra paskirstomas, kuris apskaičiuojamas sekundėmis.

Žiūrėkite paveikslėlį (viršuje), kad pamatytumėte atsitiktinį spalvų kodą.

Sužinokite daugiau apie „MatLab“funkciją „highlight“().

7 žingsnis: imituokite infekcijos progresavimą

Toliau turime išsiaiškinti, kas užsikrečia po sąveikos (įrašyta „adjMatrix“) ir atnaujinti grafiką, kai kas nors užsikrečia.

Naudokite „adjMatrix“, kad nustatytumėte, kurie žmonės yra užkrėsti po bendravimo su žmonėmis per dieną.

kiekvienai eilutei = 1: ilgis (adjMatrix)

if infekcijaMat (2, kiekviena eilutė) == 1 kiekvienamCol = 1: ilgis (adjMatrix), jei adjMatrix (eachRow, everyCol) == 1 % eachRow = asmuo % everyCol = jo draugas % kiekvieno žmogaus draugas ir pažiūrėkite, ar jie yra užsikrėtę. jei infekcijaMat (3, kiekvienasCol)> infekcijaMat (1, kiekvienasCol) infekcijaMat (2, kiekvienasCol) = 1; paryškinti (p, eachCol, 'NodeColor', 'r') pause (speed) end end end end end end

For kilpa kilpoja per kiekvieną asmenį. Ji tikrina, kad jei asmuo yra užsikrėtęs, jis patikrins kiekvieną iš žmonių/draugų, su kuriais bendravo, ir patikrino, ar draugo imuniteto lygis buvo didesnis už ligos stiprumą. Čia atsiranda anksčiau sukurtas „infekcijos matas“. Kiekvieno draugo stulpelio 1 ir 3 eilutės yra lyginamos ir jei 3 eilutė yra didesnė, tai reiškia, kad draugas neturėjo pakankamai aukšto imuniteto, kad galėtų išvengti ligos ir galiausiai užsikrėstų. Mes taip pat keičiame spalvą, naudodami paryškinimą () į raudoną, jei jie užsikrečia.

Dabar jūsų simuliacijos kodas turėtų veikti! ir bet kokio dydžio gyventojams, tiesiog pakeiskite NUMOFPEOPLE!

8 žingsnis: naudokite Monte Karlo teoriją

Norėdami žengti dar vieną žingsnį ir išgauti duomenis iš mūsų simuliatoriaus („infekcijaSim.m“), norėjome apskaičiuoti ir grafikuoti neskiepytų žmonių, kurie užsikrėtė, procentą ir užsikrėtusių žmonių procentinę tendenciją. Mes manome, kad užsikrėtusių žmonių procentas turėtų būti daug mažesnis nei neskiepytų žmonių.

9 veiksmas: sukurkite failą („infekcijaSim.m“), imituodami funkciją

Norėdami paleisti Monte Karlą, mes norėtume paleisti modeliavimą kelis kartus ir kaupti duomenis, kad galėtume tai panaudoti užkrėstų žmonių procentiniam skaičiui grafikuoti.

Funkciją galima nustatyti taip:

funkcijos išvestis = infekcijaSim (unvacc, vakc, NUMOFPEOPLE, unvacc_perc, init_infect, speed)

Komentuokite savo modeliavimo kintamuosius, nes dabar juos perduodate per pagrindinį failą (mes pradėsime tai rašyti 12 veiksme):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

Naujas kintamasis

greitį

bus priskirtas pagrindiniame faile (Monte_Carlo.m).

Pastaba: nepamirškite pabaigos failo apačioje, kad baigtumėte funkciją!

10 veiksmas: apskaičiuokite neskiepytų ir skiepytų žmonių, užsikrėtusių, procentą

Taip apskaičiuojamas procentas neskiepytų žmonių, užsikrėtusių. Šis kodas yra failo „infekcijaSim.m“apačioje.

nesupakuotų skaičių_0;

skaičius_infec_unvacc = 0; %apskaičiuoja procentą neskiepytų žmonių, kurie užsikrėtė x = 1: ilgis (infekcijaMat), jei infekcijaMat (1, x) == unvacc number_of_unvacc = number_of_unvacc+1; pasibaigti, jei infekcija pabaigos pabaiga procentais_unvacc_ ir_infec = (skaičius_infec_unvacc / number_of_unvacc)*100;

Kodo paaiškinimas

„For“cikle jis suksis daugiau nei NUMOFPEOPLE kartų. Kiekvieną kartą, kai infekcijos „Mat“skaičius atitinka neskiepytų skaičių (ty 0,95 == 0,95), tada neskiepytų žmonių skaičius bus padidintas 1 kartą. užsikrėtusių ir neskiepytų žmonių skaičius padidėja 1. Paskutinė eilutė padalija užkrėstų, neskiepytų žmonių skaičių iš viso neskiepytų žmonių. Tada procentas apskaičiuojamas pagal tai.

Iššūkis:

Pabandykite apskaičiuoti užsikrėtusių žmonių procentą! (Patarimas: jis labai panašus į šį aukščiau esantį kodą, tačiau kai kurie kintamieji keičiami ir pavadinimai koreguojami.)

Toliau apskaičiuojamas užkrėstų žmonių procentas pagal bendrą populiaciją:

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

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

Kodo paaiškinimas

Kaupiama suma apskaičiuojama naudojant antrąją infekcijos mato eilutę, kurioje saugomi 1 ir 0, priklausomai nuo to, ar asmuo yra užsikrėtęs, ar ne. Kadangi funkcija cumsum () grąžina matricą, mes imame paskutinę matricos reikšmę ('pre_per_infect (1, NUMOFPEOPLE)'), kuri turėtų būti tikroji visų „infekcijaMat (2,:)“reikšmių suma. Padalinę sumą iš NUMOFPEOPLE ir padauginę iš 100, gauname galutinį užsikrėtusiųjų procentą bendroje populiacijoje.

11 veiksmas: sukurkite išvesties kintamąjį savo funkcijoje „infekcijaSim.m“

produkcija = [per_infect, proc_of_unvacc_and_infec, percent_of_vacc_and_infec];

Kodo paaiškinimas

Išsaugokite šią informaciją išvestyje, kuri bus išsiųsta atgal į pagrindinį (Monte_Carlo.m), kai funkcija bus iškviesta ir atlikta. Šie duomenys naudojami skiepytų ir neskiepytų asmenų užsikrėtusiųjų procentinei daliai grafikuoti.

Jūsų „infekcijaSim.m“funkcija turėtų būti atlikta dabar! Tačiau jis neveiks, nes mums vis tiek reikia parašyti pagrindinį!

12 veiksmas: sukurkite meniu, kad iš vartotojo gautumėte pradines modeliavimo sąlygas

Prisiminkite, kaip mes pasakėme kintamąjį

greitį

būtų sukurta ir perduota pagrindinei funkcijai? Turime gauti vertes, kurias perduoti funkcijai. Atminkite, kad reikšmių tvarka skambinant funkcijai yra svarbi!

Pradėkite paprašydami vartotojo įvesti keletą atsakymų į terminalą.

> Pasirinkite ligą. Atkreipkite dėmesį, kad didžiosios ir mažosios raidės >> Kokliušas >> Gripas >> Tymai >> Pasirinkta liga: Gripas >> Pasirinkite populiacijos dydį. >> 20 >> 200 >> Pasirinkta populiacija: 20 >> Pasirinkite modeliavimo greitį. >> Greitas >> Lėtas >> Pasirinktas greitis: greitas

Šis toliau pateiktas kodas klausia vartotojo, kokią ligą jis nori ištirti.

disp („Pasirinkite ligą. Atkreipkite dėmesį, kad jis yra jautrus didžiosioms ir mažosioms raidėms“)

fprintf ('Kokliušas / nGripas / nTymai / n') liga = įvestis ('Pasirinkta liga:', 's'); jei isequal (liga, „kokliušas“) vakcina = 0,85; %15 procentų tikimybė susirgti liga unvacc =.20; %80 procentų tikimybė susirgti šia liga, jei nėra lygios (ligos, gripo) vakcinos = 0,75; 25 %tikimybė susirgti liga unvacc =.31; 69 proc. Tikimybė užsikrėsti šia liga, jei nėra lygios (ligos, „tymų“) vakcinos = 0,97; %3 procentų tikimybė susirgti liga unvacc =.10; 90 %tikimybė, kad liga baigsis

Kodo paaiškinimas:

Funkcija disp () išspausdina pareiškimą ekrane ir įvairias parinktis. Liga bus priskirta atitinkamai. Šioje versijoje šiuo metu neatsižvelgiama į netinkamą įvestį. Netinkama įvestis sukels klaidą ir visiškai sustabdys programą. Kiekviena liga yra susijusi su vakcina ir neapsaugotomis vertėmis. Šios vertės NĖRA atsitiktinės. Šias vertybes gavome tyrinėdami ligų statistiką.

Toliau turime paklausti vartotojo, ar jis nori išbandyti didelę ar mažą populiaciją dėl pasirinktos ligos.

disp („Pasirinkite populiacijos dydį“.)

fprintf ('20 / n200 / n ') sparta = įvestis (' Pasirinkta populiacija: ',' s '); jei isequal (greitis, '20') populiacijos_dydis = 20; elseif isequal (greitis, '200') populiacijos_dydis = 200; galas

Kodo paaiškinimas

Tai išspausdina pareiškimą vartotojui ir prašo vartotojo įvesti, kokio dydžio populiaciją jis nori išbandyti. Šioje versijoje šiuo metu neatsižvelgiama į netinkamą įvestį. Netinkama įvestis sukels klaidą ir visiškai sustabdys programą. 20 buvo paimtas, nes tai yra mažas imties dydis, kuris vis dar gerai supranta, kaip infekcija plinta mažoje populiacijoje. 200 žmonių buvo pasirinkta kaip didesnė parinktis, nes 200 grafike nubrėžtų taškų beveik nesutapo, todėl viską buvo galima lengvai pamatyti ir atskirti.

Toliau turime rasti modeliavimo greitį.

disp („Pasirinkite modeliavimo greitį“.)

fprintf ('Greitas / nLėtas / n') greitis = įvestis ('Pasirinktas greitis:', 's'); jei isequal (greitis, 'greitas') sim_speed = 0; elseif isequal (greitis, 'lėtas') sim_speed = 0,25; galas

Kodo paaiškinimas

Šis procesas buvo toks pat, kaip nustatyti ligos tipą ir gyventojų skaičių. Dėl pasninko nebus jokios pauzės. ir lėtai, vykdant modeliavimą, ciklas bus 0,25 sekundės.

Puiku! Dabar turime visus reikalingus vartotojo įvestis! Pereikime prie duomenų apie skirtingus neskiepytų žmonių procentus rinkimo.

13 veiksmas: pasirinkite % neskiepytų žmonių ir apskaičiuokite neskiepytų ir užsikrėtusiųjų vidurkį pagal pasirinktą procentą

Šis kodas skirtas 0% neskiepytų žmonių.

% ------- % 0 Neskiepytas ------------

per_infect_av_0 = ; procentas_unvacc_and_infec_av_0 = ; i = 1:20 iš = infekcija per_infect_av_0 = [per_infect_av_0, out (1, 1)]; percent_of_unvacc_and_infec_av_0 = [percent_of_unvacc_and_infec_av_0, out (1, 2)]; pabaigos vidurkis_užkrėstas_0 = vidurkis (per_infect_av_0); medium_unvacc_and_infected_0 = vidurkis (procentas_unvacc_and_infec_av_0);

Kodo paaiškinimas:

For ciklas paleidžiamas 20 kartų. Funkcijos „infekcijaSim“() išvestis saugoma išvestyje. Kiekvieną kartą, kai vykdoma „for“kilpa, užkrėstųjų procentas iš visos populiacijos pridedamas prie matricos „per_infect_av_0“. Be to, neskiepytų ir užsikrėtusiųjų procentas taip pat kiekvieną kartą pridedamas prie matricos „percent_of_unvacc_and_infec_av_0“. Paskutinėse dviejose eilutėse šios dvi aukščiau paminėtos matricos apskaičiuojamos vidutiniškai ir saugomos kintamajame. Apibendrinant galima pasakyti, kad kiekvieno modeliavimo procentai yra saugomi, apskaičiuojami vidurkiai ir nubraižomi. Monte Karlas naudojamas vidutinei simuliacijos vykdymo vertei ir rezultatui parodyti. Mūsų eksperimentiniams tikslams mes pasirenkame paleisti modeliavimą 20 kartų ir apskaičiuoti šias vertes.

Iššūkis:

Pakartokite visus procentus, kuriuos norite išbandyti! Tai galima padaryti keičiant kintamųjų pavadinimus pagal procentinius skaičius. Mes išbandėme 0%, 5%, 10%, 20%, 30%ir 50%.

Patarimas:

Vienintelė eilutė, kurią reikia pakeisti faktiniame kode, yra

out = infekcijaSim (unvacc, vakc, popul_size, 0, 1, sim_speed);

Pakeiskite nulį į procentą dešimtainiu pavidalu. Pavyzdžiui, 5% nevakcinuotam modeliavimui 0 turėtų būti pakeistas 0,5.

14 žingsnis: Diagrama: „Infekcijos tendencija nevakcinuotiems prieš Vs. Skiepyti nuo nurodytos ligos “

Tai yra kodas, kuriuo galima sudaryti neskiepytų asmenų ir neskiepytų asmenų infekcijos tendencijų grafiką.

diagrama_mat_y = [vidutinis_infekuotas_0, vidutinis_infekuotas_5, vidutinis_infekuotas_10, vidutinis_infekuotas_20, vidutinis_infekuotas_30, vidutinis_infekuotas_50];

grafikas_mat_x = [0, 5, 10, 20, 30, 50]; nuolydis = (vidutinis_infekuotas_5-vidutinis_infekuotas_0)/5; eilutė_y = [vidutinis_infekuotas_0, (nuolydis*50)+vidutinis_infekuotas_0]; linija_x = [0, 50]; figūra (2) sklypas (graph_mat_x, graph_mat_y); line (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); pavadinimas ([„Skiepijimo tendencija“, liga]); xlabel („Nevakcinuotų pirminių procentinė dalis“); ylabel („Galutinai užsikrėtusiųjų procentas“)

Kodo paaiškinimas

1 eilutė: priskiriamos y reikšmės užkrėstų procentų vidurkiams

2 eilutė: priskiriamos x reikšmės pradinio nevakcinuotų procentų procentui

3 eilutė: apskaičiuokite nuolydį 0% ir 5%

4 eilutė: išsaugokite eilutės y reikšmes. Tai yra skyriaus nuo 0% iki 5% tęsinys.

5 eilutė: išsaugokite eilutės y reikšmes. Ši eilutė apima grafiko ilgį.

6 eilutė: sukurkite figūrą

7 eilutė: nubrėžkite neskiepytų procentų užsikrėtusiųjų x ir y diagramas.

8 eilutė: nubrėžkite liniją. Tai naudojama parodyti, kad jis didėja ne tiesiškai, o eksponentiškai.

9 eilutė: nustatykite grafiko pavadinimą.

10-11 eilutė: nustatykite grafiko x ir y etiketes.

Dabar turėtumėte pamatyti, kad kuo didesnė dalis gyventojų yra neskiepyti, tuo daugiau infekcijų. Taip pat pamatysite, kad dauguma raudonų taškų yra žali, o tai rodo, kad vakcina tam tikru mastu padeda! Tikimės, kad jums patiko ši pamoka. Komentuokite, jei turite klausimų!

15 žingsnis: Galutinis produktas: kaip atrodo modeliavimas

Visą kodą rasite čia

Rekomenduojamas: