Мазмуну:

Эмдөөдөн өтүш керекпи же жокпу? Оорулардын симуляциясы аркылуу үйүрдүн иммунитетин байкоо боюнча долбоор: 15 кадам
Эмдөөдөн өтүш керекпи же жокпу? Оорулардын симуляциясы аркылуу үйүрдүн иммунитетин байкоо боюнча долбоор: 15 кадам
Anonim
Эмдөөдөн өтүш керекпи же жокпу? Оорулардын симуляциясы аркылуу үйүрдүн иммунитетин байкоо боюнча долбоор
Эмдөөдөн өтүш керекпи же жокпу? Оорулардын симуляциясы аркылуу үйүрдүн иммунитетин байкоо боюнча долбоор

Долбоорго сереп:

Биздин долбоор үйүрдүн иммунитетин изилдейт жана биздин жамааттарда инфекциянын санын азайтуу үчүн адамдарды эмдөөгө үндөйт деп үмүттөнөт. Биздин программа эмдөөнүн жана эмделбегендердин ар кандай пайызы менен ооруган калкты кантип жуктурат. Бул эмделген калктын санынын көбөйүшү жабыркаган адамдардын санын кантип азайта аларын көрсөтүү менен үйүр иммунитетин көрсөтөт.

Биз муну Matlabте графикалык теория түшүнүктөрүн колдонуп моделдейбиз. Граф теориясы - бул объекттердин ортосундагы мамилелерди чагылдыруунун математикалык жолу. График теориясында графиктердин четтери (же сызыктары) менен туташкан чокулары (же түйүндөрү) бар. Биздин долбоор үчүн түйүндөр кызыкдар адамдар жана четтери алардын байланыштары. Мисалы, эгер эки түйүн четине туташкан болсо, анда алар "достор" же бири -бири менен кандайдыр бир байланышта экенин билдирет. Бул байланыш оорунун жайылышынын бир жолу. Биз график теориясын концепциябызды моделдөө үчүн колдондук, анткени биз популяцияда туташкан адамдардын арасында оору кантип жайылып жатканын көргүбүз келди.

Биздин долбоор Монте -Карло ыкмасын да камтыйт. Монте -Карло ыкмасы - сандык натыйжаларды алуу үчүн кайталануучу туш келди тандоону түзүүчү алгоритмдер. Долбоорубузда, биз бул ыкманы колдонуп, симуляциябызды бир нече жолу иштетип, адамдардын жуктуруу ылдамдыгын көрүү үчүн эмделбегендердин пайызын өзгөртүп жатабыз.

Бардык долбоордун коду ылдый жагында байланыштырылган!

PC Кредити:

Графика теориясына Matlab шилтемеси:

1 -кадам: Adjacency Matrix түзүңүз

Adjacency Matrix түзүү
Adjacency Matrix түзүү
Adjacency Matrix түзүү
Adjacency Matrix түзүү

Жаңы скрипт түзүңүз. Биз өзүбүздү 'инфекцияSim.m' деп атайбыз.

Биз 'NUMOFPEOPLE' өзгөрмөсүн түзөбүз. Сиз аны каалаган бүтүн санга дайындай аласыз. Бул сиздин калкыңыздагы адамдардын санын билдирет.

Мындан ары биз муну болжолдойбуз

NUMOFPEOPLE = 20;

Биринчиден, багытталбаган граф үчүн Matlabтин графикалык теориясынын функцияларын колдонуу менен баштаңыз.

Эгерде сиз көбүрөөк билүүгө кызыкдар болсоңуз, анда бул жөнүндө кененирээк окуу үчүн шилтеме бар.

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

Жанаша матрица түзүлдү.

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

Бул 0лердин квадрат матрицасын түзөт. Матрицанын ар бир сабы адам. Матрицанын ар бир тилкеси - бул адам күн бою жолуккан адам же дос.

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 () менен кыйынчылыктар болуп жатабы? Терминалга териңиз

жардам randi

Андан кийин, биз популяциядагы ар бир адамдын популяциянын ичинде кандайча байланышкандыгы жөнүндө рандомизацияланган матрицаны ("allFriendsmatrix" деп аталат) түзөбүз.

tempMatrix = ;

count = 0; allFriendsMatrix = ; k = 1 үчүн: NUMOFPEOPLE while length (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; темп = ранди ([1, NUMOFPEOPLE]); tempMatrix (count) = темп; ар бир убакытты тазалоо узундугу (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; бүт allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; count = 0; аяктоо

Коддун терең түшүндүрмөсү:

Биринчиден, биз ар бир адамдын досторун/өз ара аракеттенүү тизмесин кармоо үчүн бош убактылуу матрицаны түзөбүз. Биз ошондой эле tempMatrixте жаңы кокустук туташууну кайсы жерге жабыштырууну көзөмөлдөгөн эсепти баштайбыз. For циклдери 20 жолу иштейт, бул популяциянын ар бир адамы үчүн болот. Биринчи while цикли ар бир адамдын tempMatrix туш келди иштөө санынын бирдей узундугуна чейин иштейт. Бул циклде популяциядагы адамга туура келген сан түзүлөт жана tempMatrixке жайгаштырылат. TempMatrixesтин ар биринин узундугу ар башка болгондуктан, биз бул tempMaticiesтин бардыгын бир матрицага бириктирүү үчүн кээ бир NaN баалуулуктарын түзүшүбүз керек болчу ('allFriendsMatrix'). Экинчи while цикли бул маселени ар бир tempMatrixке NaN кошуу менен чечет. Убакыт цикли 9 жолу иштөөгө коюлган, анткени бул 5тен чоңураак сан, бул адамга дайындала турган достордун жогорку чеги болгон. '9' мааниси өзгөрмөлүү жана 'mostFriendsPersonCanHave' 9дан чоң болгондо өзгөртүлүшү керек/өзгөртүлүшү керек Акыркы үч код коду (аягын кошпогондо) tempMatrixти 'allFriendsMatrix' кийинки катарына кошот. Андан кийин ал tempMatrixти тазалап, кийинки адамды эсептейт.

Output

Чыгуу 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 17 10 9 3 1 NaN NaN NaN NaN 16 16 6 NaN NaN NaN NaN NaN 3 8 17 17 14 NaN NaN NaN NaN NaN 20 19 3 18 10 16 NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN 5 18 NaN NaN NaN NaN NaN NaN 1N NaN NaN NaN NaN NaN NaN 16 7 13 10 1

Андан кийин, бул мамилелерди 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.

Output

Бул азыркы симуляция үчүн акыркы adjMatrix. Бул графиктин бардык сызыктарын эсепке алат (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

'AdMatrix' графигин көрүү үчүн 2 -сүрөттү караңыз.

3 -кадам: Оорунун статистикасын кошуу

Эми сиздин программаңыз туш келди адамдардын топтому менен график түзө алат жана туш келди мамилелерди түзө алат, биз популяциянын ичиндеги бул өз ара аракеттенүү инфекцияны кантип көбөйтө же азайта аларын билүү үчүн оорунун маалыматын же статистикасын киргизишибиз керек.

Бул өзгөрмөлөрдү түзүү:

unvacc %түрү: кош; эмделбеген адамдардын ооруга чалдыгуу ыктымалдуулугу

вакцина %түрү: кош; эмдөөдөн өткөндөрдүн ооруга чалдыгуу ыктымалдуулугу %unvacc_perc %түрү: эки эсе; калктын пайызы эмделбеген init_infect %түрү: int; калктын пайызы эмделген

Андан кийин биз кээ бир эсептөөлөрдү кылышыбыз керек.

Биз 3*NUMOFPEOPLE матрицасы болгон'infectionMat 'жасамакчыбыз.

vac_perc = 1-unvacc_perc;

infekMat = nan (3, NUMOFPEOPLE); саны = тегерек (вакцина_перц * NUMOFPEOPLE); infekMat (1, 1: саны) = вакцина; infectionMat (1, саны+1: аягы) = unvacc; infectionMat (2, 1: end) = 0; infectionMat (2, 1: init_infect) = 1;

Коддун түшүндүрмөсү

1 -сап: эмделбеген калктын пайызы эсептелет

2 -сап: 3*N сандагы адамдардын матрицасын түзүү

3 -сап: эмделген адамдардын пайызын эмдөө пайызынан билиңиз

4 -сап: эмделген адамдар үчүн аларга вакцинаны алуу менен байланышкан иммунитетти бериңиз. Бул баа оору тууралуу изилдөөлөрдүн негизинде берилет.

5 -сап: калктын калган бөлүгү үчүн (эмделбегендер) аларга пайыздык иммунитетти бериңиз. Бул баа оору тууралуу изилдөөлөрдүн негизинде берилет.

6 -сап: адегенде бардык адамдарды инфекция жуктурбагыла.

7 -сап: алгач жуккан адамдардын саны үчүн, ошого жараша биринчи жуп мамычаларды толтуруңуз.

Эми биз ооруну симуляциялоо үчүн бардык параметрлерди койгондон кийин, адамга (эмделген жана эмделбеген) жуктуруп алуу мүмкүнчүлүгүн рандомизация кылабыз. Бул кийинки этапта 0 'ден 1ге чейинки кокустук маанилерди ушул' infekMat 'үчүнчү катарындагы ар бир адамга берүү аркылуу жасалат.

4 -кадам: Вакцинацияланган жана эмделбеген адамдын жуктуруп алуу мүмкүнчүлүгүн рандомизациялоо

Кийинчерээк, ар бир адамга туш келди номер бериңиз, бул кийинчерээк адам инфекция жуккан же жукпаганын аныктоо үчүн колдонулат.

w = 1 үчүн: узундук (infectionMat)

infekMat (3, w) = rand; аяктоо

Код түшүндүрмөсү

Бул цикл акыркы кадамда түзүлгөн'infectionMat 'үчүнчү катарына тиешелүү. 'rand' 3 -саптын ар бир индексине 0 менен 1дин ортосундагы маани берет.

Output

infekMat азыр бүттү! Бул 100% вакцинацияланган калк менен болгон жана башында 1 адам жуккан.

infectionMat =

Мамычалар 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 0.0869 0.5489 0.3177 0.7997 0.7236 0.5721 0.7172 0.975 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 матрицаны түзүңүз, алар инфекция жуккан бардык адамдарды infekMatтен сактайт. Бул жуктурулган, эмделбеген же эмделген адамдардын графигин түстүү код менен жазуу үчүн колдонулат, бул эмделбегендерге каршы эмдөөдөн өткөндөрдүн таасирин элестетүүгө жардам берет.

ар бирин тазалоо

matrixInfected = ; matrixUnvacc = ; h = 1 үчүн: узундугу (infectionMat) if инфекцияMat (1, ч) == unvacc matrixUnvacc = [matrixUnvacc, h]; адам үчүн аягы = 1: NUMOFPEOPLE if infekTMat (2, person) == 1 matrixInfected = [matrixInfected, person]; аягы аягы

Коддун түшүндүрмөсү

Эмделбеген жана жуктурулган адамдардын санын сактоо үчүн эки бош матрицаны түзүңүз. Экөө тең 20 жолу иштейт жана эгер if оператору канааттандырылса, анда сан туура матрицага кошулат.

Output

matrixUnvacc =

matrixInfected =

[1]

6 -кадам: Баштапкы график

Участоктун алгачкы графиги
Участоктун алгачкы графиги

Андан кийин биз жанаша матрицаны түзөбүз.

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

Figure (1) p = plot (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те жазылган) жана кимдир бирөө жукканда графигин жаңыртуу керек.

AdMatrixти колдонуп, бир күндүн ичинде адамдар менен болгон мамилесинен кийин кайсы адамдар жуккандыгын аныктаңыз.

eachRow = 1 үчүн: узундук (adjMatrix)

ifinfMat (2, eachRow) == 1 forCol = 1: узундугу (adjMatrix) if adjMatrix (eachRow, eachCol) == 1 % eachRow = адам % арCol = анын досу % ар бир адамдын досу жана алардын жуккандыгын текшериңиз. ifinfectionMat (3, eachCol)> инфекцияMat (1, eachCol) инфекцияMat (2, eachCol) = 1; бөлүп көрсөтүү (p, everyCol, 'NodeColor', 'r') тыным (ылдамдык) аягы аягы аягы аягы

For цикли ар бир адам аркылуу өтөт. Бул адам инфекция жуккан болсо, алар менен баарлашкан ар бир адамды/досун текшерет жана досунун иммунитетинин деңгээли оорунун күчүнөн жогору экендигин текшерет. Бул жерде биз мурун жараткан'infectionMat 'ойнойт. Досунун ар бир тилкесинин 1 -жана 3 -катарлары салыштырылат жана эгер 3 -катар чоңураак болсо, бул досунун оорудан кутулуу үчүн иммунитети жетишсиз болгонун билдирет жана акыры инфекция жугат. Ошондой эле, эгер алар жуктуруп алса, баса () менен кызыл түскө өзгөртөбүз.

Эми симуляция үчүн кодуңуз иштеши керек! жана калктын каалаган өлчөмү үчүн, жөн гана NUMOFPEOPLE алмаштырыңыз!

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

Муну бир кадам алдыга жылдыруу жана симуляторубуздан маалыматтарды алуу үчүн ('infectionSim.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 infekMat (1, x) == unvacc number_of_unvacc = number_of_unvacc+1; end ifinfectionMat (1, x) == unvacc &infectionMat (2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; end end пайыздык_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc)*100;

Код түшүндүрмөсү

For циклинде ал NUMOFPEOPLE жолу айланат. InfectionMat саны unvacc санына туура келген сайын (б.а. 0,95 == 0,95), анда эмделбеген адамдардын саны 1ге көбөйөт. Инфекцияланган жана эмделбегендердин саны 1ге көбөйөт. Акыркы сапта вакцинацияланбаган адамдардын санына бөлүнөт. Андан кийин пайыз ушул жерден эсептелет.

Чакырык:

Инфекция жуктуруп алган адамдардын эмдөөсүнүн пайызын эсептеп көрүңүз! (Ишара: бул жогорудагы кодго абдан окшош, бирок кээ бир өзгөрмөлөр өзгөртүлүп, аттары туураланган.)

Кийинчерээк жалпы калктын санына жараша инфекция жуккан адамдардын пайызы эсептелет:

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

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

Код түшүндүрмөсү

Кумулятивдүү сумма, инфекция жуккан же жукпагандыгына жараша 1s жана 0лерди сактай турган MathMatation экинчи катарынын жардамы менен эсептелет. Cumsum () функциясы матрицаны кайтарып бергендиктен, биз матрицанын акыркы маанисин алабыз ('pre_per_infect (1, NUMOFPEOPLE)'), ал 'enfeksiyonMat (2,:)' бардык маанилердин чыныгы суммасы болушу керек. Сумманы NUMOFPEOPLEге бөлүп, 100гө көбөйтүп, биз жалпы калктын ичинде инфекциянын акыркы пайызын алабыз.

11 -кадам: 'FunctionSim.m' Функциясында Чыгуучу Өзгөрмөнү Түзүңүз

чыгаруу = [per_infect, процент_оnvacc_and_infec, пайыз_ac_ч_ жана_инфек];

Код түшүндүрмөсү

Бул маалыматты өндүрүштө сактаңыз, ал функция чакырылганда жана иштеп бүткөндө кайра main (Monte_Carlo.m) га жөнөтүлөт. Бул маалыматтар эмделген жана эмделбегендерден жугузуп алгандардын пайыздык пункттарын диаграммалоо үчүн колдонулат.

Сиздин'infectionSim.m 'функциясы азыр жасалышы керек! Бирок, ал иштебейт, анткени биз дагы негизги нерсени жазышыбыз керек!

12 -кадам: Колдонуучудан симуляциянын баштапкы шарттарын алуу үчүн менюну түзүңүз

Биз өзгөрмөнү кантип айтканыбызды эстеңиз

ылдамдык

түзүлүп, негизги функциядан өтмөк беле? Биз функцияга өтүү үчүн баалуулуктарды алышыбыз керек. Эскертүү, функцияны чакырууда маанилердин тартиби маанилүү!

Колдонуучудан терминалга кээ бир жоопторду терүүнү сураңыз.

> Ооруну тандаңыз. Көңүл бургула >> Көк жөтөл >> Сасык тумоо >> Кызамык >> Тандалган илдет: Сасык тумоо >> Калктын санын тандоо. >> 20 >> 200 >> Калк тандалды: 20 >> Симуляциянын ылдамдыгын тандоо. >> Тез >> Жай >> Ылдамдык тандалды: Тез

Төмөндөгү бул код колдонуучудан кайсы ооруга кайрылгысы келгенин сурайт.

disp ('Ооруну тандаңыз. Бул чоң -кичине сезгич экенин эске алыңыз')

fprintf ('Көк жөтөл / nСасык тумоо / n') оору = киргизүү ('Тандалган оору:', 's'); эгер isqual (оору, 'Көк жөтөл') вакцина =.85; %15 ооруга чалдыгуу ыктымалдыгы unvacc =.20; Башка ооруга чалдыгуу %80 %ыктымалдык %25 ооруга чалдыгуу ыктымалдыгы unvacc =.31; %69 башка ооруга чалдыгуу ыктымалдуулугу башка болсо (оору, "Кызылча") эмдөө =.97; %3 ооруга чалдыгуу ыктымалдыгы unvacc =.10; %90 %ооруну токтотуу ыктымалдыгы

Коддун түшүндүрмөсү:

Disp () функциясы билдирмени экранга чыгарат, ошондой эле ар кандай параметрлерди басып чыгарат. Оору ошого жараша дайындалат. Бул версия учурда жараксыз киргизүүнү эсепке албайт. Жараксыз киргизүү ката кетирип, программаны толугу менен токтотот. Ар бир оорунун вакцина жана аны менен байланышкан unvacc баалуулуктары бар. Бул баалуулуктар кокусунан эмес. Биз бул баалуулуктарды оорулар жөнүндөгү статистиканы изилдөөдө алдык.

Андан кийин, биз колдонуучудан алар тандап алган оорусуна карата чоң же кичине калктын санын текшерип көрүүнү сураныш керек.

disp ('Калктын санын тандоо.')

fprintf ('20 / n200 / n ') speed = input (' Калк тандалды: ',' s '); эгердеququ (ылдамдык, '20') калктын_өлчөмү = 20; elseif isequal (ылдамдык, '200') populyasiya_size = 200; аяктоо

Код түшүндүрмөсү

Бул колдонуучуга арызды басып чыгарат жана колдонуучудан тестирлөөнү каалаган калктын санын киргизүүнү суранат. Бул версия учурда жараксыз киргизүүнү эсепке албайт. Жараксыз киргизүү ката кетирип, программаны толугу менен токтотот. 20 тандалды, анткени бул чакан үлгү, ал инфекциянын чакан калкка кантип жайылып кетээри жөнүндө жакшы түшүнүк берет. Чоң вариант катары 200 адам тандалды, анткени графикте чийилген 200 чекитте эч кандай дал келүү жок болчу, андыктан баарын оңой көрүүгө жана бири -биринен айырмалоого болот.

Андан кийин, биз симуляция ылдамдыгын табышыбыз керек.

disp ('Симуляциянын ылдамдыгын тандоо.')

fprintf ('Fast / nSlow / n') speed = input ('Тандалган ылдамдык:', 's'); эгердеqual (ылдамдык, 'Fast') sim_speed = 0; elseif isequal (ылдамдык, 'Жай') sim_speed = 0.25; аяктоо

Код түшүндүрмөсү

Бул процесс оорунун түрүн жана калктын санын алуу менен бирдей болгон. Орозо үчүн тыныгуу болбойт. жана жай үчүн, симуляцияны иштетүүдө for циклинде 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 = орточо (per_infect_av_0); average_unvacc_and_infected_0 = орточо (пайыздык_унвакч_жана_инфек_ав_0);

Коддун түшүндүрмөсү:

For цикли 20 жолу иштейт. ИнфекцияSim () функциясынын чыгышы сыртта сакталат. For цикли иштеген сайын, калктын жалпы санына жугузгандардын пайызы матрицага кошулат, 'per_infect_av_0'. Кошумча катары, эмдөөдөн өтпөгөндөрдүн жана жуктургандардын пайызы да 'процент_оффункциялары_жана_инфек_ав_0' матрицасына кошулат. Акыркы эки сапта, бул эки, жогоруда айтылган матрицалар орточо эсепке алынып, өзгөрмөлөрдө сакталат. Жыйынтыктап айтканда, пайыздар ар бир симуляция үчүн сакталат, орточо жана график. Монте -Карло симуляцияны иштетүүнүн жана жыйынтыкты көрсөтүүнүн орточо маанисин көрсөтүү үчүн колдонулат. Эксперименталдык максаттарыбыз үчүн, биз симуляцияны 20 жолу иштетип, ошол баалуулуктарды орточо эсепке алабыз.

Чакырык:

Сынагыңыз келген бардык пайыздар үчүн кайталаңыз! Бул пайыздык сандарга жараша өзгөрмө аталыштарды өзгөртүү аркылуу жасалышы мүмкүн. Биз 0%, 5%, 10%, 20%, 30%жана 50%үчүн тест тапшырдык.

Кеңеш:

Чыныгы коддо өзгөртүлүшү керек болгон жалгыз сап

out = infekSim (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, 'Color', 'red', 'LineStyle', '-'); титул (['Trend in Unvaccination', оору]); xlabel ('Башталбаган эмдөөлөрдүн пайызы'); ylabel ('Акыркы инфекциянын пайызы')

Код түшүндүрмөсү

1 -сап: жуктурулган пайыздардын орточо көрсөткүчтөрүнө y мааниси дайындалды

2 -сап: эмделбеген баштапкы пайыздын пайызына x баалуулуктары дайындалган

3 -сап: жантыкты 0% жана 5% эсептөө

4 -сап: саптын y маанилерин сактоо. Бул 0% дан 5% га чейинки бөлүмдүн уландысы.

5 -сап: саптын y маанилерин сактоо. Бул сызык графиктин узундугун камтыйт.

6 -сап: фигураны түзүү

7 -сап: эмделбеген вирустун пайызынын x жана y графигинин графигин түзүңүз.

8 -сап: сызыкты түзүңүз. Бул сызыктуу эмес, геометриялык түрдө көбөйөрүн көрсөтүү үчүн колдонулат.

9 -сап: Графиктин аталышын коюңуз.

10-11-сап: График үчүн x жана y энбелгилерин коюңуз.

Эми сиз эмдөөдөн өтпөгөн калктын канчалык көп пайызы болсо, инфекция ошончолук көп болорун көрө алышыңыз керек. Сиз ошондой эле вакцинанын кандайдыр бир деңгээлде жардам берээрин көрсөтүп, кызарган чекиттердин көбү жашыл чекиттер экенин көрөсүз! Бул окуу куралы сизге жакты деп үмүттөнөбүз. Суроолоруңуз болсо комментарийге жазыңыз!

15 -кадам: Акыркы продукт: Симуляция кандай көрүнөт

Бардык кодду бул жерден тапса болот

Сунушталууда: