Агуулгын хүснэгт:

Вакцин хийлгэх үү, үгүй юу? Өвчний симуляци ашиглан сүргийн дархлааг ажиглах төсөл: 15 алхам
Вакцин хийлгэх үү, үгүй юу? Өвчний симуляци ашиглан сүргийн дархлааг ажиглах төсөл: 15 алхам

Видео: Вакцин хийлгэх үү, үгүй юу? Өвчний симуляци ашиглан сүргийн дархлааг ажиглах төсөл: 15 алхам

Видео: Вакцин хийлгэх үү, үгүй юу? Өвчний симуляци ашиглан сүргийн дархлааг ажиглах төсөл: 15 алхам
Видео: Монгол хүн коронавирүсийн вакцин гаргасан нь үнэн үү? 2024, Арваннэгдүгээр
Anonim
Вакцин хийлгэх үү, үгүй юу? Өвчний симуляци хийх замаар сүргийн дархлааг ажиглах төсөл
Вакцин хийлгэх үү, үгүй юу? Өвчний симуляци хийх замаар сүргийн дархлааг ажиглах төсөл

Төслийн тойм:

Манай төсөл нь сүргийн дархлааг судалж, манай нутгийн иргэд халдварын түвшинг бууруулахын тулд вакцин хийлгэхийг уриална гэж найдаж байна. Манай хөтөлбөр вакцин хийлгэсэн болон вакцинжуулаагүй хувь хэмжээ нь өөр өөр хувь хүн амд хэрхэн халдварладаг болохыг дуурайдаг. Энэ нь сүргийн дархлааг харуулж, вакцинжуулсан хүн амын тоо нэмэгдэх нь халдвар авсан хүмүүсийн тоог хэрхэн бууруулж болохыг харуулж байна.

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

Манай төсөлд Монте -Карлогийн арга ч бас багтсан болно. Монте -Карлогийн арга нь тоон үр дүнг авахын тулд давтан санамсаргүй түүвэрлэлт хийдэг алгоритмууд юм. Манай төсөлд бид энэ аргыг ашиглан симуляци хийхдээ хүмүүсийн вакцинд хамрагдаагүй хүмүүсийн хувь хэмжээг хэд хэдэн удаа өөрчилж, халдвар авах түвшинг нь хардаг.

Төслийн бүх кодыг доод хэсэгт холбосон болно!

PC кредит:

Графикийн онолын Matlab холбоос:

Алхам 1: Хажуугийн матриц үүсгэх

Хажуугийн матриц үүсгэх
Хажуугийн матриц үүсгэх
Хажуугийн матриц үүсгэх
Хажуугийн матриц үүсгэх

Шинэ скрипт үүсгэх. Бид өөрсдийнхөө халдварыг "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 = график (a); %график функцийг ашиглан (график онол) зураг (1); h = зураг (g);

"Тэмдэглэл" дэх кодыг ашиглан хажуугийн матрицад хэрхэн ирмэг нэмэх талаар Зураг 1 -ээс үзнэ үү.

Алхам 2: Харилцааг бий болгох

Харилцааг бий болгох
Харилцааг бий болгох

Хүмүүс (орой эсвэл зангилаа) бий болсон тул бид харилцааны сүлжээг (графикийн шугам эсвэл ирмэг) бий болгох хэрэгтэй. Энэ нь хүмүүс өдрийн турш бусадтай хэрхэн харьцаж, бусадтай уулзаж байгааг дуурайх болно.

Үүнийг олон янзаар хийж болно. Энэ даалгаврыг биелүүлэх нэг арга бол эхлээд хүн бүрт санамсаргүй тоог өгч хүн бүр өдөрт хэдэн хүнтэй харилцах болохыг тодорхойлох явдал юм.

numOfFriendsMatrix = randi ([хамгийн багаFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);

Энэ нь хүн бүрийн нэг өдрийн харилцан үйлчлэлийн тоог илэрхийлсэн 1 -ээс 20 хүртэлх тооны бүхэл тоон матрицыг гаргадаг. Энэ матрицын багана нь хүн бүрт харгалзах тоо байх болно. Жишээлбэл, хэрэв бид хамгийн багаFriendsPersonCanHave = 2 ба mostFriendsPersonCanHave = 5 гэж оноодог бол 2-5 хооронд санамсаргүй утгыг авах болно.

Ранди () -тай асуудалтай байна уу? Терминал дээр бичнэ үү

Рандид тусал

Дараа нь бид хүн амын хүн бүр хүн амын дотор хэрхэн холбогддог/харилцан үйлчилдэг тухай санамсаргүй байдлаар матриц ("allFriendsmatrix" гэж нэрлэдэг) гаргадаг.

tempMatrix = ;

тоолох = 0; allFriendsMatrix = ; for k = 1: NUMOFPEOPLE байхад length (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (тоолох) = температур; end тус бүрийг цэвэрлэнэ. төгсгөл allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; тоолох = 0; Төгсгөл

Кодын нарийвчилсан тайлбар:

Эхлээд бид хүн бүрийн найз нөхөд/харилцан үйлчлэлийн жагсаалтыг хадгалахын тулд хоосон түр зуурын матриц үүсгэдэг. Бид мөн тооллогыг эхлүүлдэг бөгөөд энэ нь шинэ санамсаргүй холболтыг tempMatrix -д хаана байрлуулахаа л бүртгэдэг. For гогцоо нь 20 удаа ажилладаг бөгөөд энэ нь хүн амын хүн бүрт тохиолддог. Эхний while давталт нь хүн бүрийн tempMatrix нь санамсаргүй байдлаар өгсөн харилцан үйлчлэлийн урттай ижил байх хүртэл ажиллана. Энэ давталтад хүн амд хамаарах санамсаргүй тоог гаргаж, tempMatrix -д байрлуулна. TempMatrixes тус бүрийн урт өөр өөр байдаг тул бид эдгээр бүх tempMaticies -ийг нэг матриц болгон нэгтгэхийн тулд NaN -ийн зарим утгыг бий болгох шаардлагатай болсон ('allFriendsMatrix'). Хоёр дахь while давталт нь tempMatrix бүрт NaN -ийг нэмж энэ асуудлыг шийддэг. While давталтыг 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 NaN NaN NaN NaN NaN NaN NaN NaN 11 17 2 NaN NaN NaN NaN NaN NaN 4 13 2 12 NaN Нан Нан Нан Нан 17 10 9 3 1 Нан Нан Нан Нан 16 16 6 Нан Нан Нан Нан Нан Нан 3 8 17 17 14 Нан Нан Нан Нан 20 19 3 Нан Нан Нан Нан Нан Нан 13 10 NaN Нан Нан Нан Нан Нан Нан 2 18 10 16 NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN NaN NaN 8 16 14 8 7 7 NaN NaN NaN NaN NaN NaN 19 10 9 NaN NaN NaN NaN NaN NaN NaN NaN 2 6 14 3 13 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 дээр нэмнэ үү.

тутамдRow = 1: NUMOFPEOPLE

forCol = 1: 9 бол isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), тус бүрRow) = 1; төгсгөл төгсгөл

Кодын тайлбар

Энэхүү давхар давталт нь 'allFriendsMatrix' -ийн мөр, багана бүрээр дамждаг. If мэдэгдэл нь 'NaN' биш бүх утгыг ажиллуулах болно. Үндсэндээ энэ нь графикийн ирмэг эсвэл шугамыг үүсгэх болно. Тиймээс үүнийг хийх эхний мөр нь 1 -ээс 16 -р хүнээс 16 -аас 1 хүн рүү шилжүүлэх болно. Энэ нь чиглүүлээгүй тул 1 -ийг хоёуланг нь өөрчлөх ёстой! Бид 1 -ээс 16 -тай биш харин 16 -аас 1 -р захтай байж болохгүй. Тэд Matlab дээр зөв ажиллахын тулд тэгш хэмтэй байх ёстой.

Бид өөрсдийн симуляци хийхдээ хүмүүс өөртэйгөө харьцаж чаддаггүй болохыг тогтоосон. Бид утгыг санамсаргүй байдлаар сонгоход зэргэлдээх матриц маань ийм алдаа гаргах магадлал өндөр байдаг.

Үүнийг дараах кодоор засъя.

тус бүрийн хувьд = 1: NUMOFPEOPLE

adjMatrix (тус бүр, тус бүр) = 0; Төгсгөл

Кодын тайлбар

This for loop нь 1 -р хүн 1 -р хүнтэй холбоогүй, 2 -р хүн 2 -р хүнтэй холбогдоогүй гэх мэт бүгдийг нь 0 болгох замаар баталгаажуулдаг. Гаралтын хэсэгт доороос харж болно, бидэнд дөрвөлжингийн диагональ байна. Зүүн дээдээс баруун тийш матриц бүгд 0 байна.

Гаралт

Энэ бол одоогийн симуляцийн хамгийн сүүлийн 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

'AdjMatrix' графикийг харахын тулд Зураг 2 -ыг үзнэ үү.

Алхам 3: Өвчний статистикийг нэмнэ үү

Одоо таны програм санамсаргүй хүмүүсээс бүрдсэн график үүсгэж, санамсаргүй харилцаа үүсгэж чадах болсон тул хүн амын доторх эдгээр харилцан үйлчлэл нь халдварыг хэрхэн нэмэгдүүлэх эсвэл бууруулах талаар харахын тулд бид өвчний мэдээлэл эсвэл статистик мэдээллийг оруулах шаардлагатай байна.

Эдгээр хувьсагчдыг бий болгох:

unvacc %төрөл: давхар; Вакцин хийлгээгүй хүмүүс энэ өвчнөөр өвчлөхгүй байх магадлал

вакцин %төрөл: давхар; вакцин хийлгэсэн хүмүүсийн өвчнөөр өвчлөхгүй байх магадлал %unvacc_perc %төрөл: давхар; хүн амын хувь вакцинжуулаагүй init_infect %төрөл: int; хүн амын хувь нь вакцин хийлгэсэн

Дараа нь бид тооцоолол хийх хэрэгтэй.

Бид 3*NUMOFPEOPLE матриц болох 'infekMat' хийх гэж байна.

vac_perc = 1-unvacc_perc;

халдварМат = нан (3, NUMOFPEOPLE); тоо = дугуй (вакцины_перк * NUMOFPEOPLE); халдварМат (1, 1: тоо) = вакцин; халдварМат (1, тоо+1: төгсгөл) = unvacc; халдварМат (2, 1: төгсгөл) = 0; халдварМат (2, 1: init_infect) = 1;

Кодын тайлбар

1 -р мөр: Вакцин хийлгээгүй хүн амын хувийг тооцоолно

2 -р мөр: 3*N тооны хүний матриц үүсгэх

3 -р мөр: Вакцин хийлгэсэн хүмүүсийн хэдэн хувийг вакцинжуулсан болохыг олж мэдэх

4 -р мөр: вакцин хийлгэсэн хүмүүсийн хувьд вакцин хийлгэхтэй холбоотой дархлааг тэдэнд өгнө. Энэ утгыг өвчний талаархи судалгаанд үндэслэн тогтоодог.

5 -р мөр: үлдсэн хүн амын хувьд (вакцин хийлгээгүй хүмүүс) тэдэнд дархлааны хувийг өгнө. Энэ утгыг өвчний талаархи судалгаанд үндэслэн тогтоодог.

6 -р мөр: Эхлээд бүх хүмүүсийг халдвар авахгүй байхаар тохируулна уу.

мөр 7: Анх халдвар авсан хүмүүсийн тоогоор эхний хос баганыг зохих ёсоор бөглөнө үү.

Одоо бид өвчний симуляцийн бүх параметрүүдийг тогтоосны дараа тухайн хүн (вакцин хийлгэсэн болон вакцин хийлгээгүй) халдвар авах магадлалыг санамсаргүй байдлаар сонгох болно. Дараагийн алхамд энэ 'infekMat' -ийн гурав дахь эгнээнд байгаа хүн бүрт 0 -ээс 1 хүртэлх санамсаргүй утгыг өгснөөр хийгддэг.

Алхам 4: Вакцин хийлгэсэн болон вакцин хийлгээгүй хүн халдвар авах магадлалыг санамсаргүй байдлаар тодорхойл

Дараа нь хүн бүрт санамсаргүй дугаар өг, энэ нь тухайн хүн халдвар авсан эсэхээ тодорхойлоход хэрэглэгдэнэ.

w = 1 хувьд: урт (халдварМат)

халдварMat (3, w) = ранд; Төгсгөл

Кодын тайлбар

Энэ нь давталтын хувьд сүүлийн шатанд үүсгэсэн 'infekMat' гурав дахь эгнээтэй холбоотой юм. 'rand' нь 3 -р мөрийн индекс бүрт 0 -ээс 1 хүртэлх утгыг өгдөг.

Гаралт

халдварМат одоо дууссан! Энэ нь 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 1.0000 0 0 0 0 0 0 0 0 0 0 0 0.0869 0.5489 0.3177 0.7997 0.7236 0.5721 0.717 0.75 0 0757 0.717 0.77 0 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 -ийг ашиглан нэг өдрийн дотор хүмүүстэй харьцсаны дараа ямар хүмүүс халдвар авсан болохыг тодорхойлох боломжтой.

Мөр бүрийн хувьд = 1: урт (adjMatrix)

if infekMat (2, eachRow) == 1 forCol = 1: length (adjMatrix) if adjMatrix (eachRow, eachCol) == 1 % eachRow = хүн % тус бүрCol = түүний найз % хүн бүрийн найз. if халдварMat (3, тус бүр Кол)> халдварМат (1, тус бүр Кол) халдварМат (2, тус бүр Кол) = 1; тодруулах (p, eachCol, 'NodeColor', 'r') түр зогсоох (хурд) төгсгөл төгсгөл төгсгөл төгсгөл

For давталт нь хүн бүрээр дамждаг. Энэ нь тухайн хүн халдвар авсан бол харьцсан хүмүүс/найз бүрийг шалгаж, найзынхаа дархлааны түвшин өвчний хүчнээс илүү байсан эсэхийг шалгадаг. Энд бидний өмнө нь үүсгэсэн 'халдварын эх' тоглоом тоглодог. Найзын багана бүрийн 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 -ээр халдвар авсан вакцин хийлгээгүй хүмүүсийн хувийг тооцоолно: урт (халдварын Мат) хэрэв халдвар бол Мат (1, х) == unvacc number_of_unvacc = number_of_unvacc+1; end if халдварMat (1, x) == unvacc & халдварMat (2, x) == 1 тоо_оф_инфек = тоо_оф_инвакк +1; төгсгөлийн төгсгөлийн хувь_of_unvacc_and_infec = (тоо_оф_инфек_унвацк / тоо_новацын тоо)*100;

Кодын тайлбар

For гогцоонд NUMOFPEOPLE удаа давталт хийнэ. InfectionMat -ийн тоо нь unvacc дугаартай (өөрөөр хэлбэл 0.95 == 0.95) харгалзах бүрт вакцин хийлгээгүй хүмүүсийн тоог 1 -ээр нэмэгдүүлэх болно. халдвар авсан болон вакцинд хамрагдаагүй хүмүүсийн тоо 1 -ээр нэмэгддэг. Сүүлийн мөрөнд вакцинд хамрагдаагүй хүмүүсийн тоог вакцинд хамрагдаагүй хүмүүсийн тоонд хуваадаг. Дараа нь үүнээс хувиар тооцно.

Сорилт:

Халдвар авсан хүмүүсийн вакцинжуулалтын хэдэн хувийг тооцоолохыг хичээгээрэй! (Зөвлөгөө: энэ нь дээрх кодтой маш төстэй боловч зарим хувьсагчийг өөрчилж, нэрийг нь тохируулсан болно.)

Дараа нь нийт хүн амд үндэслэн халдвар авсан хүмүүсийн хувийг тооцоолно.

pre_per_infect = cumsum (халдварMat (2,:));

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

Кодын тайлбар

Хуримтлагдсан нийлбэрийг тухайн хүн халдвар авсан эсэхээс хамаарч 1s болон 0 -ийг хадгалдаг халдварын хоёр дахь эгнээ ашиглан тооцоолно. Cumsum () функц нь матрицыг буцааж өгдөг тул бид матрицын хамгийн сүүлийн утгыг авдаг ('pre_per_infect (1, NUMOFPEOPLE)'), энэ нь 'халдварын хэмжээ (2,:)' -ээс авсан бүх утгуудын бодит нийлбэр байх ёстой. Нийлбэрийг NUMOFPEOPLE -д хувааж 100 -аар үржүүлснээр нийт хүн амын халдвар авсан хүмүүсийн эцсийн хувийг авна.

Алхам 11: 'InfectionSim.m' функцэд гаралтын хувьсагч үүсгэх

гаралт = [халдварын_хүн,_унвакк_ ба_инсний_хувийн_хувь_функцийн_хувийн_хувь];

Кодын тайлбар

Энэ мэдээллийг гаралт дээр хадгална уу. Функцийг дуудаж, ажиллуулж дууссаны дараа үндсэн (Monte_Carlo.m) руу буцааж илгээх болно. Энэхүү өгөгдлийг вакцин хийлгэсэн болон вакцинд хамрагдаагүй хүмүүсийн халдвар авсан хүмүүсийн хэдэн хувийг оноо авахад ашигладаг.

Таны'infectionSim.m 'функцийг яг одоо хийх ёстой! Гэсэн хэдий ч, энэ нь ажиллахгүй, учир нь бид үндсэн хэсгийг бичих хэрэгтэй хэвээр байна!

Алхам 12: Хэрэглэгчээс симуляцийн анхны нөхцлийг авахын тулд цэс үүсгэнэ үү

Бид хувьсагчийг хэрхэн хэлснийг санаарай

хурд

үүсгэж, үндсэн функцээр дамжуулах уу? Функцэд дамжуулахын тулд бид утгыг олж авах хэрэгтэй. Функцийг дуудахдаа утгуудын дараалал чухал болохыг анхаарна уу.

Хэрэглэгчээс зарим хариултыг терминал руу оруулахыг хүсч эхэл.

> Өвчин сонгоно уу. Том, томуу >> Томуу >> Улаанбурхан >> Сонгосон өвчин: Томуу >> Хүн амын тоог сонгоно уу. >> 20 >> 200 >> Сонгосон хүн ам: 20 >> Симуляцийн хурдыг сонгоно уу. >> Хурдан >> Удаан >> Хурдыг сонгосон: Хурдан

Доорх энэ код нь хэрэглэгчээс ямар өвчнийг судлахыг хүсч байгааг асууна.

disp ('Өвчин сонгоно уу. Энэ нь том үсгээр бичигдсэнийг анхаарна уу')

fprintf ('Pertussis / nFlu / n Measles / 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') популяци_хэмжээ = 200; Төгсгөл

Кодын тайлбар

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

Дараа нь бид симуляцийн хурдыг олох хэрэгтэй.

disp ('Симуляцийн хурдыг сонгох.')

fprintf ('Хурдан / nУдаан / n') хурд = оролт ('Хурд сонгогдсон:', 's'); хэрэв тэнцүү (хурд, 'Хурдан') sim_speed = 0; elseif isequal (хурд, 'Удаан') sim_speed = 0.25; Төгсгөл

Кодын тайлбар

Энэ үйл явц нь өвчний төрөл, хүн амын тоог авахтай адил байв. Мацаг барихын тулд түр завсарлахгүй. мөн удаашралтай үед симуляцийг ажиллуулах үед for гогцоонд 0.25 секундын хоцрогдол үүснэ.

Агуу их! Одоо бидэнд хэрэгтэй хэрэглэгчийн бүх оролт байна! Вакцин хийлгээгүй хүмүүсийн янз бүрийн хувь хэмжээгээр мэдээлэл цуглуулах ажлыг үргэлжлүүлье.

Алхам 13: Вакцинд хамрагдаагүй хүмүүсийн % -ийг сонгож, вакцинд хамрагдаагүй болон халдвар авсан хүмүүсийн дундаж хэмжээг сонгосон хувиар тооцоолно уу

Энэ код нь вакцин хийлгээгүй хүмүүсийн 0% -д зориулагдсан болно.

% ------- % 0 Вакцин хийлгээгүй ------------

per_infect_av_0 = ; хувь_нувакк_ ба_инфек_ав_0 = ; for i = 1:20 out = халдварSim (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 = дундаж (хувь_унвац_ ба_инфек_ав_0);

Кодын тайлбар:

For давталтыг 20 удаа ажиллуулдаг. InfectionSim () функцийн гаралтыг out -д хадгалдаг. 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 -р мөр: халдвар авсан хүмүүсийн дунджид y утгыг өгсөн

2 -р мөр: вакцин хийлгээгүй эхний хувь эзлэх хувийн х утгыг өгсөн

3 -р мөр: 0% ба 5% -ийн налууг тооцоолох

4 -р мөр: шугамын y утгыг хадгалах. Энэ бол 0% -аас 5% хүртэлх хэсгийн үргэлжлэл юм.

мөр 5: шугамын y утгыг хадгалах. Энэ мөр нь графикийн уртыг хамарна.

6 -р мөр: зураг үүсгэх

7 -р мөр: Вакцин хийлгээгүй халдвар авсан хүмүүсийн x ба y утгуудын графикийг зур.

мөр 8: шугамыг зур. Үүнийг шугаман байдлаар бус харин геометрийн хувьд нэмэгддэг болохыг харуулахад ашигладаг.

мөр 9: Графикийн нэрийг тохируулна уу.

10-11 мөр: Графикт x ба y шошго тавина.

Вакцин хийлгээгүй хүн амын тоо их байх тусам халдварын хэмжээ их байх болно гэдгийг та харах боломжтой байх ёстой. Улаан болж хувирдаг ихэнх цэгүүд нь ногоон цэгүүд байдаг бөгөөд энэ нь вакцин ямар нэг хэмжээгээр тусалдаг болохыг та бас харах болно! Энэ заавар танд таалагдсан гэж найдаж байна. Асуух зүйл байвал сэтгэгдэл бичээрэй!

Алхам 15: Эцсийн бүтээгдэхүүн: Симуляци ямар харагдаж байна

Бүх кодыг эндээс олж болно

Зөвлөмж болгож буй: