Агуулгын хүснэгт:
- Алхам 1: Хажуугийн матриц үүсгэх
- Алхам 2: Харилцааг бий болгох
- Алхам 3: Өвчний статистикийг нэмнэ үү
- Алхам 4: Вакцин хийлгэсэн болон вакцин хийлгээгүй хүн халдвар авах магадлалыг санамсаргүй байдлаар тодорхойл
- Алхам 5: Анхны мэдээлэлээс вакцин хийлгээгүй, халдвар авсан хүмүүсийн матрицыг бий болгох
- Алхам 6: Анхны графикийг зур
- Алхам 7: Халдварын явцыг дуурай
- Алхам 8: Монте Карлогийн онолыг ашиглана уу
- Алхам 9: Симуляцийг функцэд оруулаад файлыг ('infectionSim.m ') хий
- 10 -р алхам: Халдвар авсан вакцинд хамрагдаагүй, вакцин хийлгэсэн хүмүүсийн хувь хэмжээг тооцоол
- Алхам 11: 'InfectionSim.m' функцэд гаралтын хувьсагч үүсгэх
- Алхам 12: Хэрэглэгчээс симуляцийн анхны нөхцлийг авахын тулд цэс үүсгэнэ үү
- Алхам 13: Вакцинд хамрагдаагүй хүмүүсийн % -ийг сонгож, вакцинд хамрагдаагүй болон халдвар авсан хүмүүсийн дундаж хэмжээг сонгосон хувиар тооцоолно уу
- Алхам 14: График: 'Вакцин хийлгээгүй хүмүүсийн эсрэг халдварын хандлага. Тодорхойлсон өвчинд вакцин хийлгэсэн '
- Алхам 15: Эцсийн бүтээгдэхүүн: Симуляци ямар харагдаж байна
Видео: Вакцин хийлгэх үү, үгүй юу? Өвчний симуляци ашиглан сүргийн дархлааг ажиглах төсөл: 15 алхам
2024 Зохиолч: John Day | [email protected]. Хамгийн сүүлд өөрчлөгдсөн: 2024-01-30 11:04
Төслийн тойм:
Манай төсөл нь сүргийн дархлааг судалж, манай нутгийн иргэд халдварын түвшинг бууруулахын тулд вакцин хийлгэхийг уриална гэж найдаж байна. Манай хөтөлбөр вакцин хийлгэсэн болон вакцинжуулаагүй хувь хэмжээ нь өөр өөр хувь хүн амд хэрхэн халдварладаг болохыг дуурайдаг. Энэ нь сүргийн дархлааг харуулж, вакцинжуулсан хүн амын тоо нэмэгдэх нь халдвар авсан хүмүүсийн тоог хэрхэн бууруулж болохыг харуулж байна.
Бид үүнийг 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: Эцсийн бүтээгдэхүүн: Симуляци ямар харагдаж байна
Бүх кодыг эндээс олж болно
Зөвлөмж болгож буй:
Автомат ЭКГ: LTspice ашиглан олшруулалт ба шүүлтүүрийн симуляци: 5 алхам
Автомат ЭКГ: LTspice ашиглан олшруулалт ба шүүлтүүрийн симуляци: Энэ бол таны барьж буй эцсийн төхөөрөмжийн зураг ба хэсэг бүрийн талаар маш гүнзгий хэлэлцүүлэг юм. Мөн үе шат бүрийн тооцооллыг тайлбарласан болно. Зураг дээр энэ төхөөрөмжийн блок диаграммыг харуулав
(Маш энгийн) Өвчний загварчлал (Scratch ашиглан): 5 алхам
(Маш энгийн) Өвчний загварчлал (Scratch ашиглан): Өнөөдөр бид өвчний дэгдэлтийг дуурайх болно, энэ нь заавал COVID-19 биш аливаа өвчин юм. Энэхүү симуляцийг миний холбох 3blue1brown видеоноос санаа авсан болно. Энэ бол чирэлт, уналт учраас бид JS эсвэл Pyt дээр хийж чадах зүйлээ хийж чадахгүй
Arduino UNO болон SD-карт ашиглан чийгшил, температурыг бодит цаг хугацаанд хэрхэн бүртгэх вэ? DHT11 Proteus дахь өгөгдөл бүртгэх симуляци: 5 алхам
Arduino UNO болон SD карт ашиглан чийгшил, температурыг бодит цаг хугацаанд хэрхэн бүртгэх вэ? DHT11 Proteus дахь өгөгдөл бүртгэгч симуляци: Танилцуулга: сайн уу, энэ бол Liono Maker, энд YouTube-ийн линк байна. Бид Arduino-тэй хамтран бүтээлч төсөл хийж, суулгагдсан систем дээр ажиллаж байна. Өгөгдөл бүртгэгч: Өгөгдөл бүртгэгч (өгөгдөл бүртгэгч эсвэл өгөгдөл бүртгэгч) нь цаг хугацааны явцад өгөгдлийг бүртгэдэг электрон төхөөрөмж юм
Температурын хяналттай вакцин ба инсулин хөргөгч: 9 алхам (зурагтай)
Температурын хяналттай вакцин ба инсулин хөргөгч: Хөргөхгүй байх нь хүний амийг авардаг Хөгжиж буй орнуудад вакцин нь Эбола, томуу, холер, сүрьеэ, Денге зэрэг аюултай өвчнөөс урьдчилан сэргийлэх хамгаалалтын шугам болдог. Вакцин болон амь аврах бусад материалыг тээвэрлэх гэх мэт
Нүдний шил унших замаар хиртэлтийг ажиглах (мөн миний нүдийг шатаахгүй байх): 4 алхам (зурагтай)
Нүдний шил унших замаар хиртэлтийг ажиглах нь (мөн нүдээ шатаахгүй байх): Хөөе, би таны цол хэргэмийг сонирхож байсан уу? Аав маань ч мөн адил бид өчигдөр Монтр гудамжинд алхаж байхдаа нүдний шилээ сугалж, хиртэлтийг хэрхэн яаж харахыг унших нүдний шилтэйгээ хэрхэн яаж хийхийг надад харуулсан юм