Taula de continguts:

Vols vacunar-te o no? un projecte sobre l'observació de la immunitat del ramat mitjançant la simulació de malalties: 15 passos
Vols vacunar-te o no? un projecte sobre l'observació de la immunitat del ramat mitjançant la simulació de malalties: 15 passos

Vídeo: Vols vacunar-te o no? un projecte sobre l'observació de la immunitat del ramat mitjançant la simulació de malalties: 15 passos

Vídeo: Vols vacunar-te o no? un projecte sobre l'observació de la immunitat del ramat mitjançant la simulació de malalties: 15 passos
Vídeo: La prevenció contra el virus del papil·loma humà a Catalunya 2024, De novembre
Anonim
Vols vacunar-te o no? un projecte sobre l'observació de la immunitat del ramat mitjançant la simulació de malalties
Vols vacunar-te o no? un projecte sobre l'observació de la immunitat del ramat mitjançant la simulació de malalties

Visió general del projecte:

El nostre projecte explora la immunitat del ramat i espera animar les persones a vacunar-se per disminuir les taxes d’infecció a les nostres comunitats. El nostre programa simula com una malaltia infecta una població amb diferents percentatges de taxes vacunades i no vacunades. Mostra la immunitat del ramat en mostrar com un nombre augmentat de la població vacunada pot disminuir el nombre de persones afectades.

El modelitzem a Matlab mitjançant conceptes de teoria de gràfics. La teoria de gràfics és una manera matemàtica de representar les relacions entre objectes. En teoria de gràfics, els gràfics tenen vèrtexs (o nodes) connectats per arestes (o línies). Per al nostre projecte, els nodes són els individus afectats i les vores són les seves connexions. Per exemple, si dos nodes estan connectats amb una vora, significa que són "amics" o que tenen algun tipus de contacte entre ells. Aquest contacte és una forma de propagació de la malaltia. És per això que hem utilitzat la teoria de gràfics per modelar el nostre concepte perquè volíem veure com la malaltia es propaga entre els individus que estan connectats en una població.

El nostre projecte també inclou el mètode Monte Carlo. El mètode de Monte Carlo són algorismes que creen mostreigs aleatoris repetits per rebre resultats numèrics. Al nostre projecte, fem servir aquest mètode per executar la nostra simulació diverses vegades canviant el percentatge de vacunes inicials per veure la velocitat d’infectació de les persones.

Tot el codi del projecte està enllaçat a la part inferior.

Crèdit per a PC:

Enllaç Matlab a la teoria de gràfics:

Pas 1: creeu una matriu d'adjacència

Crea una matriu d'adjacència
Crea una matriu d'adjacència
Crea una matriu d'adjacència
Crea una matriu d'adjacència

Creeu un script nou. Anomenarem la nostra "infectionSim.m".

Crearem una variable "NUMOFPEOPLE". Podeu assignar-lo a qualsevol valor enter. Això representarà el nombre de persones de la vostra població.

A partir d’ara, ho assumirem

NUMOFPEOPLE = 20;

Primer comenceu utilitzant les funcions de teoria de gràfics de Matlab per a un gràfic no dirigit.

Si esteu interessats en obtenir més informació, aquí teniu un enllaç per llegir-ne més a fons.

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

S'ha creat una matriu d'adjacència.

adjMatrix = zeros (NUMOFPEOPLE);

Això crearà una matriu quadrada de 0s. Cada fila de la matriu és una persona. Cada columna de la matriu és una persona o amic que la persona es troba al llarg del dia.

Consulteu la figura 100 (anterior) per ajudar a visualitzar l'aspecte de adjMatrix per a 20 persones.

** A partir d’aquest moment assumirem que NUMOFPEOPLE és igual a 20. **

Podeu provar de representar aquesta matriu d’adjacència. Aquí hi ha una mica més d’informació sobre el traçat d’aquest tipus de matrius.

Nota: Com funciona la matriu d'adjacència.

Ex:

% fent la matriu adjacent

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]% traçat g = gràfic (a); % utilitzant la funció de gràfics (teoria de gràfics) figura (1); h = trama (g);

Consulteu la figura 1 (anterior) per veure com afegir arestes a la matriu d'adjacència, mitjançant el codi de "Nota".

Pas 2: Creeu relacions

Crear relacions
Crear relacions

Ara que es creen les persones (vèrtexs o nodes), hem de crear una xarxa de relacions (línies o arestes del gràfic). Simularà com les persones interactuen i es troben amb altres persones al llarg d’un dia.

Això es pot fer de moltes maneres. Una manera de completar aquesta tasca és assignar primer un número aleatori a cada persona per determinar amb quantes persones interactuarà cada persona en un dia.

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

Això fa que una matriu d’1 per 20 d’enters aleatoris representi el nombre d’interaccions que cada persona té al dia. Les columnes d'aquesta matriu serien el nombre corresponent a cada persona. Per exemple, si assignem el mínimFriendsPersonCanHave = 2 i mostFriendsPersonCanHave = 5, obtindríem valors aleatoris entre 2 i 5.

Teniu problemes amb randi ()? Al terminal, escriviu

ajuda a randi

A continuació, fem una matriu aleatòria (anomenada "allFriendsmatrix") de com es connecta / interactua cada persona de la població dins de la població.

tempMatrix = ;

compte = 0; allFriendsMatrix = ; per a k = 1: NUMOFPEOPLE mentre que length (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (recompte) = temp; acabar neteja la longitud de cada un (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; end allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; compte = 0; final

Explicació detallada del codi:

Primer creem una matriu temporal buida per contenir la llista d'amics / interaccions de cada persona. També inicialitzem el recompte, que només fa un seguiment de la ubicació de la nova connexió aleatòria a la tempMatrix. Els bucles for s'executen 20 vegades de manera que això succeeix per a cada persona de la població. El primer bucle while s'executa fins que la tempMatrix de cada persona té la mateixa longitud del nombre d'interaccions assignat aleatòriament. En aquest bucle, es genera un número aleatori corresponent a la persona de la població i es col·loca a la tempMatrix. Com que les longituds de cadascun dels tempMatrixes són diferents, calia crear alguns valors de NaN per poder concatenar totes aquestes tempMaticies en una matriu ("allFriendsMatrix"). El segon bucle while resol aquest problema afegint NaN a cada tempMatrix. El bucle while es va configurar perquè s'executés 9 vegades perquè és un nombre superior a 5, que era el límit superior d'amics als quals es pot assignar una persona. El valor "9" és variable i es pot / s'ha de canviar quan "mostFriendsPersonCanHave" és superior a 9. Les tres darreres línies de codi (excloent el final) afegeixen tempMatrix a la següent fila de "allFriendsMatrix". A continuació, esborra tempMatrix i compta per a la següent persona.

Sortida

Així és com hauria de ser la sortida de la primera tirada pel bucle for (abans de les tres darreres línies).

tempMatrix = 16 8 17 16 13 NaN NaN NaN NaN

allFriendsMatrix =

16 8 17 16 13 NaN NaN NaN NaN 8 8 2 7 11 NaN NaN NaN NaN 10 13 NaN NaN NaN NaN NaN NaN NaN 11 17 2 NaN NaN NaN NaN NaN NaN 10 12 NaN NaN NaN NaN NaN NaN NaN 4 13 2 12 NaN NaN NaN NaN NaN 17 10 9 3 1 NaN NaN NaN NaN 16 16 6 NaN NaN NaN NaN NaN NaN 3 8 17 17 14 NaN NaN NaN NaN 20 19 3 NaN NaN NaN NaN NaN NaN 13 10 NaN NaN NaN NaN NaN NaN NaN 2 18 10 16 NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN NaN 8 16 14 8 NaN NaN NaN NaN NaN 7 7 NaN NaN NaN NaN NaN NaN NaN 19 10 9 NaN NaN NaN NaN NaN NaN 10 19 NaN NaN NaN NaN NaN NaN NaN 5 18 NaN NaN NaN NaN NaN NaN NaN 1 7 NaN NaN NaN NaN NaN NaN NaN 16 7 13 10 1 NaN NaN NaN NaN

A continuació, afegiu aquestes relacions a l'adjMatrix.

per a cada fila = 1: NUMOFPEOPLE

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

Explicació del codi

Aquest doble bucle passa per cada fila i columna de "allFriendsMatrix". La sentència if s'executarà per a tots els valors que no siguin "NaN". Bàsicament crearà les vores o línies del gràfic. Per tant, la primera línia que es farà és la persona 1 a la persona 16 i la persona 16 a la persona 1. Com que no està dirigida, cal canviar-ne 1 per a totes dues. No podem tenir només la vora 1 a 16 i no 16 a 1. Han de ser simètriques perquè funcioni correctament a Matlab.

A la nostra simulació, vam establir que les persones no poden interactuar amb elles mateixes. Quan hem aleatoritzat els valors, hi ha la possibilitat que la nostra matriu adjacent tingui aquests errors.

Fixem-ho amb el codi següent:

per a cada = 1: NUMOFPEOPLE

adjMatrix (cadascun, cadascun) = 0; final

Explicació del codi

Això per al bucle garanteix que la persona 1 no estigui connectada a la persona 1, la persona 2 no estigui connectada a la persona 2, etc. fent que tots siguin 0. Com es pot veure a continuació a la secció de sortida, tenim la diagonal del quadrat la matriu de la part superior esquerra a la part inferior dreta són tots els 0.

Sortida

Aquesta és l’adjMatrix final per a aquesta simulació actual. Això explica totes les línies del gràfic (Figura 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

Consulteu la figura 2 per veure el gràfic de "adjMatrix".

Pas 3: afegiu estadístiques de malalties

Ara que el vostre programa pot crear un gràfic amb un conjunt de persones aleatòries i crear relacions aleatòries, hem d’introduir la informació o estadístiques de la malaltia per veure com aquestes interaccions dins d’una població poden augmentar o disminuir la infecció.

Creeu aquestes variables:

unvacc% tipus: doble; percentatge de probabilitats que les persones no vacunades no pateixin la malaltia

tipus% vacc: doble; percentatge de probabilitats que les persones vacunades no pateixin la malaltia unvacc_perc% type: double; percentatge de població no vacunada init_infect% type: int; percentatge de població vacunada

A continuació, hem de fer alguns càlculs.

Farem un "infectionMat" que és una matriu de 3 * NUMOFPEOPLE.

vacc_perc = 1-unvacc_perc;

infectionMat = nan (3, NUMOFPEOPLE); número = ronda (vacc_perc * NUMOFPEOPLE); infectionMat (1, 1: nombre) = vac; infectionMat (1, número + 1: final) = unvacc; infectionMat (2, 1: end) = 0; infectionMat (2, 1: init_infect) = 1;

Explicació del codi

línia 1: percentatge de població no vacunada calculat

línia 2: creeu una matriu de 3 * N de persones

línia 3: esbrineu el nombre de persones vacunades a partir del percentatge vacunat

línia 4: per a les persones vacunades, doneu-los una immunitat associada amb la vacuna. Aquest valor s’assigna a partir de la investigació sobre la malaltia.

línia 5: per a la resta de la població (persones no vacunades), doneu-los el percentatge d’immunitat. Aquest valor s’assigna a partir de la investigació sobre la malaltia.

línia 6: inicialment estableix que totes les persones no estan infectades.

línia 7: per al nombre de persones infectades inicialment, empleneu les primeres dues columnes en conseqüència.

Ara que hem definit tots els paràmetres per a la simulació de la malaltia, anem a randomitzar la possibilitat que la persona (tant vacunada com no vacunada) s’infecti. Això es fa al següent pas assignant valors aleatoris entre 0 i 1 a cada persona de la tercera fila d'aquest "infectionMat".

Pas 4: randomitzeu la possibilitat que una persona vacunada i no vacunada es pugui infectar

A continuació, assigneu a cada persona un número aleatori, que s'utilitzarà més endavant per determinar si la persona està infectada o no.

per a w = 1: longitud (infectionMat)

infectionMat (3, w) = rand; final

Explicació del codi

Això per al bucle tracta de la tercera fila de la "infectionMat" creada a l'últim pas. 'rand' assigna un valor entre 0 i 1 a cada índex de la fila 3.

Sortida

infectionMat ja està complet. Va passar amb una població amb una vacunació del 100% i 1 persona infectada inicialment.

infectionMat =

Les columnes 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,0869 0,5489 0,3177 0,9927 0,7236 0,5721 0,7172 0,9766 0,4270 0,9130 0,8973 0,8352 Columnes 13 a través de 20 0,7500 0,7500 0,7500 0,7500 0,7500 0,7500 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

fila 1: percentatge de probabilitats de NO contraure la malaltia

fila 2: infectada o no infectada (valor booleà)

fila 3: número que s’utilitza per comprovar si una persona que no està infectada s’infecta si es troba amb una persona infectada. Si la persona no infectada es troba amb la persona infectada, aquest nombre és superior al número de la fila 1 (per a la mateixa columna), llavors està infectat. Codificarem aquesta funcionalitat al pas 7.

Pas 5: creeu matrius de persones sense vacunar i infectades a partir de la informació inicial

Creeu dues matrius anomenades "matrixUnvacc" i "matrixInfected" que emmagatzemen totes les persones infectades de infectionMat. S’utilitzarà per poder codificar per colors el gràfic de les persones infectades, no vacunades o vacunades, ajudant a visualitzar l’impacte d’individus no vacunats versus vacunats.

netejar cadascun

matrixInfected = ; matrixUnvacc = ; per a h = 1: longitud (infectionMat) si infectionMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; end end for person = 1: NUMOFPEOPLE if infectionMat (2, persona) == 1 matrixInfected = [matrixInfected, persona]; fi final

Explicació del codi

Creeu dues matrius buides per emmagatzemar el nombre de persones que no estan vacunades i infectades, respectivament. Tant per a bucles s’executen 20 vegades com si es compleix la sentència if, el número s’afegeix a la matriu correcta.

Sortida

matrixUnvacc =

matrixInfected =

[1]

Pas 6: representar el gràfic inicial

Gràfic inicial de la trama
Gràfic inicial de la trama

A continuació, traçarem la matriu d'adjacència.

g = gràfic (adjMatrix);

figura (1) p = plot (g, 'NodeColor', 'b', 'MarkerSize', 7); ressaltar (p, matrixUnvacc, 'NodeColor', 'g') ressaltar (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc * 100; title (['Percentatge de persones sense vacunar:', num2str (title_unvacc), '%']); pausa (velocitat)

Explicació del codi

La teoria de gràfics a Matlab ha incorporat funcions. Quan fem servir la funció graph (), podem traduir el "adjMatrix" a un gràfic real no dirigit. Després hem de crear una trama mitjançant la funció plot () per veure realment el seu aspecte. Establim aquesta trama () a una variable perquè puguem manipular i canviar els colors de la trama amb més facilitat al llarg de la simulació. Totes les persones (o nodes) es defineixen inicialment al color "blau". A continuació, totes les persones no vacunades es configuren al color "verd". Les persones infectades es configuren al color "vermell". El títol s’estableix segons el percentatge determinat de persones no vacunades que s’estan provant. La funció pause () atura temporalment l'execució de MatLab. Passem per la velocitat variable que es distribueix que es calcula en segons.

Vegeu la imatge (a sobre) per veure un gràfic aleatori amb codis de colors.

Obteniu més informació sobre la funció de ressaltat () a MatLab.

Pas 7: Simuleu la progressió de la infecció

A continuació, hem d'esbrinar qui s'infecta després de les interaccions (registrades a l'adjMatrix) i actualitzar el gràfic quan algú s'infecta.

Utilitzeu l'adjMatrix per determinar quines persones estan infectades després de les seves interaccions amb persones en un dia.

per a cada fila = 1: longitud (adjMatrix)

if infectionMat (2, eachRow) == 1 for eachCol = 1: length (adjMatrix) if adjMatrix (eachRow, eachCol) == 1% eachRow = la persona% eachCol = el seu amic% amic de cada persona i veure si estan infectats. si infectionMat (3, eachCol)> infectionMat (1, eachCol) infectionMat (2, eachCol) = 1; ressaltar (p, eachCol, 'NodeColor', 'r') pausa (velocitat) final extrem extrem extrem extrem

El bucle for passa per cada persona. Comprova que si la persona està infectada, comprovarà cadascuna de les persones / amic amb qui ha interaccionat i comprovarà si el nivell d’immunitat de l’amic és superior a la força de la malaltia. Aquí és on entra en joc el “infectionMat” que vam crear anteriorment. Es compara la primera i la tercera fila de cada columna de l’amic i, si la tercera fila és més gran, significa que l’amic no tenia la immunitat suficient per escapar de la malaltia i, finalment, es va infectar. També canvem de color amb el ressaltat () a vermell si s’infecten.

Ara el vostre codi per a la simulació hauria de funcionar. i per a qualsevol mida de població, només cal canviar NUMOFPEOPLE.

Pas 8: utilitzeu la teoria de Monte Carlo

Per fer aquest pas més enllà i extreure dades del nostre simulador ("infectionSim.m"), volíem calcular i representar gràficament la tendència en percentatge de persones no vacunades que es van infectar i en el percentatge de persones vacunades que es van infectar. Suposem que el percentatge de persones vacunades que s’han infectat hauria de ser molt inferior al percentatge de persones que no s’han infectat.

Pas 9: Feu el fitxer ('infectionSim.m') amb la simulació en una funció

Per executar Montecarlo, voldríem executar la simulació diverses vegades i acumular dades per poder utilitzar-les per representar gràficament els percentatges de persones infectades.

La funció es podria configurar així:

funció de sortida = infectionSim (unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, speed)

Comenteu les variables de la simulació ja que ara les esteu passant pel fitxer principal (començarem a escriure-ho al pas 12):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

La nova variable

velocitat

s’assignarà al fitxer principal (Monte_Carlo.m).

Nota: no oblideu el final a la part inferior del fitxer de funcions per acabar la funció.

Pas 10: calculeu el percentatge de persones no vacunades i vacunades que s'han infectat

Es calcula el percentatge de persones no vacunades que s’han infectat. Aquest codi va a la part inferior del fitxer "infectionSim.m".

nombre_de_unvacc = 0;

nombre_de_infec_unvacc = 0; % calcula el percentatge de persones sense vacunar infectades per x = 1: longitud (infectionMat) si infectionMat (1, x) == unvacc number_of_unvacc = number_of_unvacc + 1; finalitzar si infectionMat (1, x) == unvacc & infectionMat (2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; end end percentatge_de_unvacc_i_infec = (nombre_de_infec_unvacc / nombre_de_unvacc) * 100;

Explicació del codi

Al bucle for, repetirà NUMOFPEOPLE vegades. Cada vegada que el número de l’infectionMat correspon al nombre de vacunes (és a dir, 0,95 == 0,95), el nombre de persones no vacunades s’incrementarà en 1. Cada vegada que el nombre de infectMat correspon al nombre de vacunes i estarà infectat, el nombre de persones infectades i no vacunades augmenta en 1. L’última línia divideix el nombre de persones infectades i no vacunades pel nombre total de persones no vacunades. A continuació, es calcula el percentatge a partir d’aquest.

Desafiament:

Proveu de calcular el percentatge de persones vacunades infectades. (Consell: és molt similar a aquest codi anterior, tot i que algunes de les variables es canvien i s’ajusten els noms.)

A continuació, es calcula el percentatge de persones infectades en funció de la població total:

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

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

Explicació del codi

La suma acumulativa es calcula mitjançant la segona fila de la infectionMat, que emmagatzema 1s i 0s en funció de si la persona està infectada o no. Com que la funció cumsum () retorna una matriu, prenem l'últim valor de la matriu ('pre_per_infect (1, NUMOFPEOPLE)'), que hauria de ser la suma real de tots els valors de 'infectionMat (2,:)'. En dividir la suma per NUMOFPEOPLE i multiplicar-la per 100, obtenim el percentatge final d’infectats en la població total.

Pas 11: creeu una variable de sortida a la vostra funció "infectionSim.m"

sortida = [per_infecte, percentatge_de_unvacc_i_infec, percentatge_de_vacc_i_infec];

Explicació del codi

Emmagatzemeu aquesta informació a la sortida, que s’enviarà de nou a main (Monte_Carlo.m) quan es cridi i s’executi la funció. Aquestes dades s’utilitzen per representar gràficament els punts del percentatge d’infectats de les persones vacunades i no vacunades.

La vostra funció "infectionSim.m" s'hauria de fer ara. Tot i això, no funcionarà perquè encara hem d’escriure el principal.

Pas 12: Creeu un menú per obtenir de l'usuari les condicions inicials de la simulació

Recordeu com hem dit la variable

velocitat

es crearia i passaria per la funció principal? Hem d’obtenir els valors per passar a la funció. Tingueu en compte que l’ordre dels valors en cridar la funció és important.

Comenceu demanant a l’usuari que escrigui algunes respostes al terminal.

> Tria una malaltia. Tingueu en compte que distingeix entre majúscules i minúscules >> Tos ferina >> Gri >> Sarampió >> Malaltia escollida: grip >> Escolliu la mida de la població. >> 20 >> 200 >> Població escollida: 20 >> Selecciona la velocitat de simulació. >> Ràpid >> Lent >> Velocitat escollida: Ràpid

Aquest codi següent demana a l'usuari quina malaltia vol examinar.

disp ("Tria una malaltia. Tingues en compte que és sensible a les majúscules i minúscules")

fprintf ('Tos ferina / nFlu / nMarles / n') malaltia = entrada ('Malaltia escollida:', 's'); si és desigual (malaltia, 'Tos ferina') vac = 0,85; Un 15% de probabilitats de patir unvacc de la malaltia = 0,20; Un 80% de probabilitats d’obtenir una altra malaltia si la vacuna és igual (malaltia, "grip") =, 75; Un 25% de probabilitats de patir unvacc de la malaltia =, 31; % 69% de probabilitats d’obtenir una altra malaltia si la vacuna és igual (malaltia, xarampió) =, 97; Un 3% de probabilitats de patir unvacc de la malaltia =, 10; Un 90% de probabilitats d’acabar amb la malaltia

Explicació del codi:

La funció disp () imprimeix la sentència a la pantalla i també imprimeix les diferents opcions. La malaltia s’assignarà en conseqüència. Actualment, aquesta versió no té en compte dades d'entrada no vàlides. Una entrada no vàlida produirà un error i aturarà completament el programa. Cada malaltia té valors de vacunes i vacunes associades. Aquests valors NO són aleatoris. Hem obtingut aquests valors a partir de la investigació d’estadístiques sobre les malalties.

A continuació, hem de preguntar a l'usuari si vol provar una població gran o petita per a la malaltia escollida.

disp ("Seleccioneu la mida de la població".)

fprintf ('20 / n200 / n ') speed = input (' Població escollida: ',' s '); si isequal (speed, '20') population_size = 20; elseif isequal (speed, '200') population_size = 200; final

Explicació del codi

Això imprimeix una declaració a l'usuari i demana a l'usuari que introdueixi quina mida de població vol provar. Actualment, aquesta versió no té en compte dades d'entrada no vàlides. Una entrada no vàlida produirà un error i aturarà completament el programa. 20 es va recollir perquè és una mida de mostra petita que encara dóna una bona idea de com s’estén la infecció a una població petita. Es va escollir 200 persones com a opció més gran perquè 200 punts representats al gràfic amb prou feines tenien solapament de punts, de manera que tot es podia veure i distingir fàcilment els uns dels altres.

A continuació, hem de trobar la velocitat de la simulació.

disp ("Selecciona la velocitat de simulació.")

fprintf ('Fast / nLent / n') speed = input ('Velocitat triada:', 's'); si isequal (speed, 'Fast') sim_speed = 0; elseif isequal (speed, 'Slow') sim_speed = 0,25; final

Explicació del codi

Aquest procés va ser el mateix que obtenir el tipus de malaltia i la mida de la població. Per al ràpid, no hi haurà cap pausa. i per a lents, hi haurà un retard de 0,25 segons al bucle for quan s'executa la simulació.

Genial! Ara tenim totes les aportacions de l'usuari que necessitem. Passem a recopilar dades sobre diferents percentatges de persones sense vacunar.

Pas 13: trieu un% de persones sense vacunar i calculeu la mitjana de persones no vacunades i infectades pel percentatge escollit

Aquest codi és per al 0% de les persones no vacunades.

% -------% 0 sense vacunar ------------

per_infect_av_0 = ; percentatge_de_unvacc_i_infec_av_0 = ; for i = 1:20 out = infectionSim (unvacc, vacc, population_size, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, fora (1, 1)]; percentatge_de_unvacc_i_infec_av_0 = [percentatge_de_unvacc_i_infec_av_0, fora (1, 2)]; end average_infected_0 = mitjana (per_infect_av_0); average_unvacc_and_infected_0 = mitjana (percentatge_de_unvacc_i_infec_av_0);

Explicació del codi:

El bucle for s'executa 20 vegades. La sortida de la funció, infectionSim (), s’emmagatzema dins. Cada vegada que s'executa el bucle for, el percentatge d'infectats de la població total s'afegeix a la matriu "per_infect_av_0". A més, el percentatge de persones no vacunades i infectades també s’afegeix a la matriu "percentatge_de_unvacc_i_infec_av_0". A les dues últimes línies, aquestes dues matrius esmentades es fan després una mitjana i s’emmagatzemen en variables. En resum, els percentatges s’emmagatzemen per a cada simulació, es fan una mitjana i es representen gràficament. Monte Carlo s'utilitza per mostrar el valor mitjà d'executar una simulació i mostrar el resultat. Per als nostres propòsits experimentals, decidim executar la simulació 20 vegades i fer una mitjana d’aquests valors.

Desafiament:

Repetiu-ho per a tots els percentatges que vulgueu provar. Això es pot fer canviant els noms de les variables segons els percentatges. Hem fet proves de 0%, 5%, 10%, 20%, 30% i 50%.

Pista:

L'única línia que s'ha de canviar al codi real és

out = infectionSim (unvacc, vacc, size_population, 0, 1, sim_speed);

Canvieu el zero al percentatge en forma decimal. Per exemple, per a una simulació no vacunada al 5%, el 0 s’ha de substituir per 0,5.

Pas 14: gràfic: "La tendència de la infecció en Vs. no vacunats. Vacunat per a malalties específiques"

Aquest és el codi per fer un gràfic de la tendència de la infecció en persones no vacunades versus persones no vacunades.

graph_mat_y = [average_infected_0, average_infected_5, average_infected_10, average_infected_20, average_infected_30, average_infected_50];

graph_mat_x = [0, 5, 10, 20, 30, 50]; pendent = (average_infected_5-average_infected_0) / 5; línia_y = [mitjana_infectada_0, (pendent * 50) + mitjana_infectada_0]; línia_x = [0, 50]; figura (2) gràfic (graph_mat_x, graph_mat_y); line (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); title (["Tendència en la vacunació per a", malaltia]); xlabel ('Percentatge de vacunes inicials'); ylabel ("Percentatge d'infectats finals")

Explicació del codi

línia 1: es van assignar valors y a les mitjanes del percentatge d’infectats

línia 2: s'ha assignat valors x al percentatge de percentatge inicial sense vacunar

línia 3: calculeu la pendent del 0% i del 5%

línia 4: emmagatzema els valors de la línia. Aquesta és una continuació de la secció del 0% al 5%.

línia 5: emmagatzema els valors de la línia. Aquesta línia abasta la longitud del gràfic.

línia 6: crear figura

línia 7: traça els gràfics dels valors xy del percentatge d’infectats que no estan vacunats.

línia 8: traça la línia. S’utilitza per demostrar que no augmenta linealment, sinó exponencialment.

línia 9: defineix el títol del gràfic.

línia 10-11: defineix les etiquetes xy per al gràfic.

Ara hauríeu de poder comprovar que el major percentatge de la població sense vacunar, major quantitat d’infecció. També veureu que la majoria dels punts que es tornen vermells són punts verds, cosa que demostra que la vacuna ajuda fins a cert punt. Espero que us hagi agradat aquest tutorial. Comenta si tens cap pregunta!

Pas 15: producte final: aspecte de la simulació

Tot el codi es pot trobar aquí

Recomanat: