Satura rādītājs:
- 1. darbība. Izveidojiet blakus esošo matricu
- 2. solis: izveidojiet attiecības
- 3. darbība: pievienojiet slimību statistiku
- 4. solis. Izlasiet iespēju, ka vakcinēta un nevakcinēta persona var inficēties
- 5. solis: izveidojiet matricas cilvēkiem, kuri nav vakcinēti un inficēti no sākotnējās informācijas
- 6. darbība: uzzīmējiet sākotnējo grafiku
- 7. darbība. Simulējiet infekcijas progresēšanu
- 8. darbība: izmantojiet Montekarlo teoriju
- 9. solis: izveidojiet failu (“infekcijaSim.m”), izmantojot simulāciju
- 10. solis: aprēķiniet inficēto nevakcinēto un vakcinēto cilvēku procentuālo daļu
- 11. darbība. Izveidojiet izvades mainīgo savā funkcijā “infekcijaSim.m”
- 12. darbība: izveidojiet izvēlni, lai no lietotāja iegūtu sākotnējos simulācijas nosacījumus
- 13. solis: izvēlieties % nevakcinēto cilvēku un aprēķiniet nevakcinēto un inficēto vidējo procentuālo daļu
- 14. solis. Diagramma: “Infekcijas tendence nevakcinētajās Vs. Vakcinēts pret noteiktu slimību”
- 15. darbība. Galaprodukts: simulācijas izskats
Video: Vai vakcinēties vai nē? projekts par ganāmpulka imunitātes novērošanu, izmantojot slimības simulāciju: 15 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:57
Projekta pārskats:
Mūsu projekts pēta ganāmpulka imunitāti un cer iedrošināt cilvēkus vakcinēties, lai samazinātu infekciju skaitu mūsu kopienās. Mūsu programma simulē to, kā slimība inficē iedzīvotājus ar dažādiem procentiem vakcinēto un nevakcinēto. Tas parāda ganāmpulka imunitāti, parādot, kā palielināts vakcinēto populāciju skaits var samazināt skarto cilvēku skaitu.
Mēs to modelējam Matlab, izmantojot grafu teorijas koncepcijas. Grafiku teorija ir matemātisks veids, kā attēlot attiecības starp objektiem. Grafu teorijā grafiem ir virsotnes (vai mezgli), kas savienotas ar malām (vai līnijām). Mūsu projektam mezgli ir attiecīgās personas, un malas ir to savienojumi. Piemēram, ja divi mezgli ir savienoti ar malu, tas nozīmē, ka viņi ir “draugi” vai ir savstarpēji saistīti. Šis kontakts ir slimības izplatīšanās veids. Tāpēc mēs izmantojām grafu teoriju, lai modelētu savu koncepciju, jo vēlējāmies redzēt, kā slimība izplatās starp indivīdiem, kas ir saistīti populācijā.
Mūsu projekts ietver arī Montekarlo metodi. Montekarlo metode ir algoritmi, kas izveido atkārtotu izlases veida paraugu ņemšanu, lai saņemtu skaitliskus rezultātus. Mūsu projektā mēs izmantojam šo metodi, lai vairākas reizes veiktu simulāciju, mainot sākotnēji nevakcinēto procentuālo daļu, lai redzētu cilvēku inficēšanās ātrumu.
Viss projekta kods ir saistīts apakšā!
Datora kredīts:
Matlab saite uz grafiku teoriju:
1. darbība. Izveidojiet blakus esošo matricu
Izveidojiet jaunu skriptu. Mēs mūs sauksim par "infekcijuSim.m".
Mēs izveidosim mainīgo “NUMOFPEOPLE”. To var piešķirt jebkurai vesela skaitļa vērtībai. Tas atspoguļos cilvēku skaitu jūsu populācijā.
Turpmāk mēs to pieņemsim
NUMOFPEOPLE = 20;
Vispirms sāciet, izmantojot Matlab grafu teorijas funkcijas nenovirzītam grafikam.
Ja jūs interesē uzzināt vairāk, šeit ir saite, lai uzzinātu vairāk par to.
www.mathworks.com/help/matlab/math/directed-and-undirected-graphs.html
Izveidoja blakus esošo matricu.
adjMatrix = nulles (NUMOFPEOPLE);
Tādējādi tiks izveidota kvadrātveida matrica no 0. Katra matricas rinda ir persona. Katra matricas kolonna ir persona vai draugs, ar kuru persona tiekas visas dienas garumā.
Skatiet 100. attēlu (iepriekš), lai palīdzētu vizualizēt, kā adjMatrix izskatās 20 cilvēkiem.
** No šī brīža mēs pieņemsim, ka NUMOFPEOPLE ir vienāds ar 20. **
Varat mēģināt uzzīmēt šo blakus esošo matricu. Šeit ir nedaudz vairāk informācijas par šāda veida matricu uzzīmēšanu.
Piezīme. Kā darbojas blakus esošā matrica.
Piemēram:
%, veidojot blakus esošo matricu
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] %grafiks g = grafiks (a); %, izmantojot grafu funkcijas (grafu teorijas) skaitli (1); h = diagramma (g);
Skatiet 1. attēlu (iepriekš), lai uzzinātu, kā pievienot malas blakus esošajā matricā, izmantojot kodu piezīmē.
2. solis: izveidojiet attiecības
Tagad, kad cilvēki (virsotnes vai mezgli) ir izveidoti, mums ir jāizveido attiecību tīkls (grafika līnijas vai malas). Tas simulēs to, kā cilvēki mijiedarbojas un satiek citus cilvēkus visas dienas garumā.
To var izdarīt daudzos veidos. Viens veids, kā pabeigt šo uzdevumu, ir vispirms katrai personai piešķirt nejaušu skaitli, lai noteiktu, ar cik cilvēkiem katra persona mijiedarbosies dienā.
numOfFriendsMatrix = randi ([vismazFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);
Tādējādi tiek izveidota 1 līdz 20 nejaušu veselu skaitļu matrica, kas atspoguļo mijiedarbību skaitu katrai personai dienā. Šīs matricas kolonnas būtu skaitlis, kas atbilst katrai personai. Piemēram, ja mēs piešķiram minimumfriendsPersonCanHave = 2 un mostFriendsPersonCanHave = 5, mēs iegūtu nejaušas vērtības no 2 līdz 5.
Vai jums ir problēmas ar randi ()? Terminālī ierakstiet
palīdzēt randi
Tālāk mēs izveidojam randomizētu matricu (sauktu par "allFriendsmatrix") par to, kā katra populācija ir saistīta/mijiedarbojas populācijā.
tempMatrix = ;
skaits = 0; allFriendsMatrix = ; k = 1: NUMOFPEOPLE, kamēr garums (tempMatrix) ~ = numOfFriendsMatrix (k) skaits = skaits +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (skaits) = temp; beigas skaidras katra, kamēr garums (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; end allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; skaits = 0; beigas
Padziļināts koda skaidrojums:
Vispirms mēs izveidojam tukšu pagaidu matricu, lai saglabātu katras personas draugu/mijiedarbības sarakstu. Mēs arī inicializējam skaitīšanu, kas tikai izseko, kur ievietot jauno nejaušo savienojumu tempMatrix. For cilpas darbojas 20 reizes, lai tas notiktu katrai atsevišķai iedzīvotāju grupai. Pirmā cilpa darbojas, līdz katras personas tempMatrix ir vienāda garuma nejauši piešķirtajam mijiedarbību skaitam. Šajā cilpā tiek ģenerēts nejaušs skaitlis, kas atbilst personai populācijā, un ievieto to tempMatrix. Tā kā katras tempMatrix garums ir atšķirīgs, mums bija jāizveido dažas NaN vērtības, lai visas šīs tempMaticies varētu savienot vienā matricā (“allFriendsMatrix”). Otrā cilpa atrisina šo problēmu, pievienojot NaN katrā tempMatrix. Cikla cilpa tika iestatīta 9 reizes, jo tas ir skaitlis lielāks par 5, kas bija draugu augšējā robeža, ko personai var piešķirt. Vērtība “9” ir mainīga, un to var/ir jāmaina, ja “mostFriendsPersonCanHave” ir lielāka par 9. Pēdējās trīs koda rindas (izņemot beigas) pievieno tempMatrix nākamajā “allFriendsMatrix” rindā. Tad tas notīra tempMatrix un skaita nākamo personu.
Izeja
Šādai izlaidei vajadzētu izskatīties pirmajā skrējienā, izmantojot for for (pirms pēdējām trim rindām).
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
Pēc tam pievienojiet šīs attiecības adjMatrix.
katrai rindai = 1: NUMOFPEOPLE
for eachCol = 1: 9 if isnan (allFriendsMatrix (everyRow, eachCol)) == 0 adjMatrix (everyRow, allFriendsMatrix (everyRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), everyRow) = 1; beigas beigas beigas
Koda skaidrojums
Šī dubultā cilpa iet cauri katrai rindai un kolonnai sadaļā “allFriendsMatrix”. Paziņojums if darbosies visām vērtībām, kas nav “NaN”. Būtībā tas izveidos diagrammas malas vai līnijas. Tātad pirmā rinda, ko tas padarīs, ir persona 1 personai 16 un persona 16 personai 1. Tā kā tā nav novirzīta, 1 ir jāmaina abiem! Mums nevar būt tikai malas no 1 līdz 16, nevis no 16 līdz 1. Tām jābūt simetriskām, lai Matlab pareizi darbotos.
Veicot simulāciju, mēs noskaidrojām, ka cilvēki nevar mijiedarboties ar sevi. Kad mēs randomizējām vērtības, pastāv iespēja, ka mūsu blakus esošajai matricai ir šīs kļūdas.
Labosim to ar šādu kodu:
katram = 1: NUMOFPEOPLE
adjMatrix (katrs, katrs) = 0; beigas
Koda skaidrojums
Šī cilpa nodrošina, ka persona 1 nav saistīta ar personu 1, persona 2 nav saistīta ar personu 2 utt., Padarot tos visus par 0. Kā redzat zemāk izvades sadaļā, mums ir kvadrāta diagonāle matrica no augšas pa kreisi uz leju pa labi ir visi 0.
Izeja
Šī ir pēdējā adjMatrix šai pašreizējai simulācijai. Tas veido visas grafika līnijas (2. attēls).
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
Skatiet 2. attēlu, lai redzētu “adjMatrix” grafiku.
3. darbība: pievienojiet slimību statistiku
Tagad, kad jūsu programma var izveidot grafiku ar nejaušu cilvēku kopu un izveidot nejaušas attiecības, mums jāievada slimības informācija vai statistika, lai redzētu, kā šī mijiedarbība populācijā var palielināt vai samazināt infekciju.
Izveidojiet šos mainīgos:
unvacc %tips: dubultā; procentuāla iespēja, ka nevakcinētie cilvēki nesaslimst ar šo slimību
vakcīna %tips: dubultā; procentuālā iespēja vakcinētiem cilvēkiem nesaslimt ar slimību unvacc_perc %type: double; procenti iedzīvotāju nevakcinēti init_infect %tips: int; procenti iedzīvotāju vakcinēti
Tālāk mums ir jāveic daži aprēķini.
Mēs gatavojamies izveidot “infekciju paklāju”, kas ir 3*NUMOFPEOPLE matrica.
vacc_perc = 1-unvacc_perc;
infekcijaMat = nan (3, NUMOFPEOPLE); skaitlis = apaļš (vacc_perc * NUMOFPEOPLE); infekcijaMat (1, 1: skaitlis) = vakcīna; infekcijaMat (1, skaitlis+1: beigas) = unvacc; infekcijaMat (2, 1: beigas) = 0; infekcijaMat (2, 1: init_infect) = 1;
Koda skaidrojums
1. rinda: aprēķināts nevakcinēto iedzīvotāju procents
2. rinda: izveidojiet 3*N cilvēku matricu
3. rinda: noskaidrojiet vakcinēto cilvēku skaitu no vakcinēto procentuālās daļas
4. rindiņa: vakcinētajiem cilvēkiem piešķiriet viņiem imunitāti, kas saistīta ar vakcīnas saņemšanu. Šī vērtība tiek piešķirta, pamatojoties uz pētījumiem par slimību.
5. rinda: pārējiem iedzīvotājiem (nevakcinētām personām) norādiet viņiem imunitāti procentos. Šī vērtība tiek piešķirta, pamatojoties uz pētījumiem par slimību.
6. rinda: sākotnēji iestatiet visus cilvēkus, lai tie nebūtu inficēti.
7. rinda: sākotnēji inficēto cilvēku skaitam attiecīgi aizpildiet pirmās pāris slejas.
Tagad, kad esam iestatījuši visus slimības simulācijas parametrus, mēs randomizēsim iespēju, vai persona (gan vakcinēta, gan nevakcinēta) inficējas. Tas tiek darīts nākamajā solī, piešķirot izlases vērtības no 0 līdz 1 katrai personai šīs “infekcijasMat” trešajā rindā.
4. solis. Izlasiet iespēju, ka vakcinēta un nevakcinēta persona var inficēties
Pēc tam piešķiriet katrai personai nejaušu skaitli, kas tiks izmantots vēlāk, lai noteiktu, vai persona ir inficēta vai nē.
w = 1: garums (infekcijaMat)
infekcijaMat (3, w) = rand; beigas
Koda skaidrojums
Šī cilpa attiecas uz pēdējā solī izveidotā “infekcijasMat” trešo rindu. “rand” katram 3. rindas indeksam piešķir vērtību no 0 līdz 1.
Izeja
infekcijaMat tagad ir pabeigts! Tas bija populācijā ar 100% vakcināciju un 1 persona, kas sākotnēji bija inficēta.
infekcijaMat =
1. līdz 12. aile 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.7535 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. rinda: procentuālā iespēja nesaslimt ar šo slimību
2. rinda: inficēts vai nav inficēts (Būla vērtība)
3. rinda: skaitlis, ko izmanto, lai pārbaudītu, vai persona, kas nav inficēta, inficējas, ja tiekas ar inficētu personu. Ja neinficēta persona satiekas ar inficētu personu, šis skaitlis ir lielāks par skaitli 1. rindā (tai pašai slejai), tad šī persona ir inficēta. Mēs kodēsim šo funkcionalitāti 7. darbībā.
5. solis: izveidojiet matricas cilvēkiem, kuri nav vakcinēti un inficēti no sākotnējās informācijas
Izveidojiet 2 matricas ar nosaukumu "matrixUnvacc" un "matrixInfected", kas saglabā visus inficētos cilvēkus no infekcijasMat. Tas tiks izmantots, lai mēs varētu krāsot to cilvēku grafiku, kuri ir inficēti, nevakcinēti vai vakcinēti, palīdzot vizualizēt nevakcinēto un vakcinēto personu ietekmi.
notīriet katru
matrixInfected = ; matrixUnvacc = ; h = 1: garums (infekcijaMat), ja infekcijaMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; beigu beigas personai = 1: NUMOFPEOPLE, ja infekcijaMat (2, persona) == 1 matrixInfected = [matrixInfected, persona]; beigas beigas
Koda skaidrojums
Izveidojiet divas tukšas matricas, lai saglabātu attiecīgi nevakcinēto un inficēto cilvēku skaitu. Gan cilpām, kas tiek izpildītas 20 reizes, gan, ja apgalvojums ir apmierināts, tad skaitlis tiek pievienots pareizajai matricai.
Izeja
matrixUnvacc =
matrixInfected =
[1]
6. darbība: uzzīmējiet sākotnējo grafiku
Tālāk mēs uzzīmēsim blakus esošo matricu.
g = grafiks (adjMatrix);
attēls (1) p = diagramma (g, 'NodeColor', 'b', 'MarkerSize', 7); izcelt (p, matrixUnvacc, 'NodeColor', 'g') izcelt (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Nevakcinēto cilvēku procents:', num2str (title_unvacc), '%']); pauze (ātrums)
Koda skaidrojums
Grafiku teorijā Matlab ir iebūvētas funkcijas. Izmantojot funkciju graph (), mēs varam tulkot 'adjMatrix' faktiskā nenovirzītajā grafikā. Pēc tam mums ir jāizveido sižets, izmantojot funkciju plot (), lai faktiski redzētu, kā tas izskatās. Mēs iestatījām šo diagrammu () uz mainīgo, lai simulācijas laikā varētu vieglāk manipulēt un mainīt diagrammas krāsas. Visiem cilvēkiem (vai mezgliem) sākotnēji ir iestatīta krāsa “zila”. Pēc tam visi nevakcinētie cilvēki ir nokrāsoti zaļā krāsā. Inficētie cilvēki pēc tam tiek iestatīti sarkanā krāsā. Nosaukums tiek noteikts saskaņā ar noteiktu nevakcinēto cilvēku procentuālo vērtību. Pauzes () funkcija īslaicīgi pārtrauc MatLab izpildi. Mēs ejam cauri mainīgajam ātrumam, kas tiek izkliedēts sekundēs.
Skatiet attēlu (iepriekš), lai redzētu nejaušu krāsu kodētu grafiku.
Uzziniet vairāk par izcelt () funkciju MatLab.
7. darbība. Simulējiet infekcijas progresēšanu
Tālāk mums ir jānoskaidro, kurš inficējas pēc mijiedarbības (ierakstīts adjMatrix), un jāatjaunina diagramma, kad kāds inficējas.
Izmantojiet adjMatrix, lai noteiktu, kuri cilvēki ir inficēti pēc mijiedarbības ar cilvēkiem vienas dienas laikā.
katrai rindai = 1: garums (adjMatrix)
ja infekcijaMat (2, katraRinda) == 1 katramCol = 1: garums (adjMatrix), ja adjMatrix (everyRow, eachCol) == 1 % eachRow = persona % everyCol = tā draugs % katra cilvēka draugs un pārbaudiet, vai viņi ir inficēti. ja infekcijaMat (3, katrsCol)> infekcijaMat (1, katrsCol) infekcijaMat (2, katrsCol) = 1; izcelt (p, eachCol, 'NodeColor', 'r') pauze (ātrums) beigas beigas beigas beigas beigas
For cilpa cilpas caur katru personu. Tā pārbauda, vai, ja persona ir inficēta, tā pārbaudīs katru cilvēku/draugu, ar kuru viņš mijiedarbojās, un pārbaudīja, vai drauga imunitātes līmenis ir lielāks par slimības smagumu. Šeit sāk darboties mūsu radītais “infekciju paklājiņš”. Katra drauga kolonnas 1. un 3. rinda tiek salīdzināta, un, ja 3. rinda ir lielāka, tas nozīmē, ka draugam nebija pietiekami augsta imunitāte, lai izvairītos no slimības un galu galā inficētos. Mēs arī mainām krāsu, izmantojot izgaismojumu () uz sarkanu, ja viņi inficējas.
Tagad jūsu simulācijas kodam vajadzētu darboties! un jebkuram iedzīvotāju skaitam vienkārši mainiet NUMOFPEOPLE!
8. darbība: izmantojiet Montekarlo teoriju
Lai spertu vēl vienu soli tālāk un iegūtu datus no mūsu simulatora ('infekcijaSim.m'), mēs vēlējāmies aprēķināt un grafiski attēlot tendenci procentos no nevakcinētiem cilvēkiem, kuri inficējušies, un procentuāli no vakcinētajiem, kuri inficējušies. Mēs izvirzām hipotēzi, ka inficēto vakcinēto cilvēku procentuālajai daļai vajadzētu būt daudz zemākai nekā nevakcinēto cilvēku procentuālajai daļai.
9. solis: izveidojiet failu (“infekcijaSim.m”), izmantojot simulāciju
Lai palaistu Montekarlo, mēs vēlamies simulāciju izpildīt vairākas reizes un uzkrāt datus, lai mēs varētu to izmantot, lai grafiski attēlotu inficēto cilvēku procentus.
Funkciju var iestatīt šādi:
funkcijas izvade = infekcijaSim (unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, speed)
Komentējiet simulācijas mainīgos, jo tagad jūs tos ievadāt caur galveno failu (mēs to sāksim rakstīt 12. darbībā):
unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect
Jaunais mainīgais
ātrums
tiks piešķirts galvenajā failā (Monte_Carlo.m).
Piezīme: lai aizvērtu funkciju, neaizmirstiet beigas funkciju faila apakšā!
10. solis: aprēķiniet inficēto nevakcinēto un vakcinēto cilvēku procentuālo daļu
Tas aprēķina nevakcinēto cilvēku procentuālo daļu, kas inficējušies. Šis kods atrodas faila "infekcijaSim.m" apakšā.
skaits_navkacc = 0;
number_of_infec_unvacc = 0; %aprēķina to nevakcinēto cilvēku procentuālo daļu, kuri inficējušies x = 1: garums (infekcijaMat), ja infekcijaMat (1, x) == unvacc number_of_unvacc = number_of_unvacc+1; beigas, ja infekcijaMat (1, x) == unvacc & infekcijaMat (2, x) == 1 skaits_infec_unvacc = skaits_infec_unvacc +1; beigu beigu procentuālā daļa_unvacc_and_infec = (skaits_of_infec_unvacc / number_of_unvacc)*100;
Koda skaidrojums
Ciklā for, tas atkārtosies vairāk nekā NUMOFPEOPLE reizes. Katru reizi, kad inficēšanās paklājā esošais skaitlis atbilst nevakcinētajam skaitlim (ti, 0,95 == 0,95), tad nevakcinēto cilvēku skaits tiks palielināts par 1. inficēto un nevakcinēto skaits palielinās par 1. Pēdējā rindā inficēto, nevakcinēto skaits tiek dalīts ar kopējo nevakcinēto skaitu. Pēc tam procentus aprēķina no tā.
Izaicinājums:
Mēģiniet aprēķināt, cik procentu vakcinēto ir inficējušies cilvēki! (Padoms: tas ir ļoti līdzīgs šim kodam, tomēr daži mainīgie tiek mainīti un nosaukumi koriģēti.)
Tālāk tiek aprēķināts inficēto cilvēku procents, pamatojoties uz kopējo iedzīvotāju skaitu:
pre_per_infect = cumsum (infekcijaMat (2,:));
per_infect = (pre_per_infect (1, NUMOFPEOPLE)/NUMOFPEOPLE)*100;
Koda skaidrojums
Kumulatīvā summa tiek aprēķināta, izmantojot infekcijas rindas otro rindu, kurā tiek glabāti 1 un 0, atkarībā no tā, vai persona ir inficēta vai nē. Tā kā funkcija cumsum () atdod matricu, mēs ņemam pēdējo matricas vērtību ('pre_per_infect (1, NUMOFPEOPLE)'), kurai vajadzētu būt faktiskajai visu 'infekcijuMat (2,:)' vērtību summai. Sadalot summu ar NUMOFPEOPLE un reizinot to ar 100, mēs iegūstam galīgo inficēto procentuālo daļu kopējā populācijā.
11. darbība. Izveidojiet izvades mainīgo savā funkcijā “infekcijaSim.m”
izvade = [per_infect, procent_of_unvacc_and_infec, percent_of_vacc_and_infec];
Koda skaidrojums
Saglabājiet šo informāciju izvadē, kas tiks nosūtīta atpakaļ uz galveno (Monte_Carlo.m), kad funkcija tiks izsaukta un pabeigta. Šos datus izmanto, lai grafiski attēlotu procentus no inficētajiem, kuri ir vakcinēti un nevakcinēti.
Funkcija "infekcijaSim.m" ir jāizdara tūlīt! Tomēr tas nedarbosies, jo mums joprojām ir jāraksta galvenais!
12. darbība: izveidojiet izvēlni, lai no lietotāja iegūtu sākotnējos simulācijas nosacījumus
Atcerieties, kā mēs teicām mainīgo
ātrums
tiktu izveidota un izieta caur galveno funkciju? Mums ir jāiegūst vērtības, kas jānodod funkcijai. Ņemiet vērā, ka vērtību secībai, izsaucot funkciju, ir nozīme!
Sāciet, lūdzot lietotājam ievadīt dažas atbildes terminālī.
> Izvēlieties slimību. Ņemiet vērā, ka ir reģistrjutīgs >> garais klepus >> gripa >> masalas >> Izvēlētā slimība: gripa >> Izvēlieties populācijas lielumu. >> 20 >> 200 >> Izvēlētā populācija: 20 >> Izvēlieties simulācijas ātrumu. >> Ātrs >> Lēns >> Ātrums izvēlēts: Ātrs
Šis kods zemāk jautā lietotājam, kādu slimību viņš vēlas izpētīt.
disp ("Izvēlieties slimību. Ņemiet vērā, ka tas ir reģistrjutīgs")
fprintf ('Pertussis / nGripas / nMasalu maskas / n') slimība = ievade ('Izvēlētā slimība:', 's'); ja isequal (slimība, "garā klepus") vakc =.85; %15 procentu iespēja saslimt ar slimību unvacc =.20; 80 %iespēja saslimt ar slimību, ja vienāda (slimība, "gripa") vakcīna = 0,75; %25 procentu iespēja saslimt ar slimību unvacc =.31; %69 procenti iespēju saslimt ar slimību, ja nav vienādas (slimības, masalu) vakcīnas = 0,97; %3 procentu iespēja saslimt ar slimību unvacc =.10; 90 %iespēja saslimt ar slimību
Koda skaidrojums:
Funkcija disp () izdrukā paziņojumu uz ekrāna, kā arī izdrukā dažādas iespējas. Slimība tiks piešķirta atbilstoši. Šajā versijā pašlaik netiek ņemta vērā nederīga ievade. Nepareiza ievade radīs kļūdu un pilnībā apturēs programmu. Katrai slimībai ir vakcīnas un vakcīnas vērtības. Šīs vērtības NAV nejaušas. Šīs vērtības mēs ieguvām, pētot statistiku par slimībām.
Tālāk mums jājautā lietotājam, vai viņš vēlas pārbaudīt lielu vai mazu populācijas lielumu attiecībā uz izvēlēto slimību.
disp ("Izvēlieties populācijas lielumu.")
fprintf ('20 / n200 / n ') ātrums = ievade (' Populācija izvēlēta: ',' s '); ja isequal (ātrums, '20') populācijas_izmērs = 20; elseif isequal (ātrums, '200') populācijas_izmērs = 200; beigas
Koda skaidrojums
Tādējādi lietotājam tiek izdrukāts paziņojums un lietotājam tiek lūgts ievadīt, kādu iedzīvotāju skaitu tas vēlas pārbaudīt. Šajā versijā pašlaik netiek ņemta vērā nederīga ievade. Nepareiza ievade radīs kļūdu un pilnībā apturēs programmu. 20 tika izvēlēti, jo tas ir mazs izlases lielums, kas joprojām sniedz labu priekšstatu par to, kā infekcija izplatās nelielā populācijā. 200 cilvēki tika izvēlēti kā lielākā iespēja, jo grafikā attēlotajos 200 punktos gandrīz nebija punktu pārklāšanās, tāpēc visu varēja viegli redzēt un atšķirt viens no otra.
Tālāk mums jāatrod simulācijas ātrums.
disp ('Izvēlieties simulācijas ātrumu.')
fprintf ('Ātrs / nLēns / n') ātrums = ievade ('Izvēlētais ātrums:', 's'); ja isequal (ātrums, 'Ātrs') sim_speed = 0; elseif isequal (ātrums, 'Lēns') sim_speed = 0.25; beigas
Koda skaidrojums
Šis process bija tāds pats kā slimības veida un iedzīvotāju skaita iegūšana. Par gavēni, nebūs pauzes. un lēnam, palaižot simulāciju, cilpā for būs 0,25 sekunžu nobīde.
Lieliski! Tagad mums ir visas nepieciešamās ievades no lietotāja! Pārejam pie datu vākšanas par dažādiem nevakcinēto cilvēku procentiem.
13. solis: izvēlieties % nevakcinēto cilvēku un aprēķiniet nevakcinēto un inficēto vidējo procentuālo daļu
Šis kods ir paredzēts 0% nevakcinētiem cilvēkiem.
% ------- % 0 Nevakcinēts ------------
per_infect_av_0 = ; procentuāli_nevacc_and_infec_av_0 = ; i = 1:20 ārā = infekcijaSim (unvacc, vakc, populācijas_izmērs, 0, 1, sim_speed); 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)]; beigu vidējais_inficētais_0 = vidējais (per_infect_av_0); vidēji_unvacc_and_infected_0 = vidējais (procenti_nvakacc_and_infec_av_0);
Koda skaidrojums:
For cilpa tiek palaista 20 reizes. Funkcijas infekcijaSim () izvade tiek saglabāta ārā. Katru reizi, kad darbojas cilpa for, matricai “per_infect_av_0” tiek pievienots inficēto procentuālais īpatsvars kopējā populācijā. Turklāt nevakcinēto un inficēto procentuālā daļa katru reizi tiek pievienota matricai “percent_of_unvacc_and_infec_av_0”. Pēdējās divās rindās šīs divas iepriekš minētās matricas tiek vidēji aprēķinātas un saglabātas mainīgajos. Apkopojot, procenti tiek saglabāti katrai simulācijai, aprēķināti vidēji un attēloti. Montekarlo tiek izmantots, lai parādītu simulācijas vidējo vērtību un parādītu rezultātu. Mūsu eksperimentālajiem nolūkiem mēs izvēlamies simulāciju izpildīt 20 reizes un aprēķināt šīs vērtības.
Izaicinājums:
Atkārtojiet visus procentus, kurus vēlaties pārbaudīt! To var izdarīt, mainot mainīgo nosaukumus atbilstoši procentuālajiem skaitļiem. Mēs pārbaudījām 0%, 5%, 10%, 20%, 30%un 50%.
Padoms:
Vienīgā rinda, kas jāmaina faktiskajā kodā, ir
out = infekcijaSim (unvacc, vakc, populācijas_izmērs, 0, 1, sim_speed);
Nomainiet nulli uz procentiem decimālā formā. Piemēram, lai veiktu 5% nevakcinētu simulāciju, 0 jāaizstāj ar 0,5.
14. solis. Diagramma: “Infekcijas tendence nevakcinētajās Vs. Vakcinēts pret noteiktu slimību”
Šis ir kods, lai izveidotu grafiku par inficēšanās tendenci nevakcinētiem un nevakcinētiem.
graph_mat_y = [vidēji_inficēti_0, vidēji_inficēti_5, vidēji_inficēti_10, vidēji_inficēti_20, vidēji_inficēti_30, vidēji_inficēti_50];
grafiks_mat_x = [0, 5, 10, 20, 30, 50]; slīpums = (vidēji_inficēts_5-vidēji_inficēts_0)/5; line_y = [vidēji_inficēts_0, (slīpums*50)+vidēji_inficēts_0]; line_x = [0, 50]; skaitlis (2) diagramma (graph_mat_x, graph_mat_y); līnija (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); nosaukums (['Tendence nevakcinēties', slimība]); xlabel ('sākotnēji nevakcinēto procentuālā daļa'); ylabel (“Galīgi inficēto procents”)
Koda skaidrojums
1. rinda: piešķirtas y vērtības vidējiem inficētajiem procentiem
2. rinda: piešķirtas x vērtības sākotnēji nevakcinēto procentuālajai daļai
3. rinda: aprēķiniet 0% un 5% slīpumu
4. rinda: saglabājiet rindas y vērtības. Tas ir turpinājums sadaļai no 0% līdz 5%.
5. rinda: saglabājiet rindas y vērtības. Šī līnija aptver grafika garumu.
6. rinda: izveidojiet figūru
7. rinda: uzzīmējiet grafiku x un y vērtības procentiem inficēto, kuri nav vakcinēti.
8. rinda: uzzīmējiet līniju. To izmanto, lai parādītu, ka tas nepalielinās lineāri, bet eksponenciāli.
9. rinda: iestatiet diagrammas nosaukumu.
10-11. rinda: iestatiet grafikam x un y etiķetes.
Tagad jums vajadzētu redzēt, ka lielāks procents iedzīvotāju ir nevakcinēti, jo lielāks ir infekcijas daudzums. Jūs arī redzēsit, ka lielākā daļa punktu, kas kļūst sarkani, ir zaļi punkti, kas parāda, ka vakcīna zināmā mērā palīdz! Ceru, ka jums patika šī apmācība. Komentējiet, ja jums ir kādi jautājumi!
15. darbība. Galaprodukts: simulācijas izskats
Visu kodu var atrast šeit
Ieteicams:
Pārnēsājama Parkinsona slimības tehnika: 4 soļi
Pārnēsājama Parkinsona slimības tehnika: vairāk nekā 10 miljoni cilvēku visā pasaulē dzīvo ar Parkinsona slimību (PD). Progresējoši nervu sistēmas traucējumi, kas izraisa stīvumu un ietekmē pacienta kustību. Vienkāršāk sakot, daudzi cilvēki cieta no Parkinsona slimības, bet
MicroPython programma: atjauniniet koronavīrusa slimības (COVID-19) datus reālā laikā: 10 soļi (ar attēliem)
MicroPython programma: atjauniniet koronavīrusa slimības (COVID-19) datus reālā laikā: pēdējo nedēļu laikā apstiprināto koronavīrusa slimību (COVID 19) gadījumu skaits pasaulē ir pārsniedzis 100 000, un Pasaules veselības organizācija (PVO) ir paziņojusi, ka jauns koronavīrusa pneimonijas uzliesmojums ir globāla pandēmija. Es biju ļoti
Kā noteikt augu slimības, izmantojot mašīnmācīšanos: 6 soļi
Kā noteikt augu slimības, izmantojot mašīnmācīšanos: Slimo augu atklāšanas un atpazīšanas process vienmēr ir bijis manuāls un garlaicīgs process, kas prasa cilvēkiem vizuāli pārbaudīt augu ķermeni, kas bieži var novest pie nepareizas diagnozes. Ir arī prognozēts, ka globālā mērogā
Darba sākšana ar ESP32 CAM - Video straumēšana, izmantojot ESP CAM, izmantojot Wifi - ESP32 drošības kameru projekts: 8 soļi
Darba sākšana ar ESP32 CAM | Video straumēšana, izmantojot ESP CAM, izmantojot Wifi | ESP32 drošības kameru projekts: Šodien mēs uzzināsim, kā izmantot šo jauno ESP32 CAM plati un kā mēs varam to kodēt un izmantot kā drošības kameru un iegūt straumēšanas video, izmantojot WiFi
Atskaņojiet dziesmas, izmantojot Arduino, izmantojot ADC līdz PWM, izmantojot Flyback transformatoru vai skaļruni: 4 soļi
Atskaņot dziesmas ar Arduino, izmantojot ADC, lai PWM Flyback transformatorā vai skaļrunī: Sveiki, puiši, šī ir mana cita pamācības otrā daļa (tas bija daudz grūti). Būtībā šajā projektā esmu izmantojis ADC un taimeri savā Arduino, lai pārvērst audio signālu par PWM signālu. Tas ir daudz vieglāk nekā mana iepriekšējā instrukcija