INHOUDSOPGAWE:

Om ingeënt te word of nie? 'n Projek oor die waarneming van kudde -immuniteit deur simulasie van siektes: 15 stappe
Om ingeënt te word of nie? 'n Projek oor die waarneming van kudde -immuniteit deur simulasie van siektes: 15 stappe

Video: Om ingeënt te word of nie? 'n Projek oor die waarneming van kudde -immuniteit deur simulasie van siektes: 15 stappe

Video: Om ingeënt te word of nie? 'n Projek oor die waarneming van kudde -immuniteit deur simulasie van siektes: 15 stappe
Video: Происхождение человека: документальный фильм об эволюционном путешествии | ОДИН КУСОЧЕК 2024, November
Anonim
Om ingeënt te word of nie? 'n Projek oor die waarneming van kudde -immuniteit deur siektesimulasie
Om ingeënt te word of nie? 'n Projek oor die waarneming van kudde -immuniteit deur siektesimulasie

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 Adjacency Matrix
Skep Adjacency Matrix
Skep Adjacency Matrix
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

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

Plot aanvanklike grafiek
Plot 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: