Obsah:
- Krok 1: Vytvorte maticu priľahlosti
- Krok 2: Vytvorte si vzťahy
- Krok 3: Pridajte štatistiku chorôb
- Krok 4: Randomizujte šancu, že sa očkovaná a neočkovaná osoba môže nakaziť
- Krok 5: Vytvorte matice ľudí, ktorí sú neočkovaní a nakazení na základe počiatočných informácií
- Krok 6: Plotový počiatočný graf
- Krok 7: Simulujte priebeh infekcie
- Krok 8: Použite teóriu Monte Carlo
- Krok 9: Vytvorte súbor („infekciaSim.m“) so simuláciou vo funkcii
- Krok 10: Vypočítajte percento neočkovaných a očkovaných ľudí, ktorí sa nakazili
- Krok 11: Vytvorte výstupnú premennú vo svojej funkcii 'infekciaSim.m'
- Krok 12: Vytvorte ponuku na získanie počiatočných podmienok simulácie od používateľa
- Krok 13: Vyberte si % neočkovaných ľudí a vypočítajte priemer neočkovaných a nakazených pre zvolené percento
- Krok 14: Graf: „Trend infekcie u neočkovaných vs. Očkované proti špecifikovanej chorobe “
- Krok 15: Finálny produkt: Ako simulácia vyzerá
Video: Očkovať alebo nie? projekt na sledovanie imunity stáda prostredníctvom simulácie chorôb: 15 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 12:00
Prehľad projektu:
Náš projekt skúma imunitu stáda a dúfa, že povzbudí ľudí k očkovaniu, aby sa znížila miera infekcií v našich komunitách. Náš program simuluje, ako sa choroba nakazí populáciou rôznym percentom zaočkovaných a nezaočkovaných. Ukazuje imunitu stáda tým, že ukazuje, ako zvýšený počet očkovanej populácie môže znížiť počet postihnutých ľudí.
Modelujeme to v Matlabe pomocou konceptov teórie grafov. Teória grafov je matematický spôsob reprezentácie vzťahov medzi objektmi. V teórii grafov majú grafy vrcholy (alebo uzly) spojené hranami (alebo čiarami). Pre náš projekt sú uzly dotknutými osobami a hrany sú ich spojeniami. Ak sú napríklad dva uzly prepojené s hranou, znamená to, že sú „priateľmi“alebo majú nejakú formu vzájomného kontaktu. Tento kontakt je spôsob, akým sa choroba šíri. Preto sme na modelovanie nášho konceptu použili teóriu grafov, pretože sme chceli vidieť, ako sa choroba šíri medzi jednotlivcami, ktorí sú prepojení v populácii.
Náš projekt zahŕňa aj metódu Monte Carlo. Metóda Monte Carlo sú algoritmy, ktoré vytvárajú opakované náhodné vzorkovanie na získanie numerických výsledkov. V našom projekte používame túto metódu na niekoľkonásobné spustenie našej simulácie, pričom sa mení percento počiatočných neočkovaných, aby sa zistila rýchlosť, ktorou sa ľudia nakazia.
V spodnej časti je prepojený všetok kód projektu!
Kredit na počítač:
Odkaz Matlab na teóriu grafov:
Krok 1: Vytvorte maticu priľahlosti
Vytvorte nový skript. Nazveme ten náš'infekciaSim.m '.
Vytvoríme premennú 'NUMOFPEOPLE'. Môžete ho priradiť ľubovoľnej celočíselnej hodnote. To bude predstavovať počet ľudí vo vašej populácii.
Odteraz to budeme predpokladať
NUMOFPEOPLE = 20;
Najprv začnite používať funkcie teórie grafov Matlabu pre neorientovaný graf.
Ak máte záujem dozvedieť sa viac, tu je odkaz, kde si o tom môžete prečítať podrobnejšie.
www.mathworks.com/help/matlab/math/directed-and-undirected-graphs.html
Bola vytvorená matica susednosti.
adjMatrix = nuly (NUMOFPEOPLE);
Tým sa vytvorí štvorcová matica 0 s. Každý riadok v matici je osobou. Každý stĺpec v matici je osobou alebo priateľom, s ktorými sa osoba stretáva počas celého dňa.
Pozrite si obrázok 100 (vyššie), ktorý vám pomôže vizualizovať, ako adjMatrix vyzerá pre 20 ľudí.
** Od tohto bodu budeme predpokladať, že NUMOFPEOPLE sa rovná 20. **
Môžete skúsiť vykresliť túto maticu priľahlosti. Tu je trochu viac informácií o vykresľovaní týchto typov matíc.
Poznámka: Ako funguje matica susednosti.
Príklad:
%vytvorením susednej matice
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] %vykresľovania g = graf (a); %pomocou grafovej funkcie (teória grafov) obrázok (1); h = graf (g);
Na obrázku 1 (vyššie) je vidieť, ako pridať hrany do matice susednosti pomocou kódu v časti „Poznámka“.
Krok 2: Vytvorte si vzťahy
Teraz, keď sú ľudia (vrcholy alebo uzly) vytvorení, musíme vytvoriť sieť vzťahov (čiary alebo okraje grafu). To bude simulovať, ako ľudia interagujú a stretávajú sa s inými ľuďmi počas celého dňa.
To sa dá urobiť mnohými spôsobmi. Jedným zo spôsobov, ako splniť túto úlohu, je najskôr priradiť každej osobe náhodné číslo, aby sa určilo, s koľkými ľuďmi bude každý deň komunikovať.
numOfFriendsMatrix = randi ([minimumFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);
Tým sa vytvorí matica náhodných celých čísel 1 x 20 predstavujúca počet interakcií, ktoré má každá osoba za deň. Stĺpce tejto matice budú číslom zodpovedajúcim každej osobe. Ak napríklad priradíme hodnotu minimumFriendsPersonCanHave = 2 a mostFriendsPersonCanHave = 5, získame náhodné hodnoty medzi 2 a 5.
Máte problémy s randi ()? Do terminálu napíšte
pomôž randi
Ďalej vytvoríme randomizovanú maticu (nazývanú „allFriendsmatrix“) toho, ako je každá osoba v populácii prepojená/interaguje v rámci populácie.
tempMatrix = ;
počet = 0; allFriendsMatrix = ; pre k = 1: NUMOFPEOPLE pričom dĺžka (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (počet) = temp; koniec vymazať každý pričom dĺžka (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; end allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; počet = 0; koniec
Hĺbkové vysvetlenie kódu:
Najprv vytvoríme prázdnu dočasnú maticu na uloženie zoznamu priateľov/interakcií každej osoby. Tiež inicializujeme počítanie, ktoré len sleduje, kam prilepiť nové náhodné pripojenie v tempMatrix. Slučky for bežia 20 -krát, aby sa to stalo pre každú jednotlivú osobu v populácii. Prvá slučka while beží, kým tempMatrix každej osoby nemá rovnakú dĺžku náhodne priradeného počtu interakcií. V tejto slučke sa vygeneruje náhodné číslo zodpovedajúce osobe v populácii a umiestni sa do tempMatrix. Pretože dĺžky každej z tempMatrix sú rôzne, potrebovali sme vytvoriť niektoré hodnoty NaN, aby sme všetky tieto tempMaticies mohli spojiť do jednej matice („allFriendsMatrix“). Druhá slučka while tento problém rieši pridaním NaN do každej tempMatrix. Cyklus while bol nastavený na spustenie 9 -krát, pretože je to číslo väčšie ako 5, čo bola horná hranica priateľov, ktorých je možné priradiť osobe. Hodnota '9' je variabilná a môže/musí byť zmenená, ak je hodnota 'mostFriendsPersonCanHave' väčšia ako 9. Posledné tri riadky kódu (okrem konca) pridajú tempMatrix do nasledujúceho riadku 'allFriendsMatrix'. Potom sa vymaže tempMatrix a počíta sa s ďalšou osobou.
Výkon
Takto by mal vyzerať výstup pri prvom spustení slučky for (pred poslednými tromi riadkami).
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 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 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
Ďalej pridajte tieto vzťahy do adjMatrix.
for eachRow = 1: NUMOFPEOPLE
pre každú kolónu = 1: 9, ak je isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; koniec koniec koniec
Vysvetlenie kódu
Táto slučka double for prechádza všetkými riadkami a stĺpcami „allFriendsMatrix“. Príkaz if pobeží pre všetky hodnoty, ktoré nie sú „NaN“. V zásade vytvorí hrany alebo čiary grafu. Takže prvý riadok, ktorý to urobí, je osoba 1 až osoba 16 a osoba 16 až osoba 1. Pretože je to neorientované, 1 musí byť zmenená pre oboch! Nemôžeme mať len hranu 1 až 16 a nie 16 až 1. Musia byť symetrické, aby v Matlabe správne bežal.
V našej simulácii sme zistili, že ľudia so sebou nemôžu interagovať. Keď sme randomizovali hodnoty, je šanca, že naša susedná matica má tieto chyby.
Opravme to pomocou nasledujúceho kódu:
pre každú = 1: NUMOFPEOPLE
adjMatrix (každý, každý) = 0; koniec
Vysvetlenie kódu
Táto slučka for zaistí, že osoba 1 nie je prepojená s osobou 1, osoba 2 nie je spojená s osobou 2 atď. Tým, že ich všetky urobí 0. Ako vidíte nižšie v sekcii výstupu, máme uhlopriečku štvorca matica zhora zľava doprava je 0.
Výkon
Toto je posledná adjMatrix pre túto súčasnú simuláciu. To predstavuje všetky čiary v grafe (obrázok 2).
adjMatrix =
0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0
Na obrázku 2 je graf „adjMatrix“.
Krok 3: Pridajte štatistiku chorôb
Teraz, keď váš program dokáže vytvoriť graf so sadou náhodných ľudí a vytvárať náhodné vzťahy, musíme zadať informácie alebo štatistiky o chorobe, aby sme zistili, ako tieto interakcie v rámci populácie môžu zvýšiť alebo znížiť infekciu.
Vytvorte tieto premenné:
unvacc %type: double; percentná šanca, že neočkovaní ľudia nedostanú chorobu
typ vakcíny %: dvojitý; percentuálna pravdepodobnosť, že očkovaní ľudia nedostanú chorobu unvacc_perc %typ: dvojitý; percento populácie neočkované init_infect %typ: int; percento zaočkovanej populácie
Ďalej musíme urobiť niekoľko výpočtov.
Vytvoríme „infekčnú podložku“, čo je matica 3*NUMOFPEOPLE.
vacc_perc = 1-unvacc_perc;
infekciaMat = nan (3, NUMOFPEOPLE); číslo = okrúhle (vac_perc * NUMOFPEOPLE); infekciaMat (1, 1: číslo) = vakcína; infekciaMat (1, cislo+1: koniec) = unvacc; infekciaMat (2, 1: koniec) = 0; infekciaMat (2, 1: init_infect) = 1;
Vysvetlenie kódu
riadok 1: Vypočítané percento nezaočkovanej populácie
riadok 2: vytvorte maticu 3*N ľudí
3. riadok: zistite počet očkovaných osôb z očkovaného percenta
4. riadok: očkovaným ľuďom poskytnúť imunitu spojenú s očkovaním. Táto hodnota je priradená na základe výskumu o tejto chorobe.
riadok 5: pre zvyšok populácie (neočkované osoby) im dajte percento imunity. Táto hodnota je priradená na základe výskumu o tejto chorobe.
riadok 6: Na začiatku nastavte všetkých ľudí na neinfikovaných.
riadok 7: pre počet pôvodne infikovaných ľudí vyplňte zodpovedajúcim spôsobom prvých pár stĺpcov.
Teraz, keď sme nastavili všetky parametre pre simuláciu ochorenia, randomizujeme šancu, či sa osoba (očkovaná aj neočkovaná) nakazí. To sa vykoná v nasledujúcom kroku priradením náhodných hodnôt medzi 0 a 1 každej osobe v treťom riadku tejto „infekcieMat“.
Krok 4: Randomizujte šancu, že sa očkovaná a neočkovaná osoba môže nakaziť
Potom každej osobe priraďte náhodné číslo, ktoré sa neskôr použije na určenie, či sa osoba nakazí alebo nie.
pre w = 1: dĺžka (infekciaMat)
infekciaMat (3, w) = rand; koniec
Vysvetlenie kódu
Táto slučka for sa zaoberá tretím riadkom súboru 'infekciaMat' vytvoreným v poslednom kroku. „rand“priradí každému indexu v riadku 3 hodnotu medzi 0 a 1.
Výkon
infekciaMat je teraz kompletná! Jednalo sa o populáciu so 100% zaočkovanosťou a 1 osobu pôvodne infikovanú.
infekciaMat =
Stĺpce 1 až 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,8352 0,0035 0,0035 0,0035 0,00 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
riadok 1: Percentuálna pravdepodobnosť, že sa choroba NEMÁ
riadok 2: Infikovaný alebo neinfikovaný (logická hodnota)
riadok 3: Číslo používané na kontrolu, či sa infikovaná osoba neinfikuje, ak stretne infikovanú osobu. Ak sa neinfikovaná osoba stretne s infikovanou osobou, je toto číslo väčšie ako číslo v riadku 1 (pre ten istý stĺpec), potom je infikovaná. Túto funkciu kódujeme v kroku 7.
Krok 5: Vytvorte matice ľudí, ktorí sú neočkovaní a nakazení na základe počiatočných informácií
Vytvorte 2 matice s názvom „matrixUnvacc“a „matrixInfected“, ktoré uložia všetkých infikovaných ľudí z infekceMat. Toto bude slúžiť na to, aby sme mohli farebne odlíšiť graf infikovaných, neočkovaných alebo očkovaných ľudí, čo pomôže zviditeľniť vplyv nezaočkovaných a očkovaných osôb.
vymazať každého
matrixInfected = ; matrixUnvacc = ; pre h = 1: dĺžka (infekciaMat), ak infekciaMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; end end pre osobu = 1: NUMOFPEOPLE ak infekciaMat (2, osoba) == 1 matrixInfected = [matrixInfected, osoba]; koniec koniec
Vysvetlenie kódu
Vytvorte dve prázdne matice na uloženie počtu ľudí, ktorí sú neočkovaní a infikovaní. Oba cykly prebehnú 20 -krát a ak je príkaz if splnený, číslo sa pridá do správnej matice.
Výkon
matrixUnvacc =
matrixInfected =
[1]
Krok 6: Plotový počiatočný graf
Ďalej budeme vykresľovať maticu susednosti.
g = graf (adjMatrix);
obrázok (1) p = graf (g, 'NodeColor', 'b', 'MarkerSize', 7); zvýrazniť (p, matrixUnvacc, 'NodeColor', 'g') zvýrazniť (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Percento nezaočkovaných ľudí:', num2str (title_unvacc), '%']); pauza (rýchlosť)
Vysvetlenie kódu
Teória grafov v Matlabe má vstavané funkcie. Keď použijeme funkciu graph (), sme schopní preložiť 'adjMatrix' do skutočného neorientovaného grafu. Potom musíme vytvoriť diagram pomocou funkcie plot (), aby sme skutočne videli, ako vyzerá. Tento plot () sme nastavili na premennú, aby sme počas simulácie mohli jednoduchšie manipulovať a meniť farby grafu. Všetci ľudia (alebo uzly) majú na začiatku nastavenú farbu „modrú“. Ďalej sa všetkým neočkovaným ľuďom nastaví farba „zelená“. Infikovaní ľudia majú potom nastavenú farbu „červenú“. Názov je stanovený podľa určitej percentuálnej hodnoty testovaných nezaočkovaných osôb. Funkcia pause () dočasne zastaví spustenie MatLabu. Prechádzame variabilnou rýchlosťou, ktorá sa šíri a ktorá sa počíta v sekundách.
Na obrázku (hore) nájdete náhodný farebne kódovaný graf.
Získajte viac informácií o funkcii highlight () v programe MatLab.
Krok 7: Simulujte priebeh infekcie
Ďalej musíme zistiť, kto sa nakazí po interakciách (zaznamenaných v adjMatrix), a aktualizovať graf, keď sa niekto nakazí.
Pomocou adjMatrix určte, ktorí ľudia sú infikovaní po ich interakcii s ľuďmi za deň.
pre každý Riadok = 1: dĺžka (adjMatrix)
if infekciaMat (2, eachRow) == 1 pre každý kolón = 1: dĺžka (adjMatrix) ak adjMatrix (každý riadok, každý bod) == 1 % každý riadok = osoba % každý kolík = jeho priateľ % priateľ každého človeka a zistí, či sa nakazí. ifinfekciaMat (3, eachCol)> infekciaMat (1, eachCol) infekciaMat (2, eachCol) = 1; zvýrazniť (p, eachCol, 'NodeColor', 'r') pauza (rýchlosť) koniec koniec koniec koniec koniec
Cyklus for prechádza každou osobou. Kontroluje, či je osoba infikovaná, skontroluje každého z ľudí/priateľov, s ktorými komunikoval, a skontroluje, či úroveň imunity priateľa bola väčšia ako sila choroby. Tu vstupuje do hry „infekciaMat“, ktorú sme vytvorili predtým. Porovná sa 1. a 3. riadok každého stĺpca priateľa a ak je 3. riadok väčší, znamená to, že priateľ nemal dostatočne vysokú imunitu, aby unikol chorobe a nakoniec sa nakazil. Ak sa nakazia, zmeníme tiež farbu pomocou zvýraznenia () na červenú.
Teraz by váš kód pre simuláciu mal fungovať! a pre akúkoľvek veľkosť populácie stačí zmeniť NUMOFPEOPLE!
Krok 8: Použite teóriu Monte Carlo
Aby sme to urobili ešte o krok ďalej a extrahovali údaje z nášho simulátora („infekciaSim.m“), chceli sme vypočítať a vykresliť trend v percentách nezaočkovaných ľudí, ktorí sa nakazili, a v percentách očkovaných ľudí, ktorí sa nakazili. Predpokladáme, že percento očkovaných ľudí, ktorí sa nakazili, by malo byť oveľa nižšie ako percento neočkovaných ľudí, ktorí sa nakazili.
Krok 9: Vytvorte súbor („infekciaSim.m“) so simuláciou vo funkcii
Na spustenie programu Monte Carlo by sme chceli simuláciu spustiť viackrát a zhromažďovať údaje, aby sme to mohli použiť na vykreslenie percenta ľudí, ktorí sa nakazili.
Funkciu je možné nastaviť takto:
výstup funkcie = infekcia Sim (unvacc, vac, NUMOFPEOPLE, unvacc_perc, init_infect, speed)
Pomenujte premenné vo svojej simulácii, pretože ich teraz prenášate cez hlavný súbor (začneme to písať v kroku 12):
unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect
Nová premenná
rýchlosť
bude priradený v hlavnom súbore (Monte_Carlo.m).
Poznámka: Na ukončenie funkcie nezabudnite na koniec v spodnej časti súboru funkcií!
Krok 10: Vypočítajte percento neočkovaných a očkovaných ľudí, ktorí sa nakazili
Toto vypočítava percento neočkovaných ľudí, ktorí sa nakazili. Tento kód sa nachádza v spodnej časti súboru „infekciaSim.m“.
number_of_unvacc = 0;
number_of_infec_unvacc = 0; %vypočítava percento neočkovaných ľudí, ktorí sa nakazili x = 1: dĺžka (infekciaMat), ak infekciaMat (1, x) == nezverejnené číslo_na_unvacc = počet_na_unvacc+1; end ifinfekciaMat (1, x) == unvacc &infekciaMat (2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; koniec konca percento_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc)*100;
Vysvetlenie kódu
V slučke for sa zacyklí NUMOFPEOPLE -krát. Zakaždým, keď číslo v infekciiMat zodpovedá počtu neočkovaných (tj. 0,95 == 0,95), potom sa počet neočkovaných ľudí zvýši o 1. Zakaždým, keď číslo v infekciiMat zodpovedá počtu neočkovaných osôb, ktoré sú infikované, počet nakazených a neočkovaných sa zvyšuje o 1. Posledný riadok delí počet nakazených, neočkovaných osôb celkovým počtom neočkovaných osôb. Potom sa z toho vypočíta percento.
Výzva:
Skúste vypočítať percento očkovaných ľudí, ktorí sa nakazili! (Tip: Je veľmi podobný vyššie uvedenému kódu, niektoré premenné sú však zmenené a názvy sú upravené.)
Ďalej sa vypočíta percento infikovaných ľudí na základe celkovej populácie:
pre_per_infect = cumsum (infekciaMat (2,:));
per_infect = (pre_per_infect (1, NUMOFPEOPLE)/NUMOFPEOPLE)*100;
Vysvetlenie kódu
Kumulatívny súčet sa vypočíta pomocou druhého riadka infekcieMat, ktorý ukladá 1 s a 0 s v závislosti od toho, či je osoba infikovaná alebo nie. Pretože funkcia cumsum () vracia maticu, vezmeme poslednú hodnotu v matici ('pre_per_infect (1, NUMOFPEOPLE)'), ktorá by mala byť skutočným súčtom všetkých hodnôt z 'infekcieMat (2,:)'. Vydelením súčtu číslom NUMOFPEOPLE a jeho vynásobením 100 získame konečné percento infikovaných v celkovej populácii.
Krok 11: Vytvorte výstupnú premennú vo svojej funkcii 'infekciaSim.m'
výstup = [per_infect, percent_of_unvacc_and_infec, percent_of_vacc_and_infec];
Vysvetlenie kódu
Tieto informácie uložte do výstupu, ktorý bude odoslaný späť do main (Monte_Carlo.m), keď bude funkcia volaná a spustená. Tieto údaje sa používajú na vykreslenie bodov v percentách infikovaných osôb, ktoré sú očkované a neočkované.
Vaša funkcia 'infekcieSim.m' by mala byť hotová! Nebude to však bežať, pretože stále potrebujeme napísať hlavné!
Krok 12: Vytvorte ponuku na získanie počiatočných podmienok simulácie od používateľa
Pamätajte si, ako sme povedali premennú
rýchlosť
by bol vytvorený a prešiel hlavnou funkciou? Potrebujeme získať hodnoty, ktoré prejdú do funkcie. Na poradí hodnôt pri volaní funkcie záleží!
Na začiatku požiadajte používateľa, aby do terminálu zadal niekoľko odpovedí.
> Vyberte si chorobu. Všimnite si, že rozlišujú malé a veľké písmená >> čierny kašeľ >> chrípka >> osýpky >> zvolená choroba: chrípka >> vyberte veľkosť populácie. >> 20 >> 200 >> Vybraná populácia: 20 >> Vyberte rýchlosť simulácie. >> Rýchle >> Pomalé >> Zvolená rýchlosť: Rýchle
V tomto kóde sa používateľ pýta, akej chorobe sa chce venovať.
disp („Vyberte si chorobu. Všimnite si, že rozlišujú sa malé a veľké písmená“)
fprintf ('Pertussis / nFlu / nMeasles / n') choroba = vstup ('Vybraná choroba:', 's'); ak je rovnaká (choroba, „čierny kašeľ“) vakcína = 0,85; %15 percentná šanca na získanie choroby neočakávanej = 0,20; %80 percentná šanca na získanie inej choroby, ak je rovnaká (choroba, „chrípka“) vakcína = 0,75; %25 percentná šanca na získanie choroby neočkovanej = 0,31; %69 percentná šanca na získanie inej choroby, ak je rovnaká (choroba, „osýpky“) očkovanie = 0,97; %3 percentná šanca na získanie choroby neočakávanej = 0,10; 90 %pravdepodobnosť, že choroba skončí
Vysvetlenie kódu:
Funkcia disp () vytlačí výpis na obrazovku a tiež vytlačí rôzne možnosti. Podľa toho bude priradená choroba. Táto verzia v súčasnosti neberie ohľad na neplatný vstup. Neplatný vstup spôsobí chybu a program úplne zastaví. S každou chorobou sú spojené hodnoty vakcinácie a nevakcinácie. Tieto hodnoty NIE sú náhodné. Tieto hodnoty sme získali z výskumu štatistík o chorobách.
Ďalej sa musíme používateľa opýtať, či chce testovať veľkú alebo malú veľkosť populácie pre svoju zvolenú chorobu.
disp ('Vyberte veľkosť populácie.')
fprintf ('20 / n200 / n ') rýchlosť = vstup (' Vybraná populácia: ',' s '); ak je rovnaká (rýchlosť, '20') populačná_veľkosť = 20; elseif isequal (speed, '200') populacia_velikost = 200; koniec
Vysvetlenie kódu
To používateľovi vytlačí vyhlásenie a požiada ho, aby zadal, akú veľkosť populácie chce testovať. Táto verzia v súčasnosti neberie ohľad na neplatný vstup. Neplatný vstup spôsobí chybu a program úplne zastaví. 20 bol vybraný, pretože je to malá veľkosť vzorky, ktorá stále dáva dobrú predstavu o tom, ako sa infekcia šíri v malej populácii. 200 ľudí bolo vybraných ako väčšia možnosť, pretože 200 bodov zakreslených do grafu sa sotva prekrývalo v bodoch, takže všetko bolo možné navzájom ľahko vidieť a odlíšiť.
Ďalej musíme nájsť rýchlosť simulácie.
disp („Rýchlosť simulácie.“)
fprintf ('Fast / nSlow / n') speed = vstup ('Zvolená rýchlosť:', 's'); ak je nerovnaký (rýchlosť, „rýchly“) sim_speed = 0; elseif isequal (speed, 'Slow') sim_speed = 0.25; koniec
Vysvetlenie kódu
Tento proces bol rovnaký ako pri zisťovaní typu ochorenia a veľkosti populácie. Rýchlo nebude žiadna prestávka. a pre pomalé bude pri spustení simulácie 0,25 sekundové oneskorenie v slučke for.
Skvelé! Teraz máme všetky vstupy od používateľa, ktorého potrebujeme! Prejdeme k zberu údajov o rôznych percentách neočkovaných ľudí.
Krok 13: Vyberte si % neočkovaných ľudí a vypočítajte priemer neočkovaných a nakazených pre zvolené percento
Tento kód je pre 0% neočkovaných ľudí.
% ------- % 0 Neočkované ------------
per_infect_av_0 = ; percento_un_unvacc_and_infec_av_0 = ; pre i = 1:20 výstup = infekciaSim (nevakcc, vacc., populačná veľkosť, 0, 1, sim_rýchlosť); per_infect_av_0 = [per_infect_av_0, out (1, 1)]; percentuálny_d_unvacc_and_infec_av_0 = [percento_z_unvacc_and_infec_av_0, out (1, 2)]; end average_infected_0 = priemer (per_infect_av_0); average_unvacc_and_infected_0 = priemer (percento_ z_unvacc_and_infec_av_0);
Vysvetlenie kódu:
Cyklus for sa spustí 20 -krát. Výstup z funkcie, infekciaSim (), je uložený vo formáte out. Zakaždým, keď sa spustí cyklus for, potom sa percento infikovaných z celkovej populácie pridá do matice „per_infect_av_0“. Okrem toho sa do matice „percentuálny podiel_unvacc_a_infec_av_0“zakaždým pridá aj percento neočkovaných a infikovaných. V posledných dvoch riadkoch sa potom tieto dve vyššie uvedené matice spriemerujú a uložia do premenných. Suma sumárum, percentá sú uložené pre každú simuláciu, spriemerované a vykreslené. Monte Carlo sa používa na zobrazenie priemernej hodnoty spustenia simulácie a zobrazenia výsledku. Na naše experimentálne účely sme sa rozhodli spustiť simuláciu 20 -krát a priemerovať tieto hodnoty.
Výzva:
Opakujte pre všetky percentá, ktoré chcete testovať! To sa dá dosiahnuť zmenou názvov premenných podľa percentuálnych čísel. Testovali sme 0%, 5%, 10%, 20%, 30%a 50%.
Tip:
Jediný riadok, ktorý je potrebné v aktuálnom kóde zmeniť, je
out = infekciaSim (unvacc, vacc, populace_velikosti, 0, 1, sim_speed);
Zmeňte nulu na percento v desatinnej forme. Napríklad pre 5% neočkovanú simuláciu by mala byť 0 nahradená hodnotou 0,5.
Krok 14: Graf: „Trend infekcie u neočkovaných vs. Očkované proti špecifikovanej chorobe “
Toto je kód, ktorý má vytvoriť graf trendu infekcie u neočkovaných osôb oproti neočkovaným osobám.
graph_mat_y = [priemerná_infikovaná_0, priemerná_infikovaná_5, priemerná_infikovaná_10, priemerná_infikovaná_20, priemerná_infikovaná_30, priemerná_infikovaná_50];
graph_mat_x = [0, 5, 10, 20, 30, 50]; sklon = (average_infected_5-average_infected_0)/5; line_y = [priemerný_infikovaný_0, (sklon*50)+priemerný_infikovaný_0]; riadok_x = [0, 50]; postava (2) plot (graph_mat_x, graph_mat_y); riadok (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); názov ([„Trend v neočkovaní pre“, choroba]); xlabel („Percento počiatočných neočkovaných“); ylabel („Percento konečných nakazených“)
Vysvetlenie kódu
riadok 1: priradené hodnoty y priemerom percent infikovaných
riadok 2: priradené hodnoty x percentuálnemu podielu počiatočných percent neočkovaných
riadok 3: vypočítajte sklon 0% a 5%
riadok 4: uložte hodnoty y riadka. Toto je pokračovanie sekcie 0% až 5%.
riadok 5: uložte hodnoty y riadka. Tento riadok presahuje dĺžku grafu.
riadok 6: vytvorte figúrku
riadok 7: zakreslite do grafu hodnoty x a y percenta infikovaných, ktorí sú neočkovaní.
riadok 8: nakreslite čiaru. Toto ukazuje, že nerastie lineárne, ale exponenciálne.
riadok 9: Nastavte názov grafu.
riadok 10-11: Nastavte štítky x a y pre graf.
Teraz by ste mali vidieť, že čím väčšie percento populácie je neočkované, tým väčšie je množstvo infekcií. Tiež uvidíte, že väčšina bodov, ktoré sčervenajú, sú zelené bodky, čo ukazuje, že vakcína do určitej miery pomáha! Dúfam, že sa vám tento návod páčil. V prípade akýchkoľvek otázok píšte komentáre!
Krok 15: Finálny produkt: Ako simulácia vyzerá
Celý kód nájdete tu
Odporúča:
ATtiny85 Nositeľné zariadenie na sledovanie vibrácií, sledovanie a programovanie ATtiny85 s Arduino Uno: 4 kroky (s obrázkami)
ATtiny85 Nositeľné hodinky na sledovanie vibrácií a programovanie ATtiny85 s Arduino Uno: Ako vyrobiť hodinky na sledovanie nositeľnej aktivity? Toto je nositeľný gadget navrhnutý tak, aby vibroval, keď zistí stagnáciu. Trávite väčšinu času pri počítači ako ja? Sedíte hodiny bez toho, aby ste si to uvedomovali? Potom je toto zariadenie
Sledovanie a sledovanie malých obchodov: 9 krokov (s obrázkami)
Track & trace pre malé obchody: Jedná sa o systém, ktorý je vytvorený pre malé obchody a ktorý sa má montovať na e-bicykle alebo e-skútre pri dodávkach na krátku vzdialenosť, napríklad v pekárni, ktorá chce dodávať pečivo. Čo znamená Track and Trace? Track and Trace je systém, ktorý používa približne
Sledovanie pohybu 3D Tfcd prostredníctvom kapacitného snímania a výstupu LED: 6 krokov (s obrázkami)
Tfcd 3D sledovanie pohybu pomocou kapacitného snímania a výstupu LED: V tomto návode je vysvetlené, ako je možné sledovať pohyb ruky v 3D priestore pomocou princípu kapacitného snímania. Zmenou vzdialenosti medzi nabitou hliníkovou fóliou a rukou sa kapacita kondenzátora zmení
Inatel - SmartHome - SH2Y - Sledovanie systému a sledovanie okolitého prostredia: 6 krokov
Inatel - SmartHome - SH2Y - Sledovanie systému a okolité prostredie: Zobrazenie monitora a systém monitora a systému Ambiente " para Smart Homes, intuitívne monitorujúce aktuálny stav a teplotu "Temperatura", "Luminosidade" e " Senzor
Domáce sledovanie prostredníctvom Twitteru a YouTube: 6 krokov
Domáce sledovanie prostredníctvom Twitteru a YouTube: S najnovšou verziou Yoics pre Windows môžete ľubovoľnú webovú kameru jednoducho prispôsobiť svojmu osobnému systému sledovania, kde sa videá automaticky nahrávajú na server YouTube & odošle sa upozornenie na Twitter