Obsah:

Očkovat nebo ne? projekt na sledování imunity stáda pomocí simulace nemocí: 15 kroků
Očkovat nebo ne? projekt na sledování imunity stáda pomocí simulace nemocí: 15 kroků

Video: Očkovat nebo ne? projekt na sledování imunity stáda pomocí simulace nemocí: 15 kroků

Video: Očkovat nebo ne? projekt na sledování imunity stáda pomocí simulace nemocí: 15 kroků
Video: Jste naprogramovaní myslet v malém. Myslete VELKORYSE [úplné shrnutí] 2024, Červenec
Anonim
Očkovat nebo ne? projekt na sledování imunity stáda simulací nemocí
Očkovat nebo ne? projekt na sledování imunity stáda simulací nemocí

Přehled projektu:

Náš projekt zkoumá imunitu stáda a doufá, že povzbudí lidi k očkování, aby se snížila míra infekcí v našich komunitách. Náš program simuluje, jak nemoc nakazí populaci různým procentem očkovaných a neočkovaných. Ukazuje imunitu stáda tím, že ukazuje, jak může zvýšený počet očkované populace snížit počet postižených lidí.

Modelujeme to v Matlabu pomocí konceptů teorie grafů. Teorie grafů je matematický způsob, jak reprezentovat vztahy mezi objekty. V teorii grafů mají grafy vrcholy (nebo uzly) spojené hranami (nebo čarami). U našeho projektu jsou uzly dotyční jednotlivci a hrany jsou jejich spojení. Pokud jsou například dva uzly spojeny s hranou, znamená to, že jsou „přáteli“nebo mají nějakou formu vzájemného kontaktu. Tento kontakt je způsob, jak se nemoc šíří. Proto jsme k modelování našeho konceptu použili teorii grafů, protože jsme chtěli vidět, jak se nemoc šíří mezi jednotlivci, kteří jsou spojeni v populaci.

Náš projekt také zahrnuje metodu Monte Carlo. Metoda Monte Carlo jsou algoritmy, které vytvářejí opakované náhodné vzorkování pro příjem číselných výsledků. V našem projektu používáme tuto metodu ke spuštění simulace několikrát změnou procenta počátečního neočkování, abychom viděli, jakou rychlostí se lidé nakazí.

Veškerý kód projektu je propojen ve spodní části!

PC kredit:

Odkaz Matlab na teorii grafů:

Krok 1: Vytvořte matici přilehlosti

Vytvořte matici přilehlosti
Vytvořte matici přilehlosti
Vytvořte matici přilehlosti
Vytvořte matici přilehlosti

Vytvořte nový skript. Nazveme naši ''infekceSim.m' '.

Vytvoříme proměnnou 'NUMOFPEOPLE'. Můžete jej přiřadit libovolné celočíselné hodnotě. To bude představovat počet lidí ve vaší populaci.

Od této chvíle to budeme předpokládat

NUMOFPEOPLE = 20;

Nejprve začněte pomocí funkcí Matlabovy teorie grafů pro neorientovaný graf.

Pokud máte zájem dozvědět se více, zde je odkaz, kde si o tom můžete přečíst více do hloubky.

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

Byla vytvořena matice sousednosti.

adjMatrix = nuly (NUMOFPEOPLE);

Tím se vytvoří čtvercová matice 0 s. Každý řádek v matici je osoba. Každý sloupec v matici je osoba nebo přítel, kterého tato osoba potkává po celý den.

Viz obrázek 100 (výše), který vám pomůže vizualizovat, jak vypadá adjMatrix pro 20 lidí.

** Od tohoto okamžiku budeme předpokládat, že NUMOFPEOPLE se rovná 20. **

Můžete zkusit vykreslit tuto matici sousedství. Zde je trochu více informací o vykreslování těchto typů matic.

Poznámka: Jak funguje matice sousedství.

Příklad:

%vytvoření sousední 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] %vykreslování g = graf (a); %pomocí grafové funkce (teorie grafů) obrázek (1); h = graf (g);

Na obrázku 1 (výše) se dozvíte, jak přidat hrany do matice přilehlosti pomocí kódu v "Poznámka".

Krok 2: Vytvořte vztahy

Vytvářejte vztahy
Vytvářejte vztahy

Nyní, když jsou vytvořeny osoby (vrcholy nebo uzly), musíme vytvořit síť vztahů (čáry nebo hrany grafu). To bude simulovat, jak lidé interagují a setkávají se s jinými lidmi po celý den.

To lze provést mnoha způsoby. Jedním ze způsobů, jak tento úkol dokončit, je nejprve každému člověku přiřadit náhodné číslo a určit tak, s kolika lidmi bude každý člověk za den komunikovat.

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

Tím se vytvoří matice náhodných celých čísel 1 na 20 představující počet interakcí, které má každý člověk za den. Sloupce této matice by byly čísly odpovídajícími každé osobě. Pokud například přiřadíme nejméněFriendsPersonCanHave = 2 a mostFriendsPersonCanHave = 5, získáme náhodné hodnoty mezi 2 a 5.

Máte potíže s randi ()? Do terminálu zadejte

pomoz randi

Dále vytvoříme randomizovanou matici (nazývanou „allFriendsmatrix“), jak je každá osoba v populaci propojena/interaguje v rámci populace.

tempMatrix = ;

počet = 0; allFriendsMatrix = ; pro k = 1: NUMOFPEOPLE zatímco délka (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (počet) = temp; end clear each while length (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; end allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; počet = 0; konec

Hloubkové vysvětlení kódu:

Nejprve vytvoříme prázdnou dočasnou matici pro uložení seznamu přátel/interakcí každé osoby. Také inicializujeme počet, který pouze sleduje, kam umístit nové náhodné připojení v tempMatrix. Smyčky for běží 20krát, takže se to stane pro každou jednotlivou osobu v populaci. První smyčka while běží, dokud tempMatrix každé osoby nemá stejnou délku náhodně přiřazeného počtu interakcí. V této smyčce je generováno náhodné číslo odpovídající osobě v populaci a umístěno do tempMatrix. Protože délky každé z tempMatrix jsou různé, potřebovali jsme vytvořit nějaké hodnoty NaN, abychom mohli všechny tyto tempMaticies zřetězit do jedné matice ('allFriendsMatrix'). Druhá smyčka while tento problém řeší přidáním NaN do každé tempMatrix. Smyčka while byla nastavena tak, aby běžela 9krát, protože je to číslo větší než 5, což byla horní hranice přátel, kterým lze přiřadit osobu. Hodnota '9' je proměnná a může/musí být změněna, pokud je hodnota 'mostFriendsPersonCanHave' větší než 9. Poslední tři řádky kódu (kromě konce) přidají tempMatrix do dalšího řádku 'allFriendsMatrix'. Poté vymaže tempMatrix a počítá pro další osobu.

Výstup

Takto by měl vypadat výstup pro první běh smyčkou for (před posledními třemi řádky).

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 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

Dále přidejte tyto vztahy do adjMatrix.

pro každý Řádek = 1: NUMOFPEOPLE

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

Vysvětlení kódu

Tato smyčka double for prochází každým řádkem a sloupcem 'allFriendsMatrix'. Příkaz if poběží pro všechny hodnoty, které nejsou 'NaN'. V zásadě vytvoří okraje nebo čáry grafu. Takže první řádek, který to udělá, je osoba 1 na osobu 16 a osoba 16 na osobu 1. Protože je to neřízené, 1 musí být změněno pro oba! Nemůžeme mít pouze hranu 1 až 16 a ne 16 až 1. Musí být symetrické, aby v Matlabu běželo správně.

V naší simulaci jsme zjistili, že lidé nemohou komunikovat sami se sebou. Když jsme randomizovali hodnoty, existuje šance, že naše sousední matice má tyto chyby.

Opravíme to následujícím kódem:

pro každý = 1: NUMOFPEOPLE

adjMatrix (každý, každý) = 0; konec

Vysvětlení kódu

To pro smyčku zajišťuje, že osoba 1 není připojena k osobě 1, osoba 2 není připojena k osobě 2 atd. Tím, že je všechny vytvoří 0. Jak vidíte níže v sekci výstupu, máme úhlopříčku čtverce matice zleva nahoře vpravo dole jsou všechny 0.

Výstup

Toto je poslední adjMatrix pro tuto aktuální simulaci. To zahrnuje všechny řádky v grafu (obrázek 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

Viz obrázek 2 a podívejte se na graf „adjMatrix“.

Krok 3: Přidejte statistiky nemocí

Nyní, když váš program dokáže vytvořit graf se sadou náhodných lidí a vytvářet náhodné vztahy, potřebujeme zadat informace nebo statistiky o nemoci, abychom zjistili, jak tyto interakce v populaci mohou zvýšit nebo snížit infekci.

Vytvořte tyto proměnné:

unvacc %typ: double; procentní šance, že neočkovaní lidé nedostanou nemoc

typ vakcíny %: dvojnásobek; procentní šance, že očkovaní lidé nedostanou nemoc unvacc_perc %typ: dvojnásobek; procento populace neočkované init_infect %typ: int; procento očkované populace

Dále musíme provést nějaké výpočty.

Vytvoříme 'infekční mat', což je matice 3*NUMOFPEOPLE.

vacc_perc = 1-unvacc_perc;

infekční mat = nan (3, NUMOFPEOPLE); číslo = kulaté (vac_perc * NUMOFPEOPLE); infekční mat (1, 1: číslo) = vakcína; infekční mat (1, číslo+1: konec) = unvacc; infekční mat (2, 1: konec) = 0; infekční mat (2, 1: init_infect) = 1;

Vysvětlení kódu

řádek 1: Procento populace neočkovaných vypočítáno

řádek 2: vytvořte matici 3*N počtu lidí

řádek 3: zjistěte počet očkovaných osob z očkovaného procenta

řádek 4: očkovaným lidem poskytnout imunitu spojenou s očkováním. Tato hodnota je přiřazena na základě výzkumu o této nemoci.

řádek 5: u zbytku populace (neočkovaných osob) jim dejte procentuální imunitu. Tato hodnota je přiřazena na základě výzkumu o této nemoci.

řádek 6: zpočátku nastavte všechny lidi na neinfikované.

řádek 7: pro počet původně nakažených lidí vyplňte odpovídajícím způsobem prvních pár sloupců.

Nyní, když jsme nastavili všechny parametry pro simulaci onemocnění, randomizujeme šanci, zda se osoba (očkovaná i neočkovaná) nakazí. To se provádí v dalším kroku přiřazením náhodných hodnot mezi 0 a 1 každé osobě ve třetím řádku této „infekceMat“.

Krok 4: Randomizujte šanci, že se očkovaná a neočkovaná osoba může nakazit

Dále přiřaďte každé osobě náhodné číslo, které bude použito později k určení, zda se osoba nakazí, nebo ne.

pro w = 1: délka (infekceMat)

infekční mat (3, w) = rand; konec

Vysvětlení kódu

Tato smyčka for se zabývá třetí řadou 'infekceMat' vytvořenou v posledním kroku. 'rand' přiřadí každému indexu řádku 3 hodnotu mezi 0 a 1.

Výstup

infekční mat je nyní kompletní! Jednalo se o populaci se 100% očkováním a původně infikovanou 1 osobou.

infekční mat =

Sloupce 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

řádek 1: Procentní šance, že se NEDOSTANETE nemoc

řádek 2: Infikovaný nebo neinfikovaný (logická hodnota)

řádek 3: Číslo používané ke kontrole, zda se nakažená osoba nakazí, pokud potká infikovanou osobu. Pokud se neinfikovaná osoba setká s infikovanou osobou, je toto číslo větší než číslo v řádku 1 (pro stejný sloupec), pak je infikována. Tuto funkci kódujeme v kroku 7.

Krok 5: Vytvořte matice lidí, kteří jsou neočkovaní a nakažení na základě počátečních informací

Vytvořte 2 matice s názvem „matrixUnvacc“a „matrixInfected“, které ukládají všechny infikované osoby z infekceMat. To bude použito k tomu, abychom mohli barevně kódovat graf infikovaných, neočkovaných nebo očkovaných, což pomůže zviditelnit dopad neočkovaných versus očkovaných jedinců.

vymazat každého

matrixInfected = ; matrixUnvacc = ; pro h = 1: délka (infekceMat), pokud infekceMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; konec konce pro osobu = 1: NUMOFPEOPLE, pokud infekceMat (2, osoba) == 1 matrixInfected = [matrixInfected, osoba]; konec konec

Vysvětlení kódu

Vytvořte dvě prázdné matice pro uložení počtů lidí, kteří jsou neočkovaní, respektive infikovaní. Obě smyčky běží 20krát a pokud je příkaz if splněn, číslo se přidá do správné matice.

Výstup

matrixUnvacc =

matrixInfected =

[1]

Krok 6: Vykreslení počátečního grafu

Počáteční graf vykreslení
Počáteční graf vykreslení

Dále budeme vykreslovat matici sousedství.

g = graf (adjMatrix);

obrázek (1) p = plot (g, 'NodeColor', 'b', 'MarkerSize', 7); zvýraznit (p, matrixUnvacc, 'NodeColor', 'g') zvýraznit (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Procento lidí neočkovaných:', num2str (title_unvacc), '%']); pauza (rychlost)

Vysvětlení kódu

Teorie grafů v Matlabu má vestavěné funkce. Když použijeme funkci graph (), jsme schopni přeložit 'adjMatrix' do skutečného neorientovaného grafu. Poté musíme vytvořit plot pomocí funkce plot (), abychom skutečně viděli, jak vypadá. Tento plot () nastavíme na proměnnou, abychom mohli v simulaci snáze manipulovat a měnit barvy grafu. Všichni lidé (nebo uzly) jsou původně nastaveni na barvu „modrá“. Dále jsou všichni neočkovaní lidé nastaveni na „zelenou“barvu. Infikovaní lidé se poté nastaví na barvu „červenou“. Název je stanoven podle určité procentuální hodnoty testovaných neočkovaných osob. Funkce pause () dočasně zastaví provádění MatLab. Procházíme proměnnou rychlostí, která se šíří a která se počítá v sekundách.

Na obrázku (výše) vidíte náhodný barevně kódovaný graf.

Další informace o funkci highlight () v MatLabu.

Krok 7: Simulujte průběh infekce

Dále musíme zjistit, kdo se nakazí po interakcích (zaznamenaných v adjMatrix) a aktualizovat graf, když se někdo nakazí.

Pomocí adjMatrix určete, kteří lidé jsou infikováni po jejich interakcích s lidmi za jeden den.

pro každý Řádek = 1: délka (adjMatrix)

if infekceMat (2, everyRow) == 1 for eachCol = 1: length (adjMatrix) if adjMatrix (eachRow, eachCol) == 1 % eachRow = the person % eachCol = its friend % each person's friend and see if they are get expanded. if infekceMat (3, eachCol) >infekceMat (1, eachCol) infekceMat (2, eachCol) = 1; zvýraznění (p, eachCol, 'NodeColor', 'r') pauza (rychlost) konec konec konec konec konec

Smyčka for prochází každou osobou. Zkontroluje, že pokud je osoba infikována, zkontroluje všechny lidi/přátele, se kterými komunikovala, a zkontroluje, zda úroveň imunity přítele byla větší než síla nemoci. Zde vstupuje do hry dříve vytvořená „infekceMat“. Porovná se 1. a 3. řada každého sloupce přítele a pokud je 3. řada větší, znamená to, že přítel neměl dostatečně vysokou imunitu, aby unikl nemoci a nakonec se nakazil. Pokud se nakazí, změníme také barvu pomocí zvýraznění () na červenou.

Nyní by váš kód pro simulaci měl fungovat! a pro jakoukoli velikost populace stačí změnit NUMOFPEOPLE!

Krok 8: Použijte teorii Monte Carlo

Abychom to udělali ještě o krok dále a extrahovali data z našeho simulátoru ('infekceSim.m'), chtěli jsme vypočítat a vykreslit trend v procentech neočkovaných lidí, kteří se nakazili, a procenta očkovaných lidí, kteří se nakazili. Předpokládáme, že procento očkovaných lidí, kteří se nakazili, by mělo být mnohem nižší než procento neočkovaných lidí, kteří se nakazili.

Krok 9: Vytvořte soubor ('' infekceSim.m '') se simulací do funkce

Chcete -li spustit Monte Carlo, chtěli bychom simulaci spustit několikrát a shromáždit data, abychom je mohli použít k vykreslení procenta lidí, kteří se nakazili.

Funkci lze nastavit takto:

výstup funkce = infekceSim (unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, speed)

Proměnné ve své simulaci komentujte, protože je nyní předáváte přes hlavní soubor (začneme to psát v kroku 12):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

Nová proměnná

Rychlost

bude přiřazeno v hlavním souboru (Monte_Carlo.m).

Poznámka: Pro ukončení funkce nezapomeňte na konec v dolní části souboru funkce!

Krok 10: Vypočítejte procento neočkovaných a očkovaných lidí, kteří se nakazili

To vypočítá procento neočkovaných lidí, kteří se nakazili. Tento kód se nachází ve spodní části souboru'infekceSim.m '.

number_of_unvacc = 0;

number_of_infec_unvacc = 0; %vypočítá procento neočkovaných lidí, kteří se nakazili pro x = 1: délka (infekceMat), pokud end if infekcieMat (1, x) == unvacc & infekceMat (2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; konec konce procento_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc)*100;

Vysvětlení kódu

Ve smyčce for se bude opakovat NUMOFPEOPLE krát. Pokaždé, když číslo v infekčním matu odpovídá nevakcinovanému číslu (tj. 0,95 == 0,95), pak se počet neočkovaných osob zvýší o 1. Pokaždé, když počet v infekčním matu odpovídá neočkovanému počtu a jsou nakaženi, počet nakažených a neočkovaných se zvyšuje o 1. Poslední řádek dělí počet nakažených, neočkovaných osob celkovým počtem neočkovaných osob. Potom se z toho vypočítá procento.

Výzva:

Zkuste vypočítat procento očkovaných lidí, kteří se nakazili! (Tip: je velmi podobný výše uvedenému kódu, ale některé proměnné jsou změněny a názvy jsou upraveny.)

Dále se vypočítá procento infikovaných lidí na základě celkové populace:

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

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

Vysvětlení kódu

Kumulativní součet se vypočítá pomocí druhého řádku infekceMat, který ukládá 1 s a 0 s v závislosti na tom, zda je osoba nakažena nebo ne. Protože funkce cumsum () vrací matici, vezmeme poslední hodnotu v matici ('pre_per_infect (1, NUMOFPEOPLE)'), která by měla být skutečným součtem všech hodnot z 'infekceMat (2,:)'. Vydělením součtu číslem NUMOFPEOPLE a jeho vynásobením 100 získáme konečné procento infikovaných v celkové populaci.

Krok 11: Vytvořte výstupní proměnnou ve vaší funkci'infekceSim.m '

output = [per_infect, percent_of_unvacc_and_infec, percent_of_vacc_and_infec];

Vysvětlení kódu

Uložte tyto informace do výstupu, který bude odeslán zpět do main (Monte_Carlo.m), když je funkce volána a spuštěna. Tato data se používají ke grafu bodů procent infikovaných osob, které jsou očkované a neočkované.

Vaše funkce 'infekceSim.m' by měla být provedena hned! Nebude to však běžet, protože stále potřebujeme napsat hlavní!

Krok 12: Vytvořte nabídku, abyste od uživatele získali počáteční podmínky simulace

Pamatujte, jak jsme řekli proměnnou

Rychlost

bude vytvořen a prošel hlavní funkcí? Potřebujeme získat hodnoty, které budou předány funkci. Na pořadí hodnot při volání funkce záleží!

Začněte tím, že uživatele požádáte, aby do terminálu zadal nějaké odpovědi.

> Vyberte si nemoc. Všimněte si, že rozlišují velká a malá písmena >> černý kašel >> chřipka >> spalničky >> zvolená nemoc: chřipka >> vyberte velikost populace. >> 20 >> 200 >> Vybraná populace: 20 >> Výběr rychlosti simulace. >> Rychle >> Pomalu >> Zvolená rychlost: Rychle

Tento níže uvedený kód se uživatele ptá, na jakou nemoc se chce podívat.

disp ('Vyberte nemoc. Všimněte si, že rozlišují malá a velká písmena')

fprintf ('Pertussis / nFlu / nMeasles / n') nemoc = vstup ('Vybraná nemoc:', 's'); pokud je stejná (nemoc, „černý kašel“) vakcína = 0,85; %15 procentní pravděpodobnost, že se nemoc unvacc = 0,20; %80 procent šance na získání jiné nemoci, pokud je stejná (nemoc, „chřipka“) vakcína = 0,75; %25 procentní pravděpodobnost, že onemocní unvacc = 0,31; %69 procent šance na získání jiné nemoci, je -li stejná (nemoc, „spalničky“) vakcína = 0,97; %3 procentní pravděpodobnost, že se nemoc unvacc = 0,10; %90 procentní šance na konec nemoci

Vysvětlení kódu:

Funkce disp () vytiskne výpis na obrazovku a také vytiskne různé možnosti. Nemoc bude přiřazena odpovídajícím způsobem. Tato verze aktuálně nepočítá s neplatným zadáním. Neplatný vstup způsobí chybu a úplně zastaví program. S každou nemocí jsou spojeny hodnoty vakcinace a nevakuace. Tyto hodnoty NEJSOU náhodné. Tyto hodnoty jsme získali z výzkumu statistik o nemocech.

Dále se musíme uživatele zeptat, zda chce testovat velkou nebo malou velikost populace na zvolenou nemoc.

disp ('Vyberte velikost populace.')

fprintf ('20 / n200 / n ') rychlost = vstup (' Vybraná populace: ',' s '); pokud je nerovný (rychlost, '20') populace_velikost = 20; elseif isequal (rychlost, '200') populační_velikost = 200; konec

Vysvětlení kódu

Tím se uživateli vytiskne prohlášení a požádá ho, aby zadal, jakou velikost populace chce testovat. Tato verze aktuálně nepočítá s neplatným zadáním. Neplatný vstup způsobí chybu a úplně zastaví program. 20 bylo vybráno, protože jde o malý vzorek, který stále dává dobrou představu o tom, jak se infekce šíří v malé populaci. Jako větší možnost bylo vybráno 200 lidí, protože 200 bodů zakreslených do grafu se téměř nepřekrývalo, takže bylo vše snadno vidět a navzájem se odlišovat.

Dále musíme zjistit rychlost simulace.

disp ('Rychlost simulace.')

fprintf ('Fast / nSlow / n') speed = vstup ('Rychlost zvolena:', 's'); if isequal (speed, 'Fast') sim_speed = 0; elseif isequal (rychlost, 'Pomalý') sim_speed = 0,25; konec

Vysvětlení kódu

Tento proces byl stejný jako zjišťování typu onemocnění a velikosti populace. Pro rychlé nebude žádná pauza. a pro pomalé bude při spuštění simulace ve smyčce for zpoždění 0,25 sekundy.

Skvělý! Nyní máme všechny vstupy od uživatele, kterého potřebujeme! Přejděme ke sběru dat o různých procentech neočkovaných lidí.

Krok 13: Vyberte si % neočkovaných lidí a vypočítejte průměr neočkovaných a nakažených pro zvolené procento

Tento kód je pro 0% neočkovaných osob.

% ------- % 0 Neočkované ------------

per_infect_av_0 = ; procento_un_unvacc_and_infec_av_0 = ; pro i = 1:20 out = infekceSim (unvacc, vacc, populace_velikosti, 0, 1, rychlost_im); per_infect_av_0 = [per_infect_av_0, out (1, 1)]; procenta_na_unvacc_a_infec_av_0 = [procento_na_unvacc_a_infec_av_0, ven (1, 2)]; end average_infected_0 = průměr (per_infect_av_0); average_unvacc_and_infected_0 = průměr (procento_un_unvacc_and_infec_av_0);

Vysvětlení kódu:

Smyčka for se spustí 20krát. Výstup z funkce, infekceSim (), je uložen v out. Při každém spuštění cyklu for se do matice „per_infect_av_0“přidá procento infikovaných z celkové populace. Navíc je do matice „procento_unvacc_and_infec_av_0“vždy přidáno také procento neočkovaných a infikovaných. V posledních dvou řádcích jsou pak tyto dvě výše zmíněné matice zprůměrovány a uloženy do proměnných. Abych to shrnul, procenta jsou uložena pro každou simulaci, zprůměrována a grafována. Monte Carlo slouží k zobrazení průměrné hodnoty spuštění simulace a zobrazení výsledku. Pro naše experimentální účely jsme se rozhodli spustit simulaci 20krát a průměrovat tyto hodnoty.

Výzva:

Opakujte pro všechna procenta, která chcete testovat! To lze provést změnou názvů proměnných podle procentních čísel. Testovali jsme 0%, 5%, 10%, 20%, 30%a 50%.

Náznak:

Jediný řádek, který je třeba ve skutečném kódu změnit, je

out = infekce

Změňte nulu na procenta v desítkové formě. Například pro 5% neočkovanou simulaci by měla být 0 nahrazena 0,5.

Krok 14: Graf: „Trend infekce u neočkovaných vs. Očkovaná pro specifickou nemoc '

Toto je kód pro vytvoření grafu trendu infekce u neočkovaných osob vs. neočkovaných osob.

graph_mat_y = [průměrná_infikovaná_0, průměrná_infikovaná_5, průměrná_infikovaná_10, průměrná_infikovaná_20, průměrná_infikovaná_30, průměrná_infikovaná_50];

graph_mat_x = [0, 5, 10, 20, 30, 50]; sklon = (average_infected_5-average_infected_0)/5; line_y = [průměrný_infikovaný_0, (sklon*50)+průměrný_infikovaný_0]; line_x = [0, 50]; obrázek (2) plot (graph_mat_x, graph_mat_y); line (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); název (['Trend v neočkování pro', nemoc]); xlabel („Procento počátečního neočkování“); ylabel ('Procento konečných nakažených')

Vysvětlení kódu

řádek 1: přiřazené hodnoty y průměrům procent infikovaných

řádek 2: přiřazené hodnoty x procento počátečních procent neočkovaných

řádek 3: vypočítat sklon 0% a 5%

řádek 4: uložte hodnoty y řádku. Toto je pokračování sekce 0% až 5%.

řádek 5: uložte hodnoty y řádku. Tato čára překlenuje délku grafu.

řádek 6: vytvořte obrázek

řádek 7: zakreslete do grafu hodnoty x a y procenta infikovaných, kteří nejsou očkováni.

řádek 8: vykreslete čáru. To slouží k ukázce, že neroste lineárně, ale exponenciálně.

řádek 9: Nastavte název grafu.

řádek 10-11: Nastavte popisky xay pro graf.

Nyní byste měli vidět, že čím větší procento populace neočkované, tím větší množství infekce. Uvidíte také, že většina teček, které zčervenají, jsou zelené tečky, což ukazuje, že vakcína do určité míry pomáhá! Doufám, že se vám tento návod líbil. Pokud máte nějaké dotazy, napište komentář!

Krok 15: Konečný produkt: Jak vypadá simulace

Veškerý kód najdete zde

Doporučuje: