Sisällysluettelo:
- Vaihe 1: Luo vierekkäismatriisi
- Vaihe 2: Luo suhteita
- Vaihe 3: Lisää sairaustilastoja
- Vaihe 4: Satunnaista mahdollisuus, että rokotettu ja rokottamaton henkilö voi saada tartunnan
- Vaihe 5: Luo matriiseja rokottamattomista ja tartunnan saaneista ihmisistä alustavien tietojen perusteella
- Vaihe 6: Piirrä alkukaavio
- Vaihe 7: Simuloi infektion etenemistä
- Vaihe 8: Käytä Monte Carlo -teoriaa
- Vaihe 9: Tee tiedosto ('infektioSim.m') simulaatiolla toimivaksi
- Vaihe 10: Laske rokottamattomien ja rokotettujen henkilöiden prosenttiosuus, jotka ovat saaneet tartunnan
- Vaihe 11: Luo tulostusmuuttuja toimintoon 'infekcijaSim.m'
- Vaihe 12: Luo valikko saadaksesi simulaation alkuehdot käyttäjältä
- Vaihe 13: Valitse % rokottamattomista ihmisistä ja laske rokottamattomien ja tartunnan saaneiden keskiarvo valitulle prosenttiosuudelle
- Vaihe 14: Kaavio: 'Infektion suuntaus rokottamattomissa vs. Rokotettu spesifiseen sairauteen '
- Vaihe 15: Lopputuote: Miltä simulaatio näyttää
Video: Rokotettava vai ei? hanke paimen immuniteetin havaitsemisesta sairaussimulaation avulla: 15 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:03
Katsaus projektiin:
Projektimme tutkii karjan koskemattomuutta ja toivoo rohkaisevansa ihmisiä rokotuksiin, jotta voidaan vähentää tartuntatautia yhteisöissämme. Ohjelmamme simuloi, kuinka sairaus tartuttaa väestön, jolla on eri prosenttiosuus rokotetuista ja rokottamattomista. Se osoittaa karjan koskemattomuuden osoittamalla, kuinka lisääntynyt määrä rokotettua väestöä voi vähentää tartunnan saaneiden ihmisten määrää.
Mallinnamme tämän Matlabissa graafiteorian käsitteiden avulla. Graafiteoria on matemaattinen tapa esittää objektien välisiä suhteita. Graafiteoriassa kuvaajalla on kärkiä (tai solmuja), jotka on liitetty reunoilla (tai viivoilla). Projektissamme solmut ovat asianomaisia henkilöitä ja reunat ovat niiden yhteyksiä. Jos esimerkiksi kaksi solmua on liitetty reunaan, se tarkoittaa, että he ovat "ystäviä" tai että heillä on jonkinlainen yhteys toisiinsa. Tämä kosketus on tapa taudin leviämiseen. Siksi käytimme graafiteoriaa konseptimme mallintamiseen, koska halusimme nähdä, miten tauti leviää populaatiossa olevien yksilöiden kesken.
Projektimme sisältää myös Monte Carlon menetelmän. Monte Carlo -menetelmä on algoritmeja, jotka luovat toistuvan satunnaisnäytteenoton numeeristen tulosten saamiseksi. Projektissamme käytämme tätä menetelmää simulaation suorittamiseen useita kertoja muuttamalla alkuperäisten rokottamattomien prosenttiosuutta nähdäksemme ihmisten tartuntaprosentin.
Kaikki projektikoodit on linkitetty alareunaan!
PC-luotto:
Matlab-linkki kuvaajateoriaan:
Vaihe 1: Luo vierekkäismatriisi
Luo uusi käsikirjoitus. Alamme kutsua infektiomme Sim.m.
Luomme muuttujan 'NUMOFPEOPLE'. Voit määrittää sen mihin tahansa kokonaislukuarvoon. Tämä edustaa väestönne ihmisten määrää.
Tästä lähtien oletamme sen
NUMOFPEOPLE = 20;
Aloita ensin käyttämällä Matlabin graafiteoriafunktioita ohjaamattomalle kuvaajalle.
Jos olet kiinnostunut oppimaan lisää, tässä on linkki, josta voit lukea siitä tarkemmin.
www.mathworks.com/help/matlab/math/directed-and-undirected-graphs.html
Luotu vierekkäismatriisi.
adjMatrix = nollia (NUMOFPEOPLE);
Tämä luo neliömatriisin 0s. Matriisin jokainen rivi on henkilö. Jokainen matriisin sarake on henkilö tai ystävä, jonka henkilö tapaa päivän aikana.
Katso kuva 100 (yllä) auttaaksesi visualisoimaan, miltä adjMatrix näyttää 20 henkilölle.
** Tästä lähtien oletamme, että NUMOFPEOPLE on 20. **
Voit yrittää piirtää tämän vierekkäismatriisin. Tässä on hieman lisätietoja tämän tyyppisten matriisien piirtämisestä.
Huomautus: Kuinka vierekkäismatriisi toimii.
Esimerkki:
%tekee viereisen matriisin
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] %piirtäminen g = kaavio (a); %käyttäen kuvaajafunktiota (kuvaajateoria) kuva (1); h = käyrä (g);
Katso kuva 1 (yllä), kuinka reunat lisätään vierekkäiseen matriisiin käyttämällä huomautuksen koodia.
Vaihe 2: Luo suhteita
Nyt kun ihmiset (pisteet tai solmut) on luotu, meidän on luotava suhteiden verkosto (kaavion viivat tai reunat). Tämä simuloi ihmisten vuorovaikutusta ja tapaa muita ihmisiä koko päivän.
Tämä voidaan tehdä monella tavalla. Yksi tapa suorittaa tämä tehtävä on antaa jokaiselle henkilölle ensin satunnaisluku sen määrittämiseksi, kuinka monen ihmisen kanssa hän on vuorovaikutuksessa päivässä.
numOfFriendsMatrix = randi ([lessFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);
Tämä tekee 1: 20 -matriisin satunnaisia kokonaislukuja, jotka edustavat vuorovaikutusten lukumäärää jokaisella päivässä. Tämän matriisin sarakkeet olisivat kutakin henkilöä vastaava luku. Jos esimerkiksi määritämme vähintäänFriendsPersonCanHave = 2 ja mostFriendsPersonCanHave = 5, saisimme satunnaiset arvot välillä 2 ja 5.
Onko sinulla vaikeuksia randin () kanssa? Kirjoita terminaaliin
apua randi
Seuraavaksi teemme satunnaistetun matriisin (nimeltään "allFriendsmatrix") siitä, miten jokainen väestön henkilö on yhteydessä/vuorovaikutuksessa populaation sisällä.
tempMatrix = ;
määrä = 0; allFriendsMatrix = ; k = 1: NUMOFPEOPLE, kun pituus (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; lämpötila = randi ([1, NUMOFPEOPLE]); tempMatrix (count) = lämpötila; loppu tyhjä jokaisen kun pituus (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; end allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; määrä = 0; loppuun
Koodin perusteellinen selitys:
Luomme ensin tyhjän väliaikaisen matriisin jokaisen kaveri-/vuorovaikutusluettelon säilyttämiseksi. Alustamme myös laskennan, joka vain seuraa, minne liittää uusi satunnainen yhteys tempMatrixiin. For -silmukat suoritetaan 20 kertaa niin, että tämä tapahtuu jokaiselle väestön henkilölle. Ensimmäinen silmukka kulkee, kunnes kunkin henkilön tempMatrix on sama pituus satunnaisesti määritellystä vuorovaikutuksesta. Tässä silmukassa luodaan satunnaisluku, joka vastaa väestön henkilöä ja sijoitetaan tempMatrixiin. Koska jokaisen tempMatrixin pituus on erilainen, meidän oli luotava joitakin NaN -arvoja, jotta voimme yhdistää nämä kaikki tempMaticies yhdeksi matriisiksi ('allFriendsMatrix'). Toinen silmukka ratkaisee tämän ongelman lisäämällä NaN -yhdisteitä kuhunkin tempMatrixiin. While -silmukka asetettiin toimimaan 9 kertaa, koska se on numero, joka on suurempi kuin 5, joka oli kavereiden yläraja, jolle henkilö voidaan määrittää. Arvo "9" on muuttuva ja sitä voidaan/täytyy muuttaa, kun "mostFriendsPersonCanHave" on suurempi kuin 9. Kolme viimeistä koodiriviä (lukuun ottamatta loppua) lisää tempMatrixin "allFriendsMatrix" -riville. Sitten se tyhjentää tempMatrixin ja laskee seuraavan henkilön.
Lähtö
Tämän ulostulon pitäisi näyttää ensimmäiseltä for -silmukan läpi (ennen kolmea viimeistä riviä).
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 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 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 NaN
Lisää seuraavaksi nämä suhteet adjMatrixiin.
jokaiselle riville = 1: NUMOFPEOPLE
for eachCol = 1: 9 if isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; loppu loppu loppu
Koodin selitys
Tämä kaksinkertainen silmukka kulkee jokaisen allFriendsMatrix -rivin ja sarakkeen läpi. If -lause suoritetaan kaikille arvoille, jotka eivät ole "NaN". Pohjimmiltaan se luo kaavion reunat tai viivat. Joten ensimmäinen rivi, jonka tämä tekee, on henkilö 1 henkilölle 16 ja henkilö 16 henkilölle 1. Koska se on suunnaton, 1 on muutettava molemmille! Meillä ei voi olla vain reuna 1-16 eikä 16-1. Niiden on oltava symmetrisiä, jotta se toimii oikein Matlabissa.
Simulaatiossamme totesimme, että ihmiset eivät voi olla vuorovaikutuksessa itsensä kanssa. Kun satunnaistimme arvot, on mahdollista, että viereisessä matriisissa on tämä virhe.
Korjataan tämä seuraavalla koodilla:
jokaiselle = 1: NUMOFPEOPLE
adjMatrix (kukin, jokainen) = 0; loppuun
Koodin selitys
Tämä silmukalle varmistaa, että henkilö 1 ei ole yhteydessä henkilöön 1, henkilö 2 ei ole yhteydessä henkilöön 2 jne. Tekemällä ne kaikki 0: ksi. matriisi vasemmalta ylhäältä alas oikealle ovat kaikki 0.
Lähtö
Tämä on viimeinen adjMatrix tälle nykyiselle simulaatiolle. Tämä vastaa kaikkia kaavion rivejä (kuva 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
Katso kuva 2 nähdäksesi adjMatrix -kaavion.
Vaihe 3: Lisää sairaustilastoja
Nyt kun ohjelmasi voi luoda kaavion, jossa on joukko satunnaisia ihmisiä ja luoda satunnaisia suhteita, meidän on syötettävä taudin tiedot tai tilastot nähdäksemme, kuinka nämä vuorovaikutukset populaatiossa voivat lisätä tai vähentää infektiota.
Luo nämä muuttujat:
unvacc %tyyppi: kaksinkertainen; prosenttiosuus siitä, että rokottamattomat ihmiset eivät saa sairautta
rokote %tyyppi: kaksinkertainen; prosenttiosuus siitä, että rokotetut eivät saa sairautta unvacc_perc %type: double; prosenttiosuus rokottamattomia init_infect %type: int; prosenttia rokotetuista väestöstä
Seuraavaksi meidän on tehtävä joitakin laskelmia.
Aiomme tehdä 'infektioMat', joka on 3*NUMOFPEOPLE -matriisi.
vacc_perc = 1-unvacc_perc;
infektioMat = nan (3, NUMOFPEOPLE); numero = pyöreä (vacc_perc * NUMOFPEOPLE); infektioMat (1, 1: luku) = rokote; infektioMat (1, luku+1: loppu) = unvacc; infektioMat (2, 1: loppu) = 0; infektioMat (2, 1: init_infect) = 1;
Koodin selitys
rivi 1: Rokottamattoman populaation prosenttiosuus laskettu
rivi 2: luo 3*N ihmismatriisi
rivi 3: selvitä rokotettujen määrä rokotetuista prosenttiosuuksista
rivi 4: Anna rokotetuille ihmisille rokotteen saamiseen liittyvä immuniteetti. Tämä arvo määritetään tautia koskevan tutkimuksen perusteella.
rivi 5: Muille väestöryhmille (rokottamattomat) annetaan heille prosenttiosuus. Tämä arvo määritetään tautia koskevan tutkimuksen perusteella.
rivi 6: aseta aluksi kaikki ihmiset tarttumatta.
rivi 7: alun perin tartunnan saaneiden lukumäärän osalta täytä pari ensimmäistä saraketta.
Nyt kun olemme asettaneet kaikki parametrit taudinsimulaatioon, aiomme satunnaistaa mahdollisuuden saada henkilö (sekä rokotettu että rokottamaton) tartunnan. Tämä tehdään seuraavassa vaiheessa määrittämällä satunnaisarvot väliltä 0 ja 1 kullekin tämän infektioMatin kolmannen rivin henkilölle.
Vaihe 4: Satunnaista mahdollisuus, että rokotettu ja rokottamaton henkilö voi saada tartunnan
Määritä seuraavaksi jokaiselle henkilölle satunnaisluku, jota käytetään myöhemmin sen määrittämiseen, saako henkilö tartunnan vai ei.
w = 1: pituus (infektioMat)
infektioMat (3, w) = randi; loppuun
Koodin selitys
Tämä silmukka käsittelee viimeisessä vaiheessa luodun infektioMatin kolmatta riviä. 'rand' määrittää arvon väliltä 0 ja 1 kullekin rivin 3 indeksille.
Lähtö
Matto on nyt valmis! Tämä oli väestö, joka oli 100% rokotettu ja 1 henkilö sai alkunsa.
infektioMat =
Sarakkeet 1-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,00 0,7500 Sarakkeet 0.7500 0.7500 0 0 0 0 0 0 0 0 0 0.0480 0.3593 0.2958 0.6291 0.1362 0.3740 0.8648 0.2503
rivi 1: prosenttiosuus siitä, että EI saa tautia
rivi 2: Tartunnan saaneita tai ei tartunnan saaneita (boolen arvo)
rivi 3: Numero, jolla tarkistetaan, saako tartunnan saamaton henkilö, jos hän tapaa tartunnan saaneen henkilön. Jos tartunnan saamaton henkilö kohtaa tartunnan saaneen henkilön, tämä luku on suurempi kuin rivillä 1 (samassa sarakkeessa) oleva luku, niin hän on saanut tartunnan. Koodaamme tämän toiminnon vaiheessa 7.
Vaihe 5: Luo matriiseja rokottamattomista ja tartunnan saaneista ihmisistä alustavien tietojen perusteella
Luo kaksi matriisia nimeltä "matrixUnvacc" ja "matrixInfected", jotka tallentavat kaikki tartunnan saaneet ihmiset infektioMat. Tätä käytetään, jotta voimme värikoodata kaavion tartunnan saaneista, rokottamattomista tai rokotetuista, mikä auttaa visualisoimaan rokottamattomien ja rokotettujen yksilöiden vaikutuksen.
tyhjennä jokainen
matrixInfected = ; matrixUnvacc = ; h = 1: pituus (infektioMat), jos infektioMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; loppu loppu henkilölle = 1: NUMOFPEOPLE, jos infektioMat (2, henkilö) == 1 matrixInfected = [matrixInfected, henkilö]; loppu loppu
Koodin selitys
Luo kaksi tyhjää matriisia rokottamattomien ja tartunnan saaneiden lukujen tallentamiseksi. Sekä silmukoille, jotka suoritetaan 20 kertaa, ja jos if -lauseke täyttyy, luku lisätään oikeaan matriisiin.
Lähtö
matrixUnvacc =
matrixInfected =
[1]
Vaihe 6: Piirrä alkukaavio
Seuraavaksi piirrämme vierekkäismatriisin.
g = kuvaaja (adjMatrix);
kuva (1) p = kaavio (g, 'NodeColor', 'b', 'MarkerSize', 7); korosta (p, matrixUnvacc, 'NodeColor', 'g') korosta (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title (['Prosentti rokottamattomista:', num2str (title_unvacc), '%']); tauko (nopeus)
Koodin selitys
Graafiteoria Matlabissa on sisäänrakennettuja toimintoja. Kun käytämme graph () -funktiota, pystymme kääntämään adjMatrixin todelliseksi suunnattuna kuvaajaksi. Meidän on sitten luotava juoni plot () -funktiolla nähdäksemme miltä se näyttää. Asetamme tämän käyrän () muuttujaksi, jotta voimme manipuloida ja muuttaa juonen värejä helpommin koko simulaation ajan. Kaikki ihmiset (tai solmut) on alun perin asetettu värille "sininen". Seuraavaksi kaikki rokottamattomat ihmiset asetetaan värille "vihreä". Tartunnan saaneet ihmiset asetetaan sitten punaiseksi. Otsikko määritetään testattavien rokottamattomien henkilöiden tietyn prosenttiosuuden mukaan. Pause () -toiminto pysäyttää väliaikaisesti MatLab -suorituksen. Kuljemme muuttuvan nopeuden läpi, joka leviää sekunneissa.
Katso kuva (yllä) nähdäksesi satunnainen värikoodattu kuvaaja.
Lue lisää MatLabin kohokohdasta ().
Vaihe 7: Simuloi infektion etenemistä
Seuraavaksi meidän on selvitettävä, kuka saa tartunnan vuorovaikutusten jälkeen (tallennettu adjMatrixiin) ja päivitettävä kaavio, kun joku saa tartunnan.
Käytä adjMatrixia määrittääksesi, mitkä ihmiset ovat saaneet tartunnan, kun he ovat vuorovaikutuksessa ihmisten kanssa päivässä.
jokaiselle riville = 1: pituus (adjMatrix)
jos infektioMat (2, jokainen rivi) == 1 jokaiselleCol = 1: pituus (adjMatrix) jos adjMatrix (eachRow, eachCol) == 1 % eachRow = henkilö % eachCol = sen ystävä % jokaisen ystävä ja katso, ovatko he saaneet tartunnan. jos infektioMat (3, jokainenCol)> infektioMat (1, jokainenCol) infektioMat (2, jokainenCol) = 1; korosta (p, eachCol, 'NodeColor', 'r') tauko (nopeus) loppu loppu loppu loppu
For -silmukka kiertää jokaisen henkilön läpi. Se tarkistaa, että jos henkilö on saanut tartunnan, se tarkistaa jokaisen ihmisen/ystävän, jonka kanssa hän on ollut vuorovaikutuksessa, ja tarkistaa, onko ystävän immuniteetti korkeampi kuin taudin vahvuus. Tässä tulee aikaisemmin luomamme 'infektioMat'. Ystävän jokaisen sarakkeen ensimmäistä ja kolmatta riviä verrataan, ja jos kolmas rivi on suurempi, se tarkoittaa, että ystävällä ei ollut riittävän korkeaa vastustuskykyä paeta tautia ja lopulta tarttuu. Vaihdamme myös värin korostamalla () punaiseksi, jos he saavat tartunnan.
Nyt simulaation koodisi pitäisi toimia! ja mitä tahansa väestökokoa varten, vaihda vain NUMOFPEOPLE!
Vaihe 8: Käytä Monte Carlo -teoriaa
Ottaaksemme tämän askeleen pidemmälle ja poimiaksemme tietoja simulaattoristamme ('infektioSim.m') halusimme laskea ja esittää kaavion trendistä prosenttiosuudesta rokottamattomista tartunnan saaneista ja tartunnan saaneista rokotetuista. Oletamme, että tartunnan saaneiden rokotettujen prosenttiosuuden tulisi olla paljon pienempi kuin rokottamattomien tartunnan saaneiden prosenttiosuus.
Vaihe 9: Tee tiedosto ('infektioSim.m') simulaatiolla toimivaksi
Jos haluat käyttää Monte Carloa, haluamme suorittaa simulaation useita kertoja ja kerätä tietoja, jotta voimme käyttää sitä kaavioon tartunnan saaneiden ihmisten prosenttiosuuksista.
Toiminto voidaan määrittää seuraavasti:
funktion lähtö = infektioSim (unvacc, rokote, NUMOFPEOPLE, unvacc_perc, init_infect, speed)
Kommentoi simulaatiosi muuttujia, koska nyt siirrät ne päätiedoston läpi (aloitamme tämän kirjoittamisen vaiheessa 12):
unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect
Uusi muuttuja
nopeus
määritetään päätiedostoon (Monte_Carlo.m).
Huomaa: Älä unohda funktiotiedoston alareunassa olevaa päätä lopettaaksesi toiminnon!
Vaihe 10: Laske rokottamattomien ja rokotettujen henkilöiden prosenttiosuus, jotka ovat saaneet tartunnan
Tämä laskee prosenttiosuuden rokottamattomista ihmisistä, jotka ovat saaneet tartunnan. Tämä koodi on infektioSim.m -tiedoston alareunassa.
lukumäärä_vahvistamaton = 0;
lukumäärä_infec_unvacc = 0; %laskee prosenttiosuuden rokottamattomista ihmisistä, jotka saivat tartunnan x = 1: pituus (infektioMat), jos infektioMat (1, x) == unvacc -lukumäärä_un_cc = lukumäärä_unvacc++; lopeta, jos infektioMat (1, x) == unvacc & infektioMat (2, x) == 1 luku_infec_unvacc = lukumäärä_infec_unvacc +1; lopussa loppu prosenttiosuus_unvaccc_and_infec = (lukumäärä_infec_unvacc / number_of_unvacc)*100;
Koodin selitys
For -silmukassa se silmukkaa yli NUMOFPEOPLE kertaa. Joka kerta, kun infektioMat -numero vastaa rokottamattomien lukumäärää (eli 0,95 == 0,95), rokottamattomien ihmisten lukumäärä kasvaa yhdellä. tartunnan saaneiden ja rokottamattomien määrä kasvaa yhdellä. Viimeinen rivi jakaa tartunnan saaneiden, rokottamattomien ihmisten määrän rokottamattomien henkilöiden kokonaismäärällä. Sitten lasketaan prosenttiosuus tästä.
Haaste:
Yritä laskea rokotettujen prosenttiosuus tartunnan saaneista! (Vinkki: se on hyvin samanlainen kuin yllä oleva koodi, mutta joitakin muuttujia muutetaan ja nimiä muutetaan.)
Seuraavaksi lasketaan tartunnan saaneiden prosenttiosuus koko väestön perusteella:
pre_per_infect = cumsum (infektioMat (2,:));
per_infect = (pre_per_infect (1, NUMOFPEOPLE)/NUMOFPEOPLE)*100;
Koodin selitys
Kumulatiivinen summa lasketaan käyttämällä infektioMatin toista riviä, joka tallentaa 1s ja 0s riippuen siitä, onko henkilö saanut tartunnan vai ei. Koska cumsum () -funktio antaa matriisin takaisin, otamme matriisin viimeisen arvon ('pre_per_infect (1, NUMOFPEOPLE)'), jonka pitäisi olla kaikkien infektionMat (2,:) 'arvojen todellinen summa. Jakamalla summa NUMOFPEOPLE: lla ja kertomalla sen 100: lla, saamme lopullisen tartunnan saaneiden prosenttiosuuden koko väestöstä.
Vaihe 11: Luo tulostusmuuttuja toimintoon 'infekcijaSim.m'
tuotos = [per_infect, prosenttiosuus_unvacc_and_infec, percent_of_vacc_and_infec];
Koodin selitys
Tallenna nämä tiedot ulostuloon, joka lähetetään takaisin pääkirjaan (Monte_Carlo.m), kun toiminto kutsutaan ja suoritetaan. Näitä tietoja käytetään kuvaamaan rokotettujen ja rokottamattomien tartunnan saaneiden prosenttiosuudet.
InfektioSim.m -toiminto on suoritettava nyt! Se ei kuitenkaan käynnisty, koska meidän on vielä kirjoitettava tärkein!
Vaihe 12: Luo valikko saadaksesi simulaation alkuehdot käyttäjältä
Muista, kuinka sanoimme muuttujan
nopeus
luodaan ja siirretään päätoiminnon kautta? Meidän on hankittava arvot, jotka välitetään funktiolle. Huomaa, että arvojärjestyksellä funktiota kutsuttaessa on väliä!
Aloita pyytämällä käyttäjää kirjoittamaan joitakin vastauksia päätteeseen.
> Valitse sairaus. Huomaa, että kirjainkoolla on merkitystä >> Hinkuyskä >> Flunssa >> Tuhkarokko >> Tauti Valittu: Flunssa >> Valitse populaation koko. >> 20 >> 200 >> Väestö valittu: 20 >> Valitse simulaation nopeus. >> Nopea >> Hidas >> Nopeus valittu: Nopea
Tämä alla oleva koodi kysyy käyttäjältä, mitä tautia hän haluaa tutkia.
disp ('Valitse tauti. Huomaa, että kirjainkoko on herkkä')
fprintf ('Pertussis / n Influenssa / nTuhkarokko / n') tauti = input ('Valittu tauti:', 's'); jos itsequal (tauti, 'hinkuyskä') rokote = 0,85; %15 prosentin mahdollisuus saada tauti unvacc =.20; %80 prosentin mahdollisuus saada tauti, jos rokote on sama (sairaus, 'flunssa') = 0,75; %25 prosentin mahdollisuus saada tauti unvacc =.31; %69 prosenttia mahdollisuus saada tauti, jos rokote on sama (sairaus, tuhkarokko) = 0,97; %3 prosentin mahdollisuus saada tauti unvacc =.10; 90 %todennäköisyys sairastua
Koodin selitys:
Disp () -toiminto tulostaa lausunnon näytölle ja tulostaa myös eri vaihtoehdot. Sairaus määritetään sen mukaan. Tämä versio ei tällä hetkellä ota huomioon virheellisiä syötteitä. Virheellinen syöttö aiheuttaa virheen ja pysäyttää ohjelman kokonaan. Jokaisella sairaudella on rokotus- ja rokottamattomat arvot. Nämä arvot EI ole satunnaisia. Nämä arvot saimme tutkimalla sairauksia koskevia tilastoja.
Seuraavaksi meidän on kysyttävä käyttäjältä, haluavatko he testata suuren tai pienen populaation kokoa valitulle taudilleen.
disp ('Valitse väestön koko.')
fprintf ('20 / n200 / n ') speed = input (' Väestö valittu: ',' s '); jos isequal (nopeus, '20') populaation_koko = 20; elseif isequal (nopeus, '200') populaation_koko = 200; loppuun
Koodin selitys
Tämä tulostaa käyttäjälle lausunnon ja pyytää käyttäjää syöttämään, minkä kokoisen väestön se haluaa testata. Tämä versio ei tällä hetkellä ota huomioon virheellisiä syötteitä. Virheellinen syöttö aiheuttaa virheen ja pysäyttää ohjelman kokonaan. 20 valittiin, koska se on pieni otoskoko, joka antaa edelleen hyvän käsityksen siitä, miten infektio leviää pienessä populaatiossa. Suuremmaksi vaihtoehdoksi valittiin 200 ihmistä, koska kaavioon piirretyissä 200 pisteessä oli tuskin päällekkäisyyksiä, joten kaikki oli helppo nähdä ja erottaa toisistaan.
Seuraavaksi meidän on löydettävä simulaation nopeus.
disp ('Valitse simulaation nopeus.')
fprintf ('Nopea / nHidas / n') nopeus = tulo ('Valittu nopeus:', 's'); jos isequal (nopeus, 'Nopea') sim_speed = 0; elseif isequal (nopeus, 'Hidas') sim_speed = 0.25; loppuun
Koodin selitys
Tämä prosessi oli sama kuin sairauslajin ja populaation koon saaminen. Nopeasti, taukoa ei tule. ja hitaalle, for -silmukassa on 0,25 sekunnin viive simulaatiota suoritettaessa.
Loistava! Nyt meillä on kaikki tarvitsemamme käyttäjän syötteet! Siirrytään keräämään tietoja eri prosenttiosuuksista rokottamattomia ihmisiä.
Vaihe 13: Valitse % rokottamattomista ihmisistä ja laske rokottamattomien ja tartunnan saaneiden keskiarvo valitulle prosenttiosuudelle
Tämä koodi on 0% rokottamattomista.
% ------- % 0 rokottamaton ------------
per_infect_av_0 = ; prosenttiosuus_unvacc_and_infec_av_0 = ; i = 1:20 ulos = infektioSim (unvacc, rokote, populaation koko, 0, 1, sim_nopeus); per_infect_av_0 = [per_infect_av_0, out (1, 1)]; percent_of_unvacc_and_infec_av_0 = [percent_of_unvacc_and_infec_av_0, out (1, 2)]; loppuun keskimääräinen_infektoitu_0 = keskiarvo (per_infect_av_0); keskimääräiset_vahingoittamattomat_ja tartunnan saaneet_0 = keskiarvo (prosenttiosuus_unvacc_and_infec_av_0);
Koodin selitys:
For -silmukka suoritetaan 20 kertaa. Funktion infektio Sim () ulostulo tallennetaan sisään. Aina kun for -silmukka suoritetaan, tartunnan saaneiden prosenttiosuus koko väestöstä lisätään matriisiin 'per_infect_av_0'. Lisäksi rokottamattomien ja tartunnan saaneiden prosenttiosuus lisätään joka kerta matriisiin 'percent_of_unvacc_and_infec_av_0'. Kahdella viimeisellä rivillä nämä kaksi edellä mainittua matriisia lasketaan keskiarvoksi ja tallennetaan muuttujiin. Yhteenvetona voidaan todeta, että prosentit tallennetaan kullekin simulaatiolle, lasketaan keskiarvo ja piirretään. Monte Carloa käytetään osoittamaan simulaation suorittamisen ja tuloksen näyttämisen keskiarvo. Kokeellisia tarkoituksia varten päätämme suorittaa simulaation 20 kertaa ja keskiarvoa nämä arvot.
Haaste:
Toista kaikki testattavat prosenttiosuudet! Tämä voidaan tehdä muuttamalla muuttujien nimiä prosenttilukujen mukaan. Testasimme 0%, 5%, 10%, 20%, 30%ja 50%.
Vihje:
Ainoa rivi, joka on muutettava todellisessa koodissa, on
ulos = infektioSim (unvacc, rokote, populaation_koko, 0, 1, sim_nopeus);
Muuta nolla prosentiksi desimaalimuodossa. Esimerkiksi 5%: n rokottamattoman simulaation tapauksessa 0 tulee korvata arvolla 0,5.
Vaihe 14: Kaavio: 'Infektion suuntaus rokottamattomissa vs. Rokotettu spesifiseen sairauteen '
Tämä on koodi, jonka avulla voidaan laatia kuvaaja rokottamattomien ja rokottamattomien henkilöiden tartunnan trendistä.
kaavio_mat_y = [keskimääräinen_infektoitu_0, keskimääräinen_infektoitu_5, keskimääräinen_infektoitu_10, keskimääräinen_infektoitu_20, keskimääräinen_infektoitu_30, keskimääräinen_infektoitu_50];
kaavio_mat_x = [0, 5, 10, 20, 30, 50]; kaltevuus = (keskimääräinen_infektoitu_5-keskimäärin_infektoitu_0)/5; line_y = [keskimääräinen_infektoitu_0, (kaltevuus*50)+keskimääräinen_infektoitu_0]; line_x = [0, 50]; kuvio (2) kuvaaja (graph_mat_x, graph_mat_y); line (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); otsikko (['Trend in Unvaccination for', tauti]); xlabel ('Prosentti alkuperäisestä rokottamattomasta'); ylabel ('Prosenttiosuus lopullisista tartunnan saaneista')
Koodin selitys
rivi 1: määritetty y -arvot tartunnan saaneiden prosenttiosuuksien keskiarvoille
rivi 2: määritetty x -arvo alkuperäisen rokottamattoman prosenttiosuuden prosenttiosuudelle
rivi 3: laske kaltevuus 0% ja 5%
rivi 4: tallenna rivin y -arvot. Tämä on jatkoa osuudelle 0–5 prosenttia.
rivi 5: tallenna rivin y -arvot. Tämä viiva ulottuu kaavion pituuteen.
rivi 6: luo kuva
rivi 7: Piirrä kaavion x ja y arvot rokottamattomien tartunnan saaneiden prosenttiosuuksista.
rivi 8: piirrä viiva. Tätä käytetään osoittamaan, että se ei kasva lineaarisesti, vaan eksponentiaalisesti.
rivi 9: Aseta kaavion otsikko.
rivi 10-11: Aseta x- ja y-tarrat kuvaajalle.
Nyt sinun pitäisi pystyä näkemään, että mitä suurempi prosenttiosuus väestöstä on rokottamattomia, sitä suurempia määriä tartuntoja. Näet myös, että suurin osa punaisista pisteistä on vihreitä, mikä osoittaa, että rokote auttaa jossain määrin! Toivottavasti pidit tästä opetusohjelmasta. Kommentoi, jos sinulla on kysyttävää!
Vaihe 15: Lopputuote: Miltä simulaatio näyttää
Kaikki koodit löytyvät täältä
Suositeltava:
IOT Home Automation DIY -hanke #1: 7 vaihetta
IOT Home Automation DIY -hanke # 1: # JOHDANTO Kotiautomaatio on kodinkoneiden, kuten AC, tuuletin, jääkaappi, valot ja luettelo, automatisointiprosessi, jotta niitä voidaan ohjata puhelimella, tietokoneella tai jopa etänä. Tämä projekti käsittelee esp2866
Arduino ELECTRONIC-DICE -hanke: 4 vaihetta
Arduino ELECTRONIC-DICE -projekti: Alkuperäinen idea oli osoitteesta https://www.instructables.com/id/Arduino-Project-E-Dice-Beginner/, A: n projekti. Jotkut parannukset on tehty, lisäsin LED ja äänitehosteet. Lisäksi käytin Arduino Leonardo -levyä, mutta en Arduino UNO -levyä, mutta t
Nimbus 1800 VTOL -hanke: 15 vaihetta
Nimbus 1800 VTOL -hanke: VTOL- tai pystysuora lentoonlähtö- tai laskulentokone on yksi parhaista kopterin ja lentokoneen yhdistämismalleista. se tarkoittaa, että yhdistämällä kopterin joustavuuden ja koneen kestävyyden, VTOL -drone voi olla paras ratkaisu itsenäiselle drone t
ITTT -hanke 2018 - Maa: 5 vaihetta
ITTT -hanke 2018 | Earth: Hei! Kouluni antoi minulle projektin, jossa minun piti luoda interaktiivinen järjestelmä Arduinon avulla ja rakentaa se tosielämässä. Päätin luoda maailman maapallon, jossa vuorovaikutuksesi antureiden ja painikkeiden kanssa valaisi maita ja saisi maapallon pyörimään
UTK EF 230 MarsRoomba -hanke syksyllä 2018: 5 vaihetta
UTK EF 230 MarsRoomba -hanke syksyllä 2018: Tällä hetkellä Mars -rovereita käytetään tietojen keräämiseen Marsin pinnalla eri menetelmillä, jotta voimme oppia lisää planeetan mahdollisuuksista mikrobielämään. Rovers käyttävät pääasiassa valokuvaus- ja maaperäanalyysityökaluja datan c