Мазмұны:

Вакцинациялау керек пе, жоқ па? Ауруларды имитациялау арқылы табынның иммунитетін бақылау жөніндегі жоба: 15 қадам
Вакцинациялау керек пе, жоқ па? Ауруларды имитациялау арқылы табынның иммунитетін бақылау жөніндегі жоба: 15 қадам

Бейне: Вакцинациялау керек пе, жоқ па? Ауруларды имитациялау арқылы табынның иммунитетін бақылау жөніндегі жоба: 15 қадам

Бейне: Вакцинациялау керек пе, жоқ па? Ауруларды имитациялау арқылы табынның иммунитетін бақылау жөніндегі жоба: 15 қадам
Бейне: Мен мәжбүрлі вакцинацияға қарсымын!!! Әр адам өзі шешу керек, вакцина керек пе оған, жоқ па... 2024, Шілде
Anonim
Вакцинациялау керек пе, жоқ па? Ауруларды имитациялау арқылы табынның иммунитетін бақылау жобасы
Вакцинациялау керек пе, жоқ па? Ауруларды имитациялау арқылы табынның иммунитетін бақылау жобасы

Жобаға шолу:

Біздің жоба табынның иммунитетін зерттейді және біздің қауымдастықтардағы инфекцияны төмендету үшін адамдарды вакцинациялауға шақырады деп үміттенеді. Біздің бағдарлама аурудың вакцинацияланған және вакцинацияланбаған мөлшерлемелері әр түрлі болатын халықты қалай жұқтыратынын модельдейді. Бұл вакцинацияланған популяция санының зардап шеккен адамдардың санын қалай азайтуға болатынын көрсете отырып, табынның иммунитетін көрсетеді.

Біз мұны Matlab -те графикалық теория ұғымдарын қолдана отырып модельдейміз. Графикалық теория - бұл объектілер арасындағы қатынастарды көрсетудің математикалық әдісі. Графика теориясында графиктер шеттермен (немесе сызықтармен) қосылған шыңдарға (немесе түйіндерге) ие. Біздің жоба үшін түйіндер - бұл жеке тұлғалар, ал шеттер - олардың байланысы. Мысалы, егер екі түйін жиекпен байланысқан болса, бұл олардың «дос» екенін немесе бір -бірімен қандай да бір байланыс түріне ие екенін білдіреді. Бұл байланыс аурудың таралу жолы болып табылады. Біз график теориясын тұжырымдаманы модельдеу үшін қолдандық, өйткені біз популяцияда байланысқан адамдар арасында аурудың қалай таралатынын көргіміз келді.

Біздің жоба Монте -Карло әдісін де қамтиды. Монте -Карло әдісі - сандық нәтижелерді алу үшін қайталама кездейсоқ іріктеуді құратын алгоритмдер. Біздің жобада біз бұл әдісті қолданамыз, бұл адамдармен жұқтыру жылдамдығын көру үшін имитацияланбағанның пайызын бірнеше рет өзгертеді.

Жобаның барлық коды төменде көрсетілген!

ДК несиесі:

Графикалық теорияға Matlab сілтемесі:

1 -қадам: көршілес матрицаны құрыңыз

Көршілес матрицаны құру
Көршілес матрицаны құру
Көршілес матрицаны құру
Көршілес матрицаны құру

Жаңа сценарий жасаңыз. Біз өзіміздің жұқпалы ауруды «Sim.m» деп атаймыз.

Біз 'NUMOFPEOPLE' айнымалысын жасамақпыз. Сіз оны кез келген бүтін санға тағайындай аласыз. Бұл сіздің тұрғындарыңыздың санын көрсетеді.

Бұдан былай біз мұны болжаймыз

NUMOFPEOPLE = 20;

Алдымен бағытталмаған график үшін Matlab графикалық теориясының функцияларын қолданыңыз.

Егер сіз көбірек білгіңіз келсе, бұл туралы толығырақ оқуға арналған сілтеме.

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

Көршілес матрица құрылды.

adjMatrix = нөлдер (NUMOFPEOPLE);

Бұл 0s квадрат матрицасын жасайды. Матрицаның әр жолы - адам. Матрицадағы әрбір баған - бұл адам күні бойы кездесетін адам немесе дос.

AdMatrix 20 адамға қалай ұқсайтынын елестету үшін 100 -суретті қараңыз (жоғарыда).

** Осы сәттен бастап біз NUMOFPEOPLE 20 -ға тең деп есептейміз. **

Сіз бұл іргелес матрицаны құруға тырысуға болады. Міне, матрицаның осы түрлерін салу туралы қосымша ақпарат.

Ескерту: іргелес матрица қалай жұмыс істейді.

Мысалы:

%іргелес матрицаны құрайды

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] %сызу g = график (а); %графикалық функцияны қолдана отырып (графика теориясы) фигура (1); h = сюжет (g);

1 -суретті қараңыз (жоғарыда) «Ескертудегі» кодты пайдаланып, іргелес матрицада жиектерді қалай қосу керектігін қараңыз.

2 -қадам: Қарым -қатынас орнатыңыз

Қарым -қатынас құру
Қарым -қатынас құру

Енді адамдар (төбелер немесе түйіндер) құрылды, біз қарым -қатынас желісін құруымыз керек (сызықтар немесе графиктің шеттері). Бұл адамдардың бір күн бойы басқа адамдармен қалай қарым -қатынас жасайтынын модельдейді.

Мұны көптеген жолдармен жасауға болады. Бұл тапсырманы орындаудың бір жолы - алдымен әр адамға күніне қанша адаммен қарым -қатынас жасайтынын анықтау үшін кездейсоқ сан тағайындау.

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

Бұл әр адамға тәуліктік әсер ету санын білдіретін кездейсоқ бүтін сандардың 1 -ден 20 -ға дейінгі матрицасын құрайды. Бұл матрицаның бағандары әр адамға сәйкес келетін сан болады. Мысалы, егер біз ең азFriendsPersonCanHave = 2 және mostFriendsPersonCanHave = 5 тағайындасақ, біз кездейсоқ мәндерді 2 мен 5 аралығында аламыз.

Randi () проблемасы бар ма? Терминалда теріңіз

Рандиға көмектес

Әрі қарай, біз популяциядағы әрбір адамның популяция ішінде қалай байланысатыны/өзара әрекеттесетіні туралы рандомизацияланған матрицаны («allFriendsmatrix» деп аталады) жасаймыз.

tempMatrix = ;

санау = 0; allFriendsMatrix = ; k = 1 үшін: NUMOFPEOPLE while while (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (санау) = уақытша; соңы әр уақыттың ұзақтығын анықтайды (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; соңы allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; санау = 0; Соңы

Кодты терең түсіндіру:

Алдымен біз әр адамның достарын/қарым -қатынас тізімін сақтау үшін бос уақытша матрицаны құрамыз. Біз сондай -ақ tempMatrix -те жаңа кездейсоқ қосылымды қайда жабыстыруды қадағалайтын санауды инициализациялаймыз. Бұл цикл 20 рет орындалады, осылайша бұл популяциядағы әрбір жеке адам үшін болады. Бірінші уақыт циклы әр адамның tempMatrix кездейсоқ тағайындалған өзара әрекеттесулер санының ұзындығына дейін жұмыс істейді. Бұл циклде популяциядағы адамға сәйкес кездейсоқ сан құрылады және tempMatrix -ке орналастырылады. Әр tempMatrixes ұзындығы әр түрлі болғандықтан, біз барлық tempMaticies -ді бір матрицаға біріктіру үшін кейбір NaN мәндерін жасауымыз керек болды ('allFriendsMatrix'). Екінші while циклы бұл мәселені әрбір tempMatrix -ке NaN қосу арқылы шешеді. Уақытша цикл 9 рет іске қосылды, себебі бұл 5 -тен үлкен сан, бұл адамға тағайындалатын достардың жоғарғы шегі болды. '9' мәні айнымалы болып табылады және 'mostFriendsPersonCanHave' 9 -дан үлкен болғанда өзгеруі мүмкін/өзгертілуі керек Соңғы үш код жолы (соңын қоспағанда) tempMatrix -ті 'allFriendsMatrix' келесі жолына қосады. Содан кейін ол tempMatrix өшіреді және келесі адамға есептеледі.

Шығу

Бұл for циклі арқылы бірінші рет орындалу үшін шығыс қалай көрінуі керек (соңғы үш жолдың алдында).

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 NaN 10 13 NaN NaN NaN NaN 11 17 2 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 NaN 8 16 14 8 NaN NaN NaN NaN NaN 7N NaN NaN NaN NaN NaN 19 10 9 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

Содан кейін бұл қатынастарды adjMatrix -ке қосыңыз.

eachRow = 1 үшін: NUMOFPEOPLE

eachCol үшін = 1: 9, егер isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; соңы соңы соңы

Кодты түсіндіру

Бұл циклге арналған қосарлы «allFriendsMatrix» әр жолы мен бағанынан өтеді. If операторы «NaN» емес барлық мәндер үшін жұмыс істейді. Негізінде бұл графиктің шеттерін немесе сызықтарын жасайды. Сонымен, бұл бірінші жол - 1 адамнан 16 адамға және 16 адамнан 1 адамға. Ол бағытталмағандықтан, екеуіне де 1 өзгерту керек! Бізде 1 -ден 16 -ға дейін емес, 16 -дан 1 -ге дейінгі шеттер болуы мүмкін емес, олар Matlab -те дұрыс жұмыс істеуі үшін олар симметриялы болуы керек.

Біздің модельдеуде біз адамдар өз -өзімен қарым -қатынас жасай алмайтынын анықтадық. Мәндерді кездейсоқ таңдаған кезде, біздің көршілес матрицада мұндай қателіктер болуы мүмкін.

Келесі кодты түзетейік:

әрқайсысы үшін = 1: NUMOFPEOPLE

adjMatrix (әрқайсысы, әрқайсысы) = 0; Соңы

Кодты түсіндіру

Бұл цикл 1 -адамға 1 -ге, 2 -ші адамға 2 -ге қосылмайтындығына кепілдік береді және олардың барлығын 0 етіп жасайды. Төменде шығыс бөлімінде көріп тұрғаныңыздай, бізде шаршының диагоналы бар. жоғарыдан төменге оңға қарай матрицаның барлығы 0 -ге тең.

Шығу

Бұл ағымдағы модельдеудің соңғы адматрицасы. Бұл графиктің барлық жолдарын көрсетеді (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

'AdjMatrix' графигін көру үшін 2 -суретті қараңыз.

3 -қадам: Аурулар статистикасын қосыңыз

Енді сіздің бағдарламаңыз кездейсоқ адамдар жиынтығымен диаграмма құра алады және кездейсоқ қарым -қатынас жасай алады, біз популяциядағы бұл өзара әрекеттесудің инфекцияны қалай арттыруға немесе азайтуға болатынын білу үшін аурудың ақпаратын немесе статистикасын енгізуіміз керек.

Мына айнымалыларды жасаңыз:

unvacc %түрі: қос; вакцинацияланбаған адамдардың ауруды жұқтырмау ықтималдығы

вакцина %түрі: қосарланған; вакцинацияланған адамдардың ауруға шалдықпау ықтималдығы %unvacc_perc %түрі: екі есе; популяция пайызы вакцинацияланбаған init_infect %түрі: int; халықтың пайызы вакцинацияланған

Әрі қарай біз бірнеше есептеулер жүргізуіміз керек.

Біз 3*NUMOFPEOPLE матрицасы болатын 'infekMat' жасамақпыз.

vac_perc = 1-unvacc_perc;

инфекцияMat = nan (3, NUMOFPEOPLE); сан = дөңгелек (вакцина_перц * NUMOFPEOPLE); инфекцияMat (1, 1: сан) = вакцина; инфекцияMat (1, сан+1: соңы) = unvacc; инфекцияMat (2, 1: соңы) = 0; инфекцияMat (2, 1: init_infect) = 1;

Кодты түсіндіру

1 -жол: вакцинацияланбаған халықтың пайызы есептеледі

2 -жол: 3*N адам матрицасын жасаңыз

3 -жол: вакцинацияланған пайызбен вакцинацияланған адамдардың санын білу

4 -жол: вакцинацияланған адамдар үшін оларға вакцина алуға байланысты иммунитет беріңіз. Бұл көрсеткіш ауруды зерттеуге негізделген.

5 -жол: қалған тұрғындарға (вакцинацияланбаған адамдарға) оларға иммунитет пайызын беріңіз. Бұл көрсеткіш ауруды зерттеуге негізделген.

6 -жол: бастапқыда барлық адамдарды жұқтырмауға қойыңыз.

7 -жол: бастапқыда жұқтырған адамдардың саны үшін сәйкесінше бірінші жұп бағаналарын толтырыңыз.

Енді біз ауруды модельдеуге арналған барлық параметрлерді орнатқаннан кейін, біз адамға (вакцинацияланған да, вакцинацияланбаған да) жұқтыру мүмкіндігін кездейсоқ таңдаймыз. Бұл келесі қадамда осы 'infekMat' үшінші жолындағы әр адамға 0 мен 1 арасындағы кездейсоқ мәндерді тағайындау арқылы жасалады.

4 -қадам: Вакцинацияланған және вакцинацияланбаған адамның жұқтыру мүмкіндігін рандомизациялаңыз

Әр адамға кездейсоқ санды тағайындаңыз, бұл кейінірек ол адамның жұқтырғанын немесе жұқпағанын анықтау үшін қолданылады.

w = 1 үшін: ұзындық (инфекцияMat)

инфекцияMat (3, w) = ранд; Соңы

Кодты түсіндіру

Бұл цикл соңғы қадамда жасалған 'infekMat' үшінші жолымен байланысты. 'rand' 3 жолдың әр индексіне 0 мен 1 арасындағы мәнді тағайындайды.

Шығу

infekTMat енді аяқталды! Бұл 100% вакцинацияланған және бастапқыда 1 адамға жұқтырған халықпен болды.

инфекцияМат =

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 0,0000 0 0 0 0 0 0 0 0 0 0 0,08686 0,5489 0,3177 0,77777777777777777777777 0,717 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

1 -қатар: Ауруды жұқтырмаудың пайыздық мүмкіндігі

2 -қатар: жұқтырған немесе жұқтырмаған (логикалық мән)

3 -қатар: жұқтырмаған адам жұқтырған адаммен кездескенде жұқтырғанын тексеруге арналған нөмір. Егер жұқтырылмаған адам жұқтырған адаммен кездессе, бұл сан 1 -жолдағы саннан көп (сол баған үшін), онда олар жұқтырылған. Біз бұл функцияны 7 -қадамда кодтаймыз.

5 -қадам: Вакцинацияланбаған және бастапқы ақпараттан жұқтырған адамдардың матрицасын жасаңыз

«MatrixUnvacc» және «matrixInfected» деп аталатын 2 матрицаны құрыңыз, олар инфекция жұқтырған барлық адамдарды жұқтырады. Бұл жұқтырған, вакцинацияланбаған немесе вакцинацияланған адамдардың графигін түспен кодтау үшін пайдаланылады, бұл вакцинацияланбаған адамдарға қарсы вакцинацияның әсерін елестетуге көмектеседі.

әрқайсысын тазалаңыз

matrixInfected = ; matrixUnvacc = ; h = 1 үшін: ұзындық (infectionMat) if infekTMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; адам үшін соңы = 1: NUMOFPEOPLE if infekTMat (2, person) == 1 matrixInfected = [matrixInfected, person]; соңы соңы

Кодты түсіндіру

Вакцинацияланбаған және жұқтырған адамдардың санын сақтау үшін екі бос матрица жасаңыз. Циклдар үшін де 20 рет орындалады, егер if операторы қанағаттандырылса, онда нөмір дұрыс матрицаға қосылады.

Шығу

matrixUnvacc =

matrixInfected =

[1]

6 -қадам: Бастапқы графикті салыңыз

Сюжеттің бастапқы графигі
Сюжеттің бастапқы графигі

Әрі қарай біз көршілес матрицаны құрамыз.

g = график (adjMatrix);

сурет (1) p = сюжет (g, 'NodeColor', 'b', 'MarkerSize', 7); бөлектеу (p, matrixUnvacc, 'NodeColor', 'g') бөлектеу (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; титул (['Вакцинацияланбаған адамдардың пайызы:', num2str (title_unvacc), '%']); кідіріс (жылдамдық)

Кодты түсіндіру

Matlab графикалық теориясы функцияларға ие. Graph () функциясын қолданған кезде біз 'adjMatrix' -ті нақты бағытталмаған графикке аудара аламыз. Содан кейін оның қалай көрінетінін көру үшін plot () функциясының көмегімен сюжет құру керек. Біз бұл сюжетті () айнымалыға қойдық, сондықтан біз модельдеу кезінде сюжеттің түстерін оңай басқара аламыз. Барлық адамдар (немесе түйіндер) бастапқыда «көк» түске орнатылады. Әрі қарай, вакцинацияланбаған барлық адамдар «жасыл» түске орнатылады. Содан кейін жұқтырған адамдар «қызыл» түске боялады. Тақырып тексерілмеген вакцинацияланбаған адамдардың белгілі бір пайыздық мәніне сәйкес белгіленеді. Pause () функциясы MatLab орындалуын уақытша тоқтатады. Біз бірнеше секунд ішінде есептелетін айнымалы жылдамдықтан өтеміз.

Кездейсоқ түспен кодталған графикті көру үшін суретті (жоғарыда) қараңыз.

MatLab бағдарламасында бөлектеу () функциясы туралы көбірек біліңіз.

7 -қадам: Инфекцияның дамуын модельдеу

Әрі қарай, біз өзара әрекеттесуден кейін кім жұқтыратынын анықтауымыз керек (adjMatrix -те жазылған) және біреу жұқтырған кезде графикті жаңарту керек.

Қандай адамдар бір күнде адамдармен қарым -қатынастан кейін жұқтырғанын анықтау үшін adjMatrix қолданыңыз.

eachRow = 1 үшін: ұзындық (adjMatrix)

if infekMat (2, eachRow) == 1 forCol = 1: length (adjMatrix) if adjMatrix (eachRow, eachCol) == 1 % eachRow = адам % eachCol = оның досы % әр адамның досы және олардың жұқтырылғанын тексеріңіз. ifinfectionMat (3, eachCol)> инфекцияMat (1, eachCol) инфекцияMat (2, әрқайсысыCol) = 1; бөлектеу (p, eachCol, 'NodeColor', 'r') үзіліс (жылдамдық) соңы соңы соңы

For циклы әр адам арқылы өтеді. Ол егер адам жұқтырған болса, онда олар қарым -қатынаста болған адамдардың/достарының әрқайсысын тексереді және досының иммунитеті аурудың күшінен жоғары екенін тексереді. Дәл осы жерде біз бұрын жасаған 'infekMat' ойыны пайда болады. Достың әр бағанының 1 -ші және 3 -ші қатарлары салыстырылады, ал егер 3 -ші қатар үлкен болса, бұл досының аурудан құтылу үшін жеткілікті жоғары иммунитеті болмағанын және ақырында жұқтырғанын білдіреді. Біз жұқтырған кезде баса () көмегімен қызыл түске өзгереміз.

Енді модельдеуге арналған сіздің кодыңыз жұмыс істеуі керек! және халықтың кез келген санына NUMOFPEOPLE адамды өзгерту керек!

8 -қадам: Монте -Карло теориясын қолданыңыз

Мұны бір қадам алға жылжыту және біздің тренажерден ('infekSim.m') деректерді алу үшін, біз инфекция жұқтырған вакцинацияланбаған адамдардың пайызы мен жұқтырған вакцинацияланған адамдардың пайыздық тенденциясын есептеп, диаграмма жасағымыз келді. Біз вакцинацияланған адамдардың жұқтырған пайызы вакцинацияланбаған адамдарға қарағанда әлдеқайда төмен болуы керек деп болжаймыз.

9 -қадам: Функцияны модельдеу арқылы файлды ('infectionSim.m ') жасаңыз

Монте -Карлоны іске қосу үшін біз модельдеуді бірнеше рет жүргізгіміз келеді және оны жұқтырған адамдардың пайыздық графигін салу үшін деректер жинағымыз келеді.

Функцияны келесідей орнатуға болады:

функцияның шығуы = инфекцияSim (unvacc, вакцина, NUMOFPEOPLE, unvacc_perc, init_infect, жылдамдық)

Модельдеудегі айнымалыларға түсініктеме беріңіз, өйткені сіз оларды негізгі файл арқылы жібересіз (біз мұны 12 -қадамда жаза бастаймыз):

unvacc, вакцина, NUMOFPEOPLE, unvacc_perc, init_infect

Жаңа айнымалы

жылдамдық

негізгі файлда тағайындалады (Monte_Carlo.m).

Ескерту: Функцияны аяқтау үшін функция файлының төменгі жағындағы соңын ұмытпаңыз!

10 -қадам: Вакцинацияланбаған және вакцинацияланған адамдардың жұқпалы ауруларының пайызын есептеңіз

Бұл вакцинацияланбаған адамдардың жұқтырған пайызын есептейді. Бұл код'infectionSim.m 'файлының төменгі жағында орналасқан.

number_of_unvacc = 0;

number_of_infec_unvacc = 0; %x = 1 үшін жұқтырған вакцинацияланбаған адамдардың пайызын есептейді: ұзындығы (инфекцияMat) if infekTMat (1, x) == unvacc number_of_unvacc = number_of_unvacc+1; end if infekTMat (1, x) == unvacc & infekTMat (2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; аяқталу пайызы_nvacc_ мен_инфек = (сан_ұн_мәдениет_ұны / саны_)

Кодты түсіндіру

For циклінде ол NUMOFPEOPLE рет айналады. INFATMAT ішіндегі сан unvacc санына сәйкес келген сайын (яғни 0,95 == 0,95), вакцинацияланбаған адамдардың саны 1 -ге көбейеді. Вирус жұқтырған және вакцинацияланбаған адамдар саны 1 -ге көбейеді. Соңғы жолда жұқтырған, вакцинацияланбаған адамдардың санын вакцинацияланбаған адамдардың жалпы санына бөледі. Содан кейін пайыз осыдан есептеледі.

Сынақ:

Жұқтырған адамдардың вакцинациясының пайызын есептеп көріңіз! (Кеңес: бұл жоғарыдағы кодқа өте ұқсас, бірақ кейбір айнымалылар өзгертіліп, атаулар реттеледі.)

Әрі қарай халықтың жалпы санына байланысты жұқтырғандардың пайызы есептеледі:

pre_per_infect = cumsum (инфекцияMat (2,:));

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

Кодты түсіндіру

Жиналған сома инфекция жұқтырған немесе жұқтырмағанына байланысты 1 және 0 сандарын сақтайтын инфекцияның екінші қатарының көмегімен есептеледі. Cumsum () функциясы матрицаны қайтаратындықтан, біз матрицаның соңғы мәнін аламыз ('pre_per_infect (1, NUMOFPEOPLE)'), ол 'infekMat (2,:)' барлық мәндерінің нақты қосындысы болуы керек. Қосынды NUMOFPEOPLE -ге бөлу және оны 100 -ге көбейту арқылы біз жалпы популяциядағы жұқтырғандардың соңғы пайызын аламыз.

11 -қадам: 'infekSim.m' функциясында шығыс айнымалысын жасаңыз

шығару = [per_infect, пайыздық_унвакц_және_инфекциялық, пайыздық_вакк_және инфекциялық];

Кодты түсіндіру

Бұл ақпаратты шығарылымда сақтаңыз, ол функция шақырылғанда және іске қосылғанда main (Monte_Carlo.m) -ға қайта жіберіледі. Бұл деректер вакцинацияланған және вакцинацияланбаған жұқтырғандардың пайыздық нүктелерін диаграммалау үшін қолданылады.

Сіздің'infectionSim.m 'функциясын қазір жасау керек! Дегенмен, ол жұмыс істемейді, себебі бізге әлі де негізгі жазу керек!

12 -қадам: пайдаланушыдан модельдеудің бастапқы шарттарын алу үшін мәзір жасаңыз

Айнымалыны қалай айтқанымызды есіңізде сақтаңыз

жылдамдық

құрылады және негізгі функция арқылы өтеді ме? Біз функцияға өту үшін мәндерді алуымыз керек. Назар аударыңыз, функцияны шақырған кезде мәндердің реті маңызды!

Пайдаланушыдан терминалға кейбір жауаптарды енгізуді сұраудан бастаңыз.

> Ауруды таңдаңыз. Назар аударыңыз, бұл регулярлық инфекциялар >> Көкжөтел >> Тұмау >> Қызылша >> Таңдалған ауру: Тұмау >> Популяция саны. >> 20 >> 200 >> Таңдалған халық саны: 20 >> Модельдеу жылдамдығын таңдаңыз. >> Жылдам >> Баяу >> Таңдалған жылдамдық: Жылдам

Төмендегі код пайдаланушыдан қандай ауруды қарастырғысы келетінін сұрайды.

disp ('Ауруды таңдаңыз. Ол регистрге сезімтал екенін ескеріңіз')

fprintf ('Көкжөтел / nТұмау / nҚызыл / n') ауруы = енгізу ('Таңдалған ауру:', 's'); егер бірдей болса (ауру, 'көкжөтел') вакцина =.85; %15 ауруға шалдығу ықтималдығы unvacc =.20; Басқа ауруға шалдығу ықтималдығы 80 %болса, вакцина =.75; %25 ауруға шалдығу ықтималдығы unvacc =.31; Басқа ауруға шалдығу ықтималдығы 69 %, егер тең емес (ауру, «Қызылша») вакцина =.97; %3 ауруға шалдығу ықтималдығы unvacc =.10; Аурудың аяқталу ықтималдығы 90 %

Кодты түсіндіру:

Disp () функциясы мәлімдемені экранға шығарады, сонымен қатар әр түрлі опцияларды басып шығарады. Ауру соған сәйкес тағайындалады. Бұл нұсқа қазіргі уақытта жарамсыз енгізуді есепке алмайды. Жарамсыз енгізу қатені тудырады және бағдарламаны толығымен тоқтатады. Әр аурудың вакцинасы және онымен байланысты unvacc мәндері бар. Бұл мәндер кездейсоқ емес. Біз бұл құндылықтарды аурулар туралы статистиканы зерттеуден алдық.

Әрі қарай, біз пайдаланушыдан популяцияның үлкен немесе кішісін таңдаған ауруына тексергісі келетінін сұрауымыз керек.

disp ('Халық санын таңдау.')

fprintf ('20 / n200 / n ') speed = input (' Таңдалған халық саны: ',' s '); егер бірдей болса (жылдамдық, '20') популяция_өлшемі = 20; elseif isequal (жылдамдық, '200') aholi_size = 200; Соңы

Кодты түсіндіру

Бұл пайдаланушыға мәлімдеме басып шығарады және пайдаланушыдан халықтың қандай мөлшерін тексергісі келетінін енгізуді сұрайды. Бұл нұсқа қазіргі уақытта жарамсыз енгізуді есептемейді. Жарамсыз енгізу қатені тудырады және бағдарламаны толығымен тоқтатады. 20 таңдалды, себебі бұл іріктеудің кішкене өлшемі, ол инфекцияның аз ғана халыққа қалай таралатыны туралы жақсы түсінік береді. Үлкен опция ретінде 200 адам таңдалды, себебі графикте салынған 200 нүкте бір -біріне сәйкес келмеді, сондықтан бәрін бір -бірінен оңай ажыратуға болады.

Әрі қарай, біз модельдеудің жылдамдығын табуымыз керек.

disp ('Модельдеу жылдамдығын таңдаңыз.')

fprintf ('Fast / nSlow / n') speed = input ('Таңдалған жылдамдық:', 's'); егердеqual (жылдамдық, 'Жылдам') sim_speed = 0; elseif isequal (жылдамдық, 'Баяу') sim_speed = 0.25; Соңы

Кодты түсіндіру

Бұл процесс аурудың түрі мен халықтың санын алу сияқты болды. Ораза үшін үзіліс болмайды. және баяу үшін, модельдеуді іске қосқанда, циклде 0,25 секундтық артта қалушылық болады.

Тамаша! Енді бізде қажет пайдаланушыдан барлық кіріс бар! Вакцинацияланбаған адамдардың әр түрлі пайызы бойынша мәліметтер жинауға көшейік.

13 -қадам: Вакцинацияланбаған адамдардың % -ын таңдаңыз және вакцинацияланбаған және жұқтырғандардың орташа пайызын таңдалған пайызбен есептеңіз

Бұл код вакцинацияланбаған адамдардың 0% -на арналған.

% ------- % 0 Вакцинацияланбаған ------------

per_infect_av_0 = ; %_of_unvacc_and_infec_av_0 = ; for i = 1:20 out = infekSim (unvacc, вакцина, популяция өлшемі, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, тыс (1, 1)]; %_of_unvacc_and_infec_av_0 = [пайыздық_унвач_және_инфек_ав_0, тыс (1, 2)]; аяқталатын орташа_инфекцияланған_0 = орташа (орта_жұқпалы_ау_0); average_unvacc_and_infected_0 = орташа

Кодты түсіндіру:

For циклы 20 рет орындалады. ИнфекцияSim () функциясының шығысы сыртында сақталады. For циклы іске қосылған сайын, жалпы популяциядағы жұқтырғандардың пайызы «per_infect_av_0» матрицасына қосылады. Сонымен қатар, вакцинацияланбаған және жұқтырылған науқастардың пайызы «процент_офф_және_инфек_ав_0» матрицасына қосылады. Соңғы екі жолда жоғарыда аталған екі матрицаның орташа мәні алынады және айнымалыларда сақталады. Қорытындылай келе, пайыздар әр модельдеу үшін сақталады, орташа және график түрінде болады. Монте -Карло симуляцияны іске қосудың орташа мәнін және нәтижені көрсету үшін қолданылады. Эксперименттік мақсаттар үшін біз имитацияны 20 рет жүргізуді таңдаймыз және сол мәндерді ортаға саламыз.

Сынақ:

Тексергіңіз келетін барлық пайыздар үшін қайталаңыз! Мұны айнымалы атауларды пайыздық сандарға сәйкес өзгерту арқылы жасауға болады. Біз 0%, 5%, 10%, 20%, 30%және 50%сынақтан өттік.

Кеңес:

Нақты кодта өзгертілуі керек жалғыз жол

out = инфекцияSim (unvacc, вакцина, популяция өлшемі, 0, 1, sim_speed);

Нөлді ондық бөлшек түрінде пайызға өзгертіңіз. Мысалы, вакцинацияланбаған 5% имитация үшін 0 -ді 0,5 -ке ауыстыру керек.

14 -қадам: График: «Вакцинацияланбаған инфекцияға қарсы үрдіс. Белгіленген ауруға вакцинацияланған '

Бұл вакцинацияланбаған адамдар мен вакцинацияланбаған адамдар арасындағы инфекция тенденциясының графигін құруға арналған код.

graph_mat_y = [орташа_жұқтырылған_0, орташа_инфекцияланған_5, орташа_инфекцияланған_10, орташа_инфекцияланған_20, орташа_инфекцияланған_30, орташа_инфекцияланған_50];

graph_mat_x = [0, 5, 10, 20, 30, 50]; көлбеу = (орташа_жұқтырылған_5-орташа_жұқпалы_0)/5; line_y = [орташа_инфекцияланған_0, (көлбеу*50)+орташа_инфекцияланған_0]; line_x = [0, 50]; фигура (2) сюжет (graph_mat_x, graph_mat_y); сызық (line_x, line_y, 'Түс', 'қызыл', 'LineStyle', '-'); атау (['' вакцинацияланбау үрдісі ', ауру]); xlabel ('Бастапқы вакцинацияланбаған проценттердің пайызы'); ylabel («Ақырғы жұқтырғандардың пайызы»)

Кодты түсіндіру

1 -жол: жұқтырылған пайыздың орташа мәніне у мәндері тағайындалды

2 -жол: вакцинацияланбаған бастапқы пайыздың пайызына x мәндері тағайындалды

3 -жол: 0% және 5% көлбеуді есептеңіз

4 -жол: жолдың y мәндерін сақтау. Бұл 0% -дан 5% -ға дейінгі бөлімнің жалғасы.

5 -жол: жолдың y мәндерін сақтау. Бұл сызық графиктің ұзындығын қамтиды.

6 -жол: фигура құру

7 -жол: вакцинацияланбаған жұқтырған пайыздың x және y графигінің графигін салыңыз.

8 -жол: сызықты сызыңыз. Бұл оның сызықтық емес, экспоненциалды түрде өсетінін көрсету үшін қолданылады.

9 -жол: Графиктің атауын орнатыңыз.

10-11 жол: график үшін x және y белгілерін орнатыңыз.

Енді сіз вакцинацияланбаған халықтың көп пайызы инфекцияның соғұрлым көп болатынын көре аласыз. Сіз сондай -ақ қызылға айналатын нүктелердің көпшілігі жасыл нүктелер екенін көресіз, бұл вакцинаның белгілі бір дәрежеде көмектесетінін көрсетеді! Сізге бұл оқулық ұнады деп үміттенемін. Сұрақтарыңыз болса пікірге жазыңыз!

15 -қадам: Соңғы өнім: модельдеу қалай көрінеді

Барлық кодты мына жерден табуға болады

Ұсынылған: