INHOUDSOPGAWE:
- Stap 1: Skep Adjacency Matrix
- Stap 2: Skep verhoudings
- Stap 3: Voeg siekte statistieke by
- Stap 4: Randomiseer die kans dat 'n ingeënt en nie -ingeënt besmet kan raak
- Stap 5: Skep matrikse van mense wat nie ingeënt en besmet is uit aanvanklike inligting nie
- Stap 6: Skep die aanvanklike grafiek
- Stap 7: Simuleer die vordering van infeksie
- Stap 8: Gebruik Monte Carlo -teorie
- Stap 9: Maak die lêer ('infectSim.m') met die simulasie in 'n funksie
- Stap 10: Bereken die persentasie mense wat nie ingeënt en ingeënt is nie
- Stap 11: Skep 'n uitvoerveranderlike in u funksie 'infectSim.m'
- Stap 12: Skep 'n spyskaart om die aanvanklike toestande van die simulasie van die gebruiker te kry
- Stap 13: Kies 'n % van die mense wat nie ingeënt is nie en bereken die gemiddelde van die nie -ingeëntes en besmette vir 'n gekose persentasie
- Stap 14: Grafiek: 'Die neiging van infeksie in nie -ingeënt vs. Ingeënt vir gespesifiseerde siektes '
- Stap 15: Finale produk: hoe die simulasie lyk
Video: Om ingeënt te word of nie? 'n Projek oor die waarneming van kudde -immuniteit deur simulasie van siektes: 15 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:27
Oorsig van die projek:
Ons projek ondersoek kudde -immuniteit en hoop om mense aan te moedig om inentings te kry om die infeksiesyfers in ons gemeenskappe te verlaag. Ons program simuleer hoe 'n siekte 'n bevolking met verskillende persentasies ingeënt en nie -ingeënt infekteer. Dit toon kudde -immuniteit deur aan te toon hoe 'n groter aantal van die ingeënt bevolking die aantal mense wat geraak word, kan verminder.
Ons modelleer dit in Matlab met behulp van grafiese teoriebegrippe. Grafiese teorie is 'n wiskundige manier om die verhoudings tussen voorwerpe voor te stel. In grafiese teorie het grafieke hoekpunte (of nodes) wat met rande (of lyne) verbind is. Vir ons projek is die nodusse die betrokke individue en die rande is hul verbindings. As twee knope byvoorbeeld met 'n rand verbind is, beteken dit dat hulle 'vriende' is of 'n vorm van kontak met mekaar het. Hierdie kontak is 'n manier om die siekte te versprei. Daarom het ons grafiese teorie gebruik om ons konsep te modelleer omdat ons wou sien hoe siektes versprei onder individue wat in 'n bevolking verbind is.
Ons projek behels ook die Monte Carlo -metode. Die Monte Carlo -metode is algoritmes wat herhaalde ewekansige steekproefneming skep om numeriese resultate te ontvang. In ons projek gebruik ons hierdie metode om ons simulasie verskeie kere uit te voer, en verander die persentasie aanvanklike nie -ingeënt om die tempo waarteen mense besmet raak te sien.
Alle projekkode is onderaan gekoppel!
PC-krediet:
Matlab-skakel na grafiese teorie:
Stap 1: Skep Adjacency Matrix
Skep 'n nuwe skrif. Ons gaan ons infeksie 'SimS' noem.
Ons gaan 'n veranderlike 'NUMOFPEOPLE' skep. U kan dit aan enige heelgetalwaarde toewys. Dit sal die aantal mense in u bevolking verteenwoordig.
Van nou af sal ons dit aanneem
NUMOFPEOPLE = 20;
Begin eers met die gebruik van Matlab se grafiese teoriefunksies vir 'n ongerigte grafiek.
As u belangstel om meer te wete te kom, is hier 'n skakel om meer in diepte daaroor te lees.
www.mathworks.com/help/matlab/math/directed-and-undirected-graphs.html
Het 'n aangrensende matriks geskep.
adjMatrix = nulle (NUMOFPEOPLE);
Dit sal 'n vierkantige matriks van 0s skep. Elke ry in die matriks is 'n persoon. Elke kolom in die matriks is 'n persoon of vriend wat die persoon deur die dag ontmoet.
Sien figuur 100 (hierbo) om te help visualiseer hoe adjMatrix vir 20 mense lyk.
** Vanaf hierdie tydstip gaan ons aan dat NUMOFPEOPLE gelyk is aan 20. **
U kan probeer om hierdie aangrensende matriks te teken. Hier is 'n bietjie meer inligting oor die opstel van hierdie tipe matrikse.
Opmerking: hoe die aangrensende matriks werk.
Byvoorbeeld:
%maak die aangrensende matriks
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] %plot g = grafiek (a); %met behulp van die grafiekfunksie (grafiese teorie) figuur (1); h = plot (g);
Sien figuur 1 (hierbo) om te sien hoe om rande in die aangrensende matriks by te voeg, met behulp van die kode in "Nota".
Stap 2: Skep verhoudings
Noudat die mense (hoekpunte of knope) geskep is, moet ons 'n netwerk van verhoudings (lyne of rande van die grafiek) skep. Dit sal simuleer hoe mense interaksie het en ander mense gedurende 'n dag ontmoet.
Dit kan op baie maniere gedoen word. Een manier om hierdie taak te voltooi, is om eers 'n ewekansige getal aan elke persoon toe te ken om te bepaal met hoeveel mense elke persoon op 'n dag sal reageer.
numOfFriendsMatrix = randi ([leastFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);
Dit maak 'n 1 by 20 matriks van ewekansige heelgetalle wat die aantal interaksies verteenwoordig wat elke persoon per dag het. Die kolomme van hierdie matriks is die getal wat ooreenstem met elke persoon. As ons byvoorbeeld die minsteFriendsPersonCanHave = 2 en mostFriendsPersonCanHave = 5 toewys, kry ons ewekansige waardes tussen 2 en 5.
Het u probleme met randi ()? Tik in terminaal
help randi
Vervolgens maak ons 'n gerandomiseerde matriks (genaamd "allFriendsmatrix") van hoe elke persoon in die bevolking met mekaar verbind/interaksie binne die bevolking het.
tempMatrix = ;
telling = 0; allFriendsMatrix = ; vir k = 1: NUMOFPEOPLE terwyl lengte (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (telling) = temp; eindig elke keer as lengte (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; beëindig allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; telling = 0; einde
Diepgaande verduideliking van die kode:
Eerstens skep ons 'n leë tydelike matriks om elke persoon se lys met vriende/interaksie te hou. Ons initialiseer ook die telling, wat net byhou waar die nuwe ewekansige verbinding in die tempMatrix gehou moet word. Die for lusse loop 20 keer sodat dit gebeur vir elke individuele persoon in die bevolking. Die eerste terwyl -lus loop totdat elke persoon se tempMatrix dieselfde lengte is as die willekeurig toegewysde aantal interaksies. In hierdie lus word 'n ewekansige getal wat ooreenstem met die persoon in die bevolking gegenereer en in die tempMatrix geplaas. Omdat die lengtes van elk van die tempMatrixes verskillend is, moes ons 'n paar NaN -waardes skep sodat ons al hierdie tempMaticies in een matriks ('allFriendsMatrix') konnekteer. Die tweede terwyl -lus los hierdie probleem op deur NaN's by elke tempMatrix te voeg. Die while -lus sou 9 keer uitgevoer word, want dit is 'n getal groter as 5, wat die boonste grens was van vriende wat 'n persoon toegeken kan word. Die waarde '9' is veranderlik en kan/moet verander word wanneer 'mostFriendsPersonCanHave' groter is as 9. Die laaste drie reëls kode (uitgesluit die einde) voeg die tempMatrix by tot die volgende ry van die 'allFriendsMatrix'. Dan verwyder dit tempMatrix en tel vir die volgende persoon.
Uitset
Dit is hoe die uitset moet lyk vir die eerste lopie deur die for -lus (voor die laaste drie reëls).
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 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 19 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 NaN 1 7 NaN NaN NaN NaN NaN NaN NaN 16 7 13 10 1 NaN NaN NaN NaN
Voeg vervolgens hierdie verhoudings by die adjMatrix.
vir eachRow = 1: NUMOFPEOPLE
vir eachCol = 1: 9 as isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; einde einde einde
Kode Verduideliking
Hierdie dubbele vir lus gaan deur elke ry en kolom van die 'allFriendsMatrix'. Die if -stelling sal uitgevoer word vir alle waardes wat nie 'NaN' is nie. Dit maak basies die rande of lyne van die grafiek. Dus, die eerste reël wat dit maak, is persoon 1 tot persoon 16 en persoon 16 tot persoon 1. Omdat dit ongerig is, moet 1 vir beide verander word! Ons kan nie net die rand 1 tot 16 hê nie en nie 16 tot 1. Hulle moet simmetries wees sodat dit in Matlab behoorlik kan werk.
In ons simulasie het ons vasgestel dat mense nie met hulself kan omgaan nie. As ons die waardes gerandomiseer het, is daar 'n kans dat ons aangrensende matriks hierdie foute het.
Laat ons dit regstel met die volgende kode:
vir elke = 1: NUMOFPEOPLE
adjMatrix (elk, elk) = 0; einde
Kode Verduideliking
Dit vir lus verseker dat persoon 1 nie aan persoon 1 gekoppel is nie, persoon 2 nie aan persoon 2 gekoppel is nie, ens deur almal almal te maak 0. Soos u hieronder in die uitsetgedeelte kan sien, het ons die diagonaal van die vierkant matriks van links bo na regs onder is al die 0's.
Uitset
Dit is die laaste adjMatrix vir hierdie huidige simulasie. Dit is verantwoordelik vir al die lyne in die grafiek (Figuur 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
Sien figuur 2 om die grafiek van 'adjMatrix' te sien.
Stap 3: Voeg siekte statistieke by
Noudat u program 'n grafiek met 'n stel willekeurige mense kan skep en ewekansige verhoudings kan skep, moet ons die inligting of statistieke van die siekte invoer om te sien hoe hierdie interaksies binne 'n bevolking infeksie kan verhoog of verminder.
Skep hierdie veranderlikes:
unvacc %tipe: dubbel; persent kans dat mense wat nie ingeënt is nie die siekte kry
tipe entstof: dubbel; persent kans dat ingeëntes nie die siekte kry nie unvacc_perc %tipe: dubbel; persent bevolking nie ingeënt init_infect %tipe: int; persent bevolking ingeënt
Vervolgens moet ons 'n paar berekeninge doen.
Ons gaan 'n 'infectmat' maak, wat 'n 3*NUMOFPEOPLE -matriks is.
vacc_perc = 1-unvacc_perc;
infectMat = nan (3, NUMOFPEOPLE); nommer = rond (vacc_perc * NUMOFPEOPLE); infeksieMat (1, 1: getal) = vacc; infectMat (1, getal+1: einde) = unvacc; infeksieMat (2, 1: einde) = 0; infectMat (2, 1: init_infect) = 1;
Kode Verduideliking
reël 1: Persentasie van die bevolking wat nie ingeënt is nie, bereken
reël 2: skep 'n 3*N aantal mense matriks
reël 3: vind uit hoeveel mense ingeënt is teen ingeënt persentasie
reël 4: gee vir die ingeëntes 'n immuniteit wat verband hou met die entstof. Hierdie waarde word toegeken op grond van navorsing oor die siekte.
reël 5: gee die persentasie immuniteit vir die res van die bevolking (nie -ingeëntes). Hierdie waarde word toegeken op grond van navorsing oor die siekte.
reël 6: stel aanvanklik dat alle mense nie besmet is nie.
reël 7: vul die eerste paar kolomme dienooreenkomstig in vir die aantal mense wat aanvanklik besmet is.
Noudat ons al die parameters vir die simulasie van die siekte gestel het, gaan ons die kans ewekansig of die persoon (ingeënt en on ingeënt) besmet raak. Dit word in die volgende stap gedoen deur willekeurige waardes tussen 0 en 1 toe te ken aan elke persoon in die derde ry van hierdie 'infectMat'.
Stap 4: Randomiseer die kans dat 'n ingeënt en nie -ingeënt besmet kan raak
Gee dan 'n ewekansige nommer aan elke persoon; dit sal later gebruik word om te bepaal of die persoon besmet is of nie.
vir w = 1: lengte (infectieMat)
infeksieMat (3, w) = rand; einde
Kode verduideliking
Dit vir loop handel oor die derde ry van die 'infectmat' wat in die laaste stap gemaak is. 'rand' ken 'n waarde tussen 0 en 1 toe aan elke indeks van ry 3.
Uitset
infeksieMat is nou voltooi! Dit was met 'n bevolking met 100% inenting en 1 persoon wat aanvanklik besmet was.
infeksieMat =
Kolomme 1 tot en met 12 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 1.0000 0 0 0 0 0 0 0 0 0 0 0 0.0869 0.5489 0.3177 0.9927 0.7236 0.5721 0.7172 0.9766 0.4270 0.9130 0.8973 0.8352 Kolomme 0.7500 0.7500 0,7500 0,7500 0 0 0 0 0 0 0 0 0 0,0480 0,3593 0,2958 0,6291 0,1336 0,3740 0,8648 0,2503
ry 1: persentasie kans om NIE die siekte te kry nie
ry 2: Besmet of nie besmet nie (booleaanse waarde)
ry 3: nommer wat gebruik word om te kyk of iemand wat nie besmet is nie, besmet raak as hy 'n besmette persoon ontmoet. As 'n onbesmette persoon die besmette persoon ontmoet, is hierdie getal groter as die getal in ry 1 (vir dieselfde kolom), dan word hulle besmet. Ons kodeer hierdie funksie in stap 7.
Stap 5: Skep matrikse van mense wat nie ingeënt en besmet is uit aanvanklike inligting nie
Skep 2 matrikse genaamd "matrixUnvacc" en "matrixInfected" wat al die besmette mense van infectMat stoor. Dit sal gebruik word sodat ons die grafiek van diegene wat besmet, on ingeënt of ingeënt is, kan kleurkodeer, sodat ons die impak van ongeënte teenoor ingeëntes kan visualiseer.
maak elkeen duidelik
matrixInfected = ; matrixUnvacc = ; vir h = 1: lengte (infectMat) as infectMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; end end for person = 1: NUMOFPEOPLE if infectionMat (2, person) == 1 matrixInfected = [matrixInfected, person]; einde einde
Kode Verduideliking
Skep twee leë matrikse om die getalle van die mense wat onderskeidelik ingeënt en besmet is, op te slaan. Beide vir lusse loop 20 keer en as die if -stelling tevrede is, word die getal by die korrekte matriks gevoeg.
Uitset
matrixUnvacc =
matrixInfected =
[1]
Stap 6: Skep die aanvanklike grafiek
Vervolgens gaan ons die aangrensende matriks teken.
g = grafiek (adjMatrix);
figuur (1) p = plot (g, 'NodeColor', 'b', 'MarkerSize', 7); highlight (p, matrixUnvacc, 'NodeColor', 'g') highlight (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Persentasie mense wat nie ingeënt is nie,', num2str (title_unvacc), '%']); pouse (spoed)
Kode verduideliking
Grafiese teorie in Matlab het funksies ingebou. As ons die grafiek () -funksie gebruik, kan ons die 'adjMatrix' vertaal in 'n werklike ongerigte grafiek. Ons moet dan 'n plot maak met die plot () -funksie om werklik te sien hoe dit lyk. Ons stel hierdie plot () op 'n veranderlike sodat ons die kleure van die plot makliker kan manipuleer en verander tydens die simulasie. Alle mense (of nodusse) is aanvanklik ingestel op die kleur 'blou'. Vervolgens is al die ongeëntde mense ingestel op die kleur 'groen'. Die besmette mense word dan op die kleur 'rooi' gestel. Die titel word bepaal volgens die sekere persentasie waarde van nie -ingeëntes wat getoets word. Die funksie pause () stop MatLab se uitvoering tydelik. Ons gaan deur die veranderlike snelheid wat versprei word, wat in sekondes bereken word.
Sien prentjie (hierbo) om 'n ewekansige kleurgekodeerde grafiek te sien.
Kom meer te wete oor die funksie highlight () in MatLab.
Stap 7: Simuleer die vordering van infeksie
Vervolgens moet ons uitvind wie besmet raak na die interaksies (aangeteken in die adjMatrix) en die grafiek bywerk wanneer iemand besmet raak.
Gebruik die adjMatrix om te bepaal watter mense besmet is na hul interaksie met mense in 'n dag.
vir eachRow = 1: lengte (adjMatrix)
as infectMat (2, eachRow) == 1 vir eachCol = 1: lengte (adjMatrix) as adjMatrix (eachRow, eachCol) == 1 % eachRow = die persoon % eachCol = sy vriend % elke persoon se vriend en kyk of hulle besmet raak. as infectMat (3, eachCol)> infectMat (1, eachCol) infectMat (2, eachCol) = 1; beklemtoon (p, eachCol, 'NodeColor', 'r') pouse (spoed) einde einde einde einde einde
Die for lus loop deur elke persoon. Dit kontroleer dat as die persoon besmet is, elkeen van die mense/vriende waarmee hulle omgegaan het, kyk of die immuniteitsvlak van die vriend groter is as die sterkte van die siekte. Dit is waar die 'infectMat' wat ons vroeër geskep het, ter sprake kom. Die eerste en derde ry van elke kolom van die vriend word vergelyk en as die derde ry groter is, beteken dit dat die vriend nie genoeg immuniteit het om aan die siekte te ontsnap nie en uiteindelik besmet raak. Ons verander ook na kleur deur hoogtepunt () na rooi te gebruik as hulle besmet raak.
Nou moet u kode vir die simulasie werk! en verander die NUMOFPEOPLE vir enige bevolkingsgrootte!
Stap 8: Gebruik Monte Carlo -teorie
Om hierdie stap nog verder te neem en data uit ons simulator ('infeksieSim.m') te onttrek, wou ons die neiging bereken en grafiek gee in persentasie van on ingeëntes wat besmet is en die persentasie ingeëntes wat besmet is. Ons veronderstel dat die persentasie ingeëntes wat besmet is, baie laer moet wees as die persentasie mense wat nie ingeënt is nie.
Stap 9: Maak die lêer ('infectSim.m') met die simulasie in 'n funksie
Om Monte Carlo te bestuur, wil ons die simulasie verskeie kere uitvoer en data versamel, sodat ons dit kan gebruik om die persentasies van mense wat besmet is, te grafiseer.
Die funksie kan so opgestel word:
funksie uitset = infeksie Sim (unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, speed)
Lewer kommentaar op die veranderlikes in u simulasie, aangesien u dit nou deur die hooflêer deurgee (ons sal dit in stap 12 begin skryf):
unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect
Die nuwe veranderlike
spoed
word toegeken in die hooflêer (Monte_Carlo.m).
Let wel: Moenie die einde onderaan die funksielêer vergeet om die funksie te beëindig nie!
Stap 10: Bereken die persentasie mense wat nie ingeënt en ingeënt is nie
Dit bereken die persentasie on -ingeëntes wat besmet is. Hierdie kode verskyn onderaan die 'infeksieSim.m' -lêer.
nommer_van_unvacc = 0;
number_of_infec_unvacc = 0; %bereken die persentasie on -ingeëntes wat vir x = 1 besmet geraak het: length (infectMat) as infectMat (1, x) == unvacc number_of_unvacc = number_of_unvacc+1; eindig as infeksieMat (1, x) == unvacc & infeksieMat (2, x) == 1 nommer_of_infec_unvacc = nommer_of_infec_unvacc +1; end end percentage_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc)*100;
Kode verduideliking
In die for -lus gaan dit meer as NUMOFPEOPLE keer om. Elke keer as die getal in die infeksieMat ooreenstem met die onvacc -getal (dws 0.95 == 0.95), word die aantal nie -ingeëntes met 1 verhoog. aantal besmette en nie -ingeëntes styg met 1. Die laaste reël deel die aantal besmette, nie -ingeëntes deur die totale aantal nie -ingeëntes. Dan word die persentasie hieruit bereken.
Uitdaging:
Probeer om die persentasie ingeëntes van mense wat besmet is, te bereken! (Wenk: dit is baie soortgelyk aan hierdie kode hierbo, maar sommige veranderlikes word verander en name word aangepas.)
Vervolgens word die persentasie mense wat besmet is op grond van die totale bevolking, bereken:
pre_per_infect = cumsum (infectMat (2,:));
per_infect = (pre_per_infect (1, NUMOFPEOPLE)/NUMOFPEOPLE)*100;
Kode verduideliking
Die kumulatiewe som word bereken met behulp van die tweede ry van die infeksieMat, wat 1s en 0s stoor, afhangende van of die persoon besmet is of nie. Aangesien die funksie cumsum () 'n matriks teruggee, neem ons die laaste waarde in die matriks ('pre_per_infect (1, NUMOFPEOPLE)'), wat die werklike som van al die waardes van 'infectMat (2,:)' moet wees. Deur die som deur die NUMOFPEOPLE te deel en dit met 100 te vermenigvuldig, kry ons die finale persentasie besmette in die totale bevolking.
Stap 11: Skep 'n uitvoerveranderlike in u funksie 'infectSim.m'
output = [per_infect, percentage_of_unvacc_and_infec, percentage_of_vacc_and_infec];
Kode verduideliking
Stoor hierdie inligting in uitvoer, wat na die hoof (Monte_Carlo.m) teruggestuur sal word wanneer die funksie geroep en uitgevoer word. Hierdie data word gebruik om die punte van die persentasie besmette persone van ingeëntes en ingeëntes te grafiseer.
U 'infeksieSim.m' -funksie moet nou gedoen word! Dit sal egter nie werk nie, want ons moet nog die hoofskrif skryf!
Stap 12: Skep 'n spyskaart om die aanvanklike toestande van die simulasie van die gebruiker te kry
Onthou hoe ons die veranderlike gesê het
spoed
sou die hooffunksie geskep en deurgegee word? Ons moet die waardes verkry om na die funksie oor te dra. Let op, die volgorde van die waardes as u die funksie noem, maak nie saak nie!
Begin deur die gebruiker te vra om 'n paar antwoorde in die terminaal in te tik.
> Kies 'n siekte. Let op dat dit hooflettergevoelig is >> Pertussis >> Griep >> Masels >> Gekose siekte: griep >> Kies die populasiegrootte. >> 20 >> 200 >> Bevolking gekies: 20 >> Kies spoed van simulasie. >> Vinnig >> Stadig >> Spoed gekies: vinnig
Hierdie kode hieronder vra die gebruiker na watter siekte hy wil kyk.
disp ('Kies 'n siekte. Let op dat dit hooflettergevoelig is')
fprintf ('Pertussis / nFlu / nMeasles / n') siekte = input ('Siekte gekies:', 's'); as gelyke (siekte, 'Pertussis') vacc =.85; %15 persent kans om siekte te kry unvacc =.20; %80 persent kans om siekte te kry, anders as gelyke (siekte, 'griep') vacc =.75; %25 persent kans om siekte te kry unvacc =.31; %69 persent kans om siekte te kry, anders as die gelyke (siekte, 'Masels') vacc =.97; %3 persent kans om siektes te kry unvacc =.10; %90 persent kans om siekte te beëindig
Kode verduideliking:
Die disp () -funksie druk die verklaring op die skerm uit en druk ook die verskillende opsies uit. Die siekte sal dienooreenkomstig toegeken word. Hierdie weergawe is tans nie verantwoordelik vir ongeldige invoer nie. Ongeldige invoer sal 'n fout veroorsaak en die program heeltemal stop. Elke siekte het vacc- en unvacc -waardes wat daarmee gepaard gaan. Hierdie waardes is NIE lukraak nie. Ons het hierdie waardes gekry deur navorsing te doen oor statistieke oor die siektes.
Vervolgens moet ons die gebruiker vra of hy 'n groot of klein populasiegrootte wil toets vir die siekte wat hulle gekies het.
disp ('Kies die grootte van die bevolking.')
fprintf ('20 / n200 / n ') spoed = invoer (' Bevolking gekies: ',' s '); as gelyke (spoed, '20') populasie_grootte = 20; anders as gelyke (spoed, '200') populasie_grootte = 200; einde
Kode verduideliking
Hiermee word 'n verklaring aan die gebruiker afgedruk en die gebruiker gevra om in te voer watter populasie dit wil toets. Hierdie weergawe is tans nie verantwoordelik vir ongeldige invoer nie. Ongeldige invoer sal 'n fout veroorsaak en die program heeltemal stop. 20 is gekies omdat dit 'n klein steekproefgrootte is wat nog steeds 'n goeie idee gee van hoe infeksie oor 'n klein bevolking versprei. 200 mense is gekies as die groter opsie, want 200 punte op die grafiek het skaars punte oorvleuel, sodat alles maklik van mekaar gesien en onderskei kon word.
Vervolgens moet ons die snelheid van die simulasie bepaal.
disp ('Kies snelheid van simulasie.')
fprintf ('Fast / nSlow / n') speed = input ('Spoed gekies:', 's'); as gelyk (spoed, 'vinnig') sim_speed = 0; anders as dit gelyk is (spoed, 'stadig') sim_speed = 0,25; einde
Kode verduideliking
Hierdie proses was dieselfde as om die tipe siekte en die grootte van die bevolking te kry. Vir vinnig sal daar geen pouse wees nie. en as dit stadig is, is daar 'n vertraging van 0,25 sekondes in die for -lus wanneer die simulasie uitgevoer word.
Puik! Nou het ons al die insette van die gebruiker wat ons nodig het! Kom ons gaan voort met die insameling van data vir verskillende persentasies ongeëntes.
Stap 13: Kies 'n % van die mense wat nie ingeënt is nie en bereken die gemiddelde van die nie -ingeëntes en besmette vir 'n gekose persentasie
Hierdie kode is vir 0% van die mense wat nie ingeënt is nie.
% ------- % 0 Ongeënt ------------
per_infect_av_0 = ; percentage_van_unvacc_and_infec_av_0 = ; vir i = 1:20 uit = infeksieSim (unvacc, vacc, populasie_grootte, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, uit (1, 1)]; percent_of_unvacc_and_infec_av_0 = [percentage_of_unvacc_and_infec_av_0, uit (1, 2)]; einde gemiddelde_infekteerde_0 = gemiddelde (per_infeksie_av_0); average_unvacc_and_infected_0 = gemiddelde (persentasie_of_unvacc_and_infec_av_0);
Kode verduideliking:
Die for -lus word 20 keer uitgevoer. Die uitset van die funksie, infeksieSim (), word in out gestoor. Elke keer as die for -lus loop, word die persentasie besmette in die totale populasie bygevoeg by matriks 'per_infect_av_0'. Boonop word die persentasie ongeënt en besmet elke keer by die matriks 'percentage_van_unvacc_en_infec_av_0' gevoeg. In die laaste twee reëls word hierdie twee bogenoemde matrikse dan gemiddeld en in veranderlikes gestoor. Om op te som, word die persentasies vir elke simulasie gestoor, gemiddeld en in grafiek geteken. Monte Carlo word gebruik om die gemiddelde waarde van die uitvoering van 'n simulasie en die resultaat te wys. Vir ons eksperimentele doeleindes, kies ons om die simulasie 20 keer uit te voer en die waardes te gemiddelde.
Uitdaging:
Herhaal vir alle persentasies wat u wil toets! Dit kan gedoen word deur die veranderlike name volgens die persentasiegetalle te verander. Ons het getoets vir 0%, 5%, 10%, 20%, 30%en 50%.
Wenk:
Die enigste reël wat in die werklike kode verander moet word, is
out = infectSim (unvacc, vacc, population_size, 0, 1, sim_speed);
Verander die nul na die persent in desimale vorm. Byvoorbeeld, vir 5% nie -ingeënt simulasie, moet die 0 vervang word met 0.5.
Stap 14: Grafiek: 'Die neiging van infeksie in nie -ingeënt vs. Ingeënt vir gespesifiseerde siektes '
Dit is die kode om 'n grafiek te maak van die neiging tot infeksie by nie -ingeëntes teenoor nie -ingeëntes.
graph_mat_y = [gemiddelde_infekteerde_0, gemiddelde_infekteerde_5, gemiddelde_infekteerde_10, gemiddelde_infekteerde_20, gemiddelde_infekteerde_30, gemiddelde_infekteerde_50];
graph_mat_x = [0, 5, 10, 20, 30, 50]; helling = (gemiddelde_infekteerde_5-gemiddelde_infekteerde_0)/5; line_y = [gemiddelde_infekteerde_0, (helling*50)+gemiddelde_infekteerde_0]; line_x = [0, 50]; figuur (2) plot (graph_mat_x, graph_mat_y); line (line_x, line_y, 'Kleur', 'rooi', 'LineStyle', '-'); titel (['Tendens in oningeding vir', siekte]); xlabel ('Persentasie aanvanklike ongeënt'); ylabel ('Persentasie van die finale besmette')
Kode verduideliking
reël 1: y -waardes toegeken aan die gemiddeldes van persent besmet
reël 2: x waardes toegeken aan die persentasie aanvanklike persentasie wat nie ingeënt is nie
reël 3: bereken die helling van 0% en 5%
reël 4: stoor y waardes van lyn. Dit is 'n voortsetting van die 0% tot 5% afdeling.
reël 5: stoor y waardes van lyn. Hierdie lyn strek oor die lengte van die grafiek.
reël 6: skep figuur
reël 7: teken die grafiek x en y waardes van die persentasie besmette persone wat nie ingeënt is nie.
reël 8: teken die lyn. Dit word gebruik om aan te toon dat dit nie lineêr, maar eksponensieel toeneem.
reël 9: Stel titel vir die grafiek.
reël 10-11: Stel x en y etikette vir grafiek.
Nou behoort u te kan sien dat hoe groter die persentasie van die bevolking nie ingeënt is nie, hoe groter die hoeveelheid infeksies. U sal ook sien dat die meeste kolletjies wat rooi word groen kolletjies is, wat toon dat die entstof tot 'n mate help! Hoop jy het van hierdie tutoriaal gehou. Lewer kommentaar as u enige vrae het!
Stap 15: Finale produk: hoe die simulasie lyk
Al die kode kan hier gevind word
Aanbeveel:
Arduino Uno + ESP8266 ESP-01 Skakel 'n lamp oor die internet aan (nie LAN WIFI nie): 3 stappe
Arduino Uno + ESP8266 ESP-01 Skakel 'n lamp oor die internet aan (nie LAN WIFI nie): Skakel 'n lamp aan via 'n webwerf op enige toestel met 'n webblaaier in die toestel, selfs al is u ver van die lamp af. U het toegang tot die webwerf via u skootrekenaar, slimfoon of iets anders met die webblaaier wat op die toestel geïnstalleer is
Hoed nie hoed nie - 'n hoed vir mense wat nie regtig hoede dra nie, maar 'n hoedervaring wil hê: 8 stappe
Hat Not Hat - 'n hoed vir mense wat nie regtig hoede dra nie, maar graag 'n hoedervaring wil hê: ek het altyd gewens ek kon 'n hoedpersoon wees, maar het nog nooit 'n hoed gevind wat vir my werk nie. Hierdie " Hat Not Hat, " of fascinator soos dit genoem word, is 'n boonste oplossing vir my hoedprobleem waarin ek die Kentucky Derby, vakuum, kan bywoon
Kyk na die Eclipse deur 'n leesbril (en brand nie my oë nie): 4 stappe (met foto's)
Kyk ek na die Eclipse deur 'n leesbril (en brand nie my oë nie): Haai, het ek u nuuskierigheid met my titel opgevang? My pa het dit ook gedoen, terwyl ons gister in die ou Montréal gestap het, trek hy sy bril uit en wys my hoe om te sien hoe die verduistering sy leesbril sien. So alles wat
Arduino -projek: beheer elektronika oor die internet met behulp van Nodejs + SQL -databasis en webwerf: 6 stappe
Arduino -projek: Beheer elektronika oor die internet met behulp van Nodejs + SQL -databasis en webwerf: Projek deur: Mahmed.techDate Made: 14 July 2017 Moeilikheidsgraad: Beginner met 'n bietjie programmeringskennis. Hardewarevereiste: - Arduino Uno, Nano, Mega (ek dink die meeste MCU met die seriële verbinding sal werk) - Enkel LED & Huidige beperkende res
Instruksies vir die voltooiing van die opmaak van die baanskyfontwerp vir die opheffing/verlaging van die middelste voetsteun op motorwielstoele: 9 stappe (met foto's)
Instruksies vir die voltooiing van die opmaak van die baanskyfontwerp vir die opheffing/verlaging van die middelste voetsteun op motorwielstoele: die middelste voetsteunhysers moet goed onder die sitplek geberg word en laer om te ontplooi. 'N Meganisme vir die onafhanklike werking van die opberging en ontplooiing van voetsteun is nie ingesluit by rolstoele op die mark nie, en PWC -gebruikers het die behoefte uitgespreek