جدول المحتويات:

لتلقيح ام لا؟ مشروع مراقبة مناعة القطيع من خلال محاكاة الأمراض: 15 خطوة
لتلقيح ام لا؟ مشروع مراقبة مناعة القطيع من خلال محاكاة الأمراض: 15 خطوة

فيديو: لتلقيح ام لا؟ مشروع مراقبة مناعة القطيع من خلال محاكاة الأمراض: 15 خطوة

فيديو: لتلقيح ام لا؟ مشروع مراقبة مناعة القطيع من خلال محاكاة الأمراض: 15 خطوة
فيديو: داء الكلب 2024, يوليو
Anonim
لتلقيح ام لا؟ مشروع مراقبة مناعة القطيع من خلال محاكاة الأمراض
لتلقيح ام لا؟ مشروع مراقبة مناعة القطيع من خلال محاكاة الأمراض

نظرة عامة على المشروع:

يستكشف مشروعنا مناعة القطيع ويأمل في تشجيع الناس على الحصول على اللقاحات لتقليل معدلات الإصابة في مجتمعاتنا. يحاكي برنامجنا كيف يصيب المرض السكان بنسب مختلفة من التطعيمات ومعدلات التطعيم. يُظهر مناعة القطيع من خلال إظهار كيف يمكن أن يؤدي زيادة عدد السكان الملقحين إلى تقليل عدد الأشخاص المصابين.

نقوم بنمذجة هذا في Matlab باستخدام مفاهيم نظرية الرسم البياني. تعتبر نظرية الرسم البياني طريقة رياضية لتمثيل العلاقات بين الأشياء. في نظرية الرسم البياني ، تحتوي الرسوم البيانية على رؤوس (أو عقد) متصلة بحواف (أو خطوط). بالنسبة لمشروعنا ، العقد هي الأفراد المعنيون والحواف هي روابطهم. على سبيل المثال ، إذا كانت عقدتان متصلتان بحافة ، فهذا يعني أنهما "أصدقاء" أو لديهما شكل من أشكال الاتصال مع بعضهما البعض. هذا الاتصال هو وسيلة لانتشار المرض. هذا هو السبب في أننا استخدمنا نظرية الرسم البياني لنمذجة مفهومنا لأننا أردنا أن نرى كيف ينتشر المرض بين الأفراد المرتبطين في المجتمع.

يتضمن مشروعنا أيضًا طريقة مونت كارلو. طريقة مونت كارلو هي خوارزميات تقوم بإنشاء عينات عشوائية متكررة للحصول على نتائج رقمية. في مشروعنا ، نستخدم هذه الطريقة لتشغيل المحاكاة عدة مرات لتغيير النسبة المئوية الأولية غير المحصنة لمعرفة معدل إصابة الأشخاص بالعدوى.

كل كود المشروع مرتبط في الأسفل!

رصيد الكمبيوتر الشخصي:

رابط Matlab لنظرية الرسم البياني:

الخطوة 1: إنشاء مصفوفة الجوار

إنشاء مصفوفة الجوار
إنشاء مصفوفة الجوار
إنشاء مصفوفة الجوار
إنشاء مصفوفة الجوار

قم بإنشاء نص جديد. سوف نطلق على مرضنا اسم "العدوى Sim.m".

سنقوم بإنشاء متغير "NUMOFPEOPLE". يمكنك تخصيصه لأي قيمة عددية. سيمثل هذا عدد الأشخاص بين سكانك.

من الآن فصاعدا ، سوف نفترض ذلك

NUMOFPEOPLE = 20 ،

ابدأ أولاً باستخدام وظائف نظرية الرسم البياني لماتلاب لرسم بياني غير موجه.

إذا كنت مهتمًا بمعرفة المزيد ، فإليك رابطًا لقراءة المزيد حول هذا الموضوع.

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

إنشاء مصفوفة مجاورة.

عامل مصفوفة = أصفار (NUMOFPEOPLE) ؛

سيؤدي ذلك إلى إنشاء مصفوفة مربعة مكونة من أصفار. كل صف في المصفوفة هو شخص. كل عمود في المصفوفة هو شخص أو صديق يلتقي به الشخص طوال اليوم.

انظر الشكل 100 (أعلاه) للمساعدة في تصور الشكل الذي تبدو عليه المصفوفة الإضافية لـ 20 شخصًا.

** من الآن فصاعدًا سنفترض أن NUMOFPEOPLE يساوي 20. **

يمكنك محاولة رسم هذه المصفوفة المجاورة. فيما يلي مزيد من المعلومات حول رسم هذه الأنواع من المصفوفات.

ملاحظة: كيف تعمل مصفوفة الجوار.

السابق:

٪ مما يجعل المصفوفة المجاورة

أ = [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) ؛ ح = قطعة أرض (ز) ؛

انظر الشكل 1 (أعلاه) لمعرفة كيفية إضافة الحواف في المصفوفة المجاورة ، باستخدام الكود في "ملاحظة".

الخطوة الثانية: إنشاء العلاقات

أنشئ علاقات
أنشئ علاقات

الآن بعد أن تم إنشاء الأشخاص (الرؤوس أو العقد) ، نحتاج إلى إنشاء شبكة من العلاقات (خطوط أو حواف الرسم البياني). سيحاكي هذا كيف يتفاعل الناس ويلتقون بأشخاص آخرين على مدار اليوم.

يمكن القيام بذلك بعدة طرق. تتمثل إحدى طرق إكمال هذه المهمة في تعيين رقم عشوائي لكل شخص أولاً لتحديد عدد الأشخاص الذين سيتفاعل معهم كل شخص في اليوم.

numOfFriendsMatrix = randi ([lessFriendsPersonCanHave، mostFriendsPersonCanHave]، 1، NUMOFPEOPLE) ،

هذا يجعل مصفوفة 1 × 20 من الأعداد الصحيحة العشوائية تمثل عدد التفاعلات لكل شخص في اليوم. ستكون أعمدة هذه المصفوفة هي الرقم المقابل لكل شخص. على سبيل المثال ، إذا عيّننا أقل عدد من_الأصدقاء_العاملين_القديسين = 2 و mostFriendsPersonCanHave = 5 ، فسنحصل على قيم عشوائية بين 2 و 5.

هل تواجه مشكلة مع راندي ()؟ في المحطة ، اكتب

مساعدة راندي

بعد ذلك ، نقوم بعمل مصفوفة عشوائية (تسمى "allFriendsmatrix") لكيفية اتصال / تفاعل كل شخص في المجتمع داخل المجتمع.

tempMatrix = ،

العد = 0 ؛ allFriendsMatrix = ، لـ k = 1: NUMOFPEOPLE بينما الطول (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1 ؛ temp = randi ([1، NUMOFPEOPLE]) ؛ tempMatrix (عدد) = temp ؛ نهاية واضحة كل بينما الطول (tempMatrix) ~ = 9 tempMatrix = [tempMatrix، NaN] ؛ end allFriendsMatrix = [allFriendsMatrix ؛ tempMatrix] ؛ tempMatrix = ، العد = 0 ؛ نهاية

في شرح تفصيلي للكود:

أولاً ، نقوم بإنشاء مصفوفة مؤقتة فارغة لاحتواء قائمة الأصدقاء / التفاعل لكل شخص. نقوم أيضًا بتهيئة العد ، والذي يتتبع فقط مكان لصق الاتصال العشوائي الجديد في tempMatrix. تعمل حلقات for 20 مرة بحيث يحدث هذا لكل فرد من السكان. يتم تشغيل حلقة while الأولى حتى يصبح tempMatrix لكل شخص بنفس طول عدد التفاعلات المعين عشوائيًا. في هذه الحلقة ، يتم إنشاء رقم عشوائي مطابق للشخص في المجتمع ووضعه في tempMatrix. نظرًا لاختلاف أطوال كل من المصفوفات المؤقتة ، فقد احتجنا إلى إنشاء بعض قيم NaN حتى نتمكن من تجميع كل هذه العناصر المؤقتة في مصفوفة واحدة ("allFriendsMatrix"). تعمل حلقة while الثانية على حل هذه المشكلة عن طريق إضافة NaN في كل tempMatrix. تم تعيين حلقة while للتشغيل 9 مرات لأنها رقم أكبر من 5 ، وهو الحد الأعلى للأصدقاء الذي يمكن تخصيصه لشخص ما. القيمة "9" متغيرة ويمكن / يجب تغييرها عندما تكون "mostFriendsPersonCanHave" أكبر من 9. تضيف الأسطر الثلاثة الأخيرة من الكود (باستثناء النهاية) tempMatrix إلى الصف التالي من "allFriendsMatrix". ثم يزيل tempMatrix ويحسب للشخص التالي.

انتاج |

هذا هو الشكل الذي يجب أن يبدو عليه الإخراج لأول مرة خلال حلقة for (قبل الأسطر الثلاثة الأخيرة).

مصفوفة الحرارة = 16 8 17 16 13 NaN NaN NaN NaN

allFriendsMatrix =

16 8 17 16 13 NaN NaN NaN NaN 8 8 2 7 11 NaN NaN NaN NaN 10 13 NaN NaN NaN NaN NaN NaN NaN 11 17 2 NaN NaN NaN NaN NaN NaN 10 12 NaN NaN NaN NaN NaN NaN 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 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 2 18 10 16 NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN 8 16 14 8 NaN NaN NaN NaN NaN 7 7 NaN NaN NaN NaN NaN NaN NaN 19 10 9 NaN NaN NaN NaN NaN NaN 10 19 NaN NaN NaN NaN NaN NaN NaN NaN 5 18 NaN NaN NaN NaN NaN NaN NaN 16 7 13 10 1 NaN NaN NaN NaN

بعد ذلك ، أضف هذه العلاقات إلى المصفوفة المساعدة.

لكل صف = 1: NUMOFPEOPLE

لكل كول = 1: 9 إذا إسنان (allFriendsMatrix (everyRow، eachCol)) == 0 مصفوفة إضافية (eachRow، allFriendsMatrix (eachRow، eachCol)) = 1 ؛ AdAdMatrix (allFriendsMatrix (eachRow، eachCol)، eachRow) = 1 ؛ نهاية النهاية

شرح الكود

تمر حلقة for المزدوجة هذه عبر كل صف وعمود من "allFriendsMatrix". سيتم تشغيل عبارة if لجميع القيم التي ليست "NaN". في الأساس ، ستنشئ حواف الرسم البياني أو خطوطه. لذا ، فإن السطر الأول الذي سيجعله هذا هو الشخص 1 إلى الشخص 16 والشخص من 16 إلى الشخص 1. نظرًا لأنه غير موجه ، يجب تغيير 1 لكليهما! لا يمكننا فقط الحصول على الحافة 1 إلى 16 وليس 16 إلى 1. يجب أن تكون متماثلة حتى تعمل بشكل صحيح في Matlab.

في محاكاتنا ، أثبتنا أنه لا يمكن للناس التفاعل مع أنفسهم. عندما قمنا بترتيب القيم عشوائيًا ، فهناك احتمال أن تحتوي المصفوفة المجاورة على هذه الأخطاء.

دعنا نصلح هذا بالكود التالي:

لكل = 1: NUMOFPEOPLE

مصفوفة إضافية (لكل منهما) = 0 ؛ نهاية

شرح الكود

تضمن حلقة for هذه أن الشخص 1 غير متصل بالشخص 1 ، والشخص 2 غير متصل بالشخص 2 ، وما إلى ذلك من خلال جعلهم جميعًا 0. كما ترون أدناه في قسم الإخراج ، لدينا قطري المربع المصفوفة من أعلى اليسار إلى أسفل اليمين كلها صفر.

انتاج |

هذه هي المصفوفة النهائية لهذه المحاكاة الحالية. هذا يفسر جميع الخطوط في الرسم البياني (الشكل 2).

مصفوفة =

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

انظر الشكل 2 لمشاهدة رسم بياني لـ "ملحق مصفوفة".

الخطوة 3: أضف إحصائيات المرض

الآن بعد أن تمكن برنامجك من إنشاء رسم بياني مع مجموعة من الأشخاص العشوائيين وإنشاء علاقات عشوائية ، نحتاج إلى إدخال معلومات أو إحصائيات المرض لنرى كيف يمكن لهذه التفاعلات داخل السكان أن تزيد أو تقلل من العدوى.

قم بإنشاء هذه المتغيرات:

نوع unvacc٪: مزدوج ؛ نسبة احتمال عدم إصابة الأشخاص غير المطعمين بالمرض

نوع اللقاح٪: مزدوج ؛ نسبة احتمال عدم إصابة الأشخاص الذين تم تطعيمهم بالمرض نوع unvacc_perc٪: ضعف ؛ نسبة السكان غير الملقحين init_infect٪ type: int؛ نسبة السكان الذين تم تطعيمهم

بعد ذلك نحتاج إلى إجراء بعض الحسابات.

سنقوم بصنع "سجادة العدوى" وهي عبارة عن مصفوفة عدد 3 * NUMOFPEOPLE.

Vac_perc = 1-unvacc_perc ؛

عدوى مات = نان (3 ، NUMOFPEOPLE) ؛ العدد = الجولة (Vac_perc * NUMOFPEOPLE) ؛ عدوى مات (1 ، 1: رقم) = لقاح ؛ عدوى مات (1 ، رقم + 1: نهاية) = unvacc ؛ عدوى مات (2 ، 1: نهاية) = 0 ؛ عدوى مات (2 ، 1: init_infect) = 1 ؛

شرح الكود

السطر 1: النسبة المئوية للسكان غير الملقحين محسوبة

السطر 2: إنشاء مصفوفة عدد 3 * N من الأشخاص

السطر 3: معرفة عدد الأشخاص الذين تم تطعيمهم من نسبة التطعيم

السطر 4: بالنسبة للأشخاص الملقحين ، امنحهم مناعة مرتبطة بالحصول على اللقاح. يتم تعيين هذه القيمة بناءً على البحث حول المرض.

السطر الخامس: بالنسبة لبقية السكان (الأشخاص غير الملقحين) ، امنحهم الحصانة المئوية. يتم تعيين هذه القيمة بناءً على البحث حول المرض.

السطر 6: اضبط جميع الأشخاص في البداية على عدم الإصابة.

السطر 7: بالنسبة لعدد الأشخاص المصابين في البداية ، املأ العمودين الأولين وفقًا لذلك.

الآن بعد أن قمنا بتعيين جميع المعلمات لمحاكاة المرض ، سنقوم باختيار عشوائي لفرصة إصابة الشخص (سواء الملقح أو غير الملقح) بالعدوى. يتم ذلك في الخطوة التالية عن طريق تعيين قيم عشوائية بين 0 و 1 لكل شخص في الصف الثالث من هذا "العدوى مات".

الخطوة 4: قم بترتيب فرصة إصابة الشخص الملقح وغير الملقح بالعدوى بشكل عشوائي

بعد ذلك ، قم بتعيين رقم عشوائي لكل شخص ، وسيتم استخدامه لاحقًا لتحديد ما إذا كان الشخص مصابًا أم لا.

ل = 1: الطول (عدوى مات)

عدوى مات (3 ، ث) = راند ؛ نهاية

شرح الكود

تتعامل حلقة for هذه مع الصف الثالث من "داد العدوى "الذي تم إنشاؤه في الخطوة الأخيرة. يعيّن 'rand' قيمة بين 0 و 1 لكل فهرس في الصف 3.

انتاج |

العدوى اكتملت الآن! كان هذا مع مجموعة سكانية تم تطعيمها بنسبة 100 ٪ وشخص واحد مصاب في البداية.

عدوى مات =

الأعمدة من 1 إلى 12 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 1.0000 0 0 0 0 0 0 0 0 0 0 0 0.0869 0.5489 0.3177 0.9927 0.7236 0.5721 0.7172 0.9766 0.4270 0.9130 0.8973 0.8352 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 0.7500 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" والتي تخزن جميع المصابين من العدوى. سيتم استخدام هذا حتى نتمكن من تلوين الرسم البياني للأشخاص المصابين أو غير المطعمين أو الملقحين ، مما يساعد على تصور تأثير الأفراد غير الملقحين مقابل الأفراد الذين تم تطعيمهم.

مسح كل

matrixInfected = ، matrixUnvacc = ، ل = 1: الطول (عدوى مات) إذا عدوى مات (1 ، ح) == unvacc matrixUnvacc = [matrixUnvacc، h] ؛ النهاية للشخص = 1: NUMOFPEOPLE إذا كانت العدوى مات (2 ، شخص) == 1 matrixInfected = [matrixInfected، person] ؛ نهاية النهاية

شرح الكود

قم بإنشاء مصفوفتين فارغتين لتخزين أعداد الأشخاص غير المطعمين والمصابين ، على التوالي. يتم تشغيل كل من حلقات for 20 مرة ، وإذا كانت عبارة if مستوفاة ، فسيتم إضافة الرقم إلى المصفوفة الصحيحة.

انتاج |

matrixUnvacc =

مصفوفة مصابة =

[1]

الخطوة 6: رسم الرسم البياني الأولي

رسم الرسم البياني الأولي
رسم الرسم البياني الأولي

بعد ذلك سنقوم برسم مصفوفة الجوار.

ز = رسم بياني (مصفوفة إضافية) ؛

الشكل (1) ص = قطعة أرض (g ، 'NodeColor' ، 'b' ، 'MarkerSize' ، 7) ؛ قم بتمييز (p، matrixUnvacc، 'NodeColor'، 'g') تمييز (p، matrixInfected، 'NodeColor'، 'r') title_unvacc = unvacc_perc * 100 ؛ العنوان (['نسبة الأشخاص غير الملقحين:'، num2str (title_unvacc)، '٪'])؛ وقفة (السرعة)

شرح الكود

بنيت نظرية الرسم البياني في Matlab في وظائف. عندما نستخدم وظيفة الرسم البياني () ، يمكننا ترجمة "المصفوفة" إلى رسم بياني فعلي غير موجه. يتعين علينا بعد ذلك إنشاء مخطط باستخدام وظيفة المؤامرة () لنرى بالفعل كيف تبدو. قمنا بتعيين هذه المؤامرة () على متغير حتى نتمكن من معالجة ألوان الحبكة وتغييرها بسهولة أكبر خلال المحاكاة. يتم ضبط جميع الأشخاص (أو العقد) مبدئيًا على اللون "الأزرق". بعد ذلك ، يتم ضبط جميع الأشخاص غير الملقحين على اللون "الأخضر". ثم يتم ضبط الأشخاص المصابين على اللون "الأحمر". يتم تعيين العنوان وفقًا لقيمة النسبة المئوية المحددة للأشخاص غير المطعمين الذين يتم اختبارهم. توقف الوظيفة pause () مؤقتًا تنفيذ MatLab. نمر بالسرعة المتغيرة والتي يتم حسابها في ثوان.

انظر الصورة (أعلاه) لرؤية رسم بياني عشوائي اللون.

تعرف على المزيد حول وظيفة الإبراز () في MatLab.

الخطوة السابعة: محاكاة تطور العدوى

بعد ذلك ، نحتاج إلى معرفة من يصاب بعد التفاعلات (المسجلة في المصفوفة المساعدة) وتحديث الرسم البياني عندما يصاب شخص ما.

استخدم المصفوفة المساعدة لتحديد الأشخاص المصابين بعد تفاعلهم مع الأشخاص في يوم واحد.

لكل صف = 1: الطول (إضافة مصفوفة)

إذا كانت العدوى مات (2 ، كل صف) == 1 لكل كول = 1: الطول (إضافة مصفوفة) إذا كانت مصفوفة متغيرة (كل صف ، كل كول) == 1٪ كل صف = الشخص٪ كل كول = صديقه٪ صديق كل شخص ومعرفة ما إذا كان مصابًا. إذا كانت العدوى مات (3 ، كل كول)> عدوى مات (1 ، كل كول) عدوى مات (2 ، كل كول) = 1 ؛ تسليط الضوء (p ، everyCol ، 'NodeColor' ، 'r') إيقاف مؤقت (سرعة) نهاية نهاية نهاية

حلقات for من خلال كل شخص. يتحقق من أنه في حالة إصابة الشخص بالعدوى ، فإنه سيفحص كل من الأشخاص / الأصدقاء الذين تفاعل معهم ويتحقق مما إذا كان مستوى مناعة الصديق أكبر من قوة المرض. هذا هو المكان الذي تلعب فيه "العدوى" التي أنشأناها سابقًا. تتم مقارنة الصفين الأول والثالث من كل عمود من الصديق وإذا كان الصف الثالث أكبر ، فهذا يعني أن الصديق لم يكن لديه مناعة عالية بما يكفي للهروب من المرض وفي النهاية يصاب بالعدوى. نغير أيضًا إلى اللون باستخدام التمييز () إلى اللون الأحمر إذا أصيبوا.

الآن يجب أن يعمل رمز المحاكاة الخاص بك! ولأي حجم من السكان ، ما عليك سوى تغيير NUMOFPEOPLE!

الخطوة 8: استخدم نظرية مونت كارلو

للمضي قدمًا في هذه الخطوة واستخراج البيانات من جهاز المحاكاة الخاص بنا ("العدوى Sim.m") ، أردنا حساب ورسم الاتجاه في النسبة المئوية للأشخاص غير المطعمين الذين أصيبوا بالعدوى ونسبة الأشخاص الذين تم تطعيمهم والذين أصيبوا بالعدوى. نفترض أن نسبة الأشخاص الذين تم تطعيمهم والذين أصيبوا بالعدوى يجب أن تكون أقل بكثير من نسبة الأشخاص غير المطعمين الذين أصيبوا بالعدوى.

الخطوة 9: اجعل الملف ('InfectionSim.m') باستخدام المحاكاة في وظيفة

لتشغيل مونت كارلو ، نود تشغيل المحاكاة عدة مرات وتجميع البيانات حتى نتمكن من استخدام ذلك لرسم بياني للنسب المئوية للأشخاص المصابين.

يمكن إعداد الوظيفة على النحو التالي:

دالة الإخراج = عدوى سيم (unvacc ، لقاح ، NUMOFPEOPLE ، unvacc_perc ، init_infect ، speed)

قم بالتعليق على المتغيرات في المحاكاة الخاصة بك لأنك تقوم الآن بتمريرها من خلال الملف الرئيسي (سنبدأ في كتابة هذا في الخطوة 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 responseMat (1، x) == unvacc & infectionsMat (2، x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1 ؛ النسبة المئوية لنهاية النهاية_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc) * 100 ؛

شرح الكود

في الحلقة for ، ستتكرر أكثر من NUMOFPEOPLE مرة. في كل مرة يتطابق الرقم الموجود في سجادة العدوى مع رقم unvacc (أي 0.95 = = 0.95) ، سيزداد عدد الأشخاص غير المحصنين بمقدار 1. في كل مرة يتوافق الرقم الموجود في سجادة العدوى مع رقم unvacc وقد أصيبوا بالعدوى ، يزداد عدد المصابين وغير المحصنين بمقدار 1. السطر الأخير يقسم عدد المصابين وغير المطعمين على إجمالي عدد الأشخاص غير المحصنين. ثم يتم حساب النسبة من هذا.

تحد:

حاول أن تحسب نسبة تطعيم الأشخاص المصابين! (تلميح: إنه مشابه جدًا لهذا الرمز أعلاه ، ولكن يتم تغيير بعض المتغيرات وتعديل الأسماء.)

بعد ذلك يتم حساب النسبة المئوية للأشخاص المصابين بناءً على إجمالي عدد السكان:

pre_per_infect = cumsum (عدوى مات (2،:)) ؛

per_infect = (pre_per_infect (1، NUMOFPEOPLE) / NUMOFPEOPLE) * 100 ؛

شرح الكود

يتم حساب المجموع التراكمي باستخدام الصف الثاني من العدوى ، والذي يخزن 1 و 0 اعتمادًا على ما إذا كان الشخص مصابًا أم لا.نظرًا لأن الدالة cumsum () تعيد مصفوفة ، فإننا نأخذ القيمة الأخيرة في المصفوفة ('pre_per_infect (1، NUMOFPEOPLE)') ، والتي يجب أن تكون المجموع الفعلي لجميع القيم من "العدوى مات (2،:)". بقسمة المجموع على NUMOFPEOPLE وضربه في 100 ، نحصل على النسبة المئوية النهائية للمصابين في إجمالي عدد السكان.

الخطوة 11: إنشاء متغير إخراج في وظيفتك "InfectionSim.m"

الإخراج = [per_infect، percentage_of_unvacc_and_infec، percentage_of_vacc_and_infec] ؛

شرح الكود

قم بتخزين هذه المعلومات في الإخراج ، والتي سيتم إرسالها مرة أخرى إلى main (Monte_Carlo.m) عندما يتم استدعاء الوظيفة والانتهاء من التشغيل. تُستخدم هذه البيانات لرسم بياني لنقاط النسبة المئوية للمصابين من أولئك الذين تم تطعيمهم وغير الملقحين.

يجب أن يتم تنفيذ وظيفة "InfectionSim.m" الآن! ومع ذلك ، لن يتم تشغيله لأننا ما زلنا بحاجة إلى كتابة main!

الخطوة 12: قم بإنشاء قائمة للحصول على الشروط الأولية للمحاكاة من المستخدم

تذكر كيف قلنا المتغير

سرعة

سيتم إنشاؤها وتمريرها من خلال الوظيفة الرئيسية؟ نحتاج إلى الحصول على القيم لتمريرها إلى الدالة. لاحظ أن ترتيب القيم عند استدعاء الوظيفة مهم!

ابدأ بمطالبة المستخدم بكتابة بعض الإجابات في الجهاز.

> اختر المرض. لاحظ أنه حساس لحالة الأحرف >> الشاهوق >> الإنفلونزا >> الحصبة >> المرض المختار: الأنفلونزا >> اختر حجم السكان. >> 20 >> 200 >> السكان المختارون: 20 >> اختر سرعة المحاكاة. >> سريع >> بطيء >> السرعة المختارة: سريعة

يسأل هذا الرمز أدناه المستخدم عن المرض الذي يريد البحث فيه.

disp ("اختر مرضًا. لاحظ أنه حساس لحالة الأحرف")

fprintf ('Pertussis / nFlu / n Measles / n') المرض = المدخلات ('Disease Chosen:'، 's') ؛ إذا كان اللقاح المتكافئ (المرض ، الشاهوق) = 85. فرصة 15٪ للإصابة بالمرض =.20 ؛ فرصة 80٪ للإصابة بمرض آخر إذا كان اللقاح متساوي (مرض ، أنفلونزا) =.75 ؛ فرصة 25٪ للإصابة بالمرض =.31 ؛ 69٪ فرصة للإصابة بالمرض elseif = لقاح الحصبة =.97 ؛ ٪ 3 فرصة للإصابة بالمرض unvacc =.10؛ 90٪ فرصة لإنهاء المرض

شرح الكود:

تقوم وظيفة disp () بطباعة العبارة على الشاشة وتقوم أيضًا بطباعة الخيارات المختلفة. سيتم تحديد المرض وفقًا لذلك. هذا الإصدار لا يأخذ في الاعتبار المدخلات غير الصالحة. سيؤدي الإدخال غير الصحيح إلى حدوث خطأ وإيقاف البرنامج تمامًا. كل مرض له قيم لقاح و unvacc المرتبطة به. هذه القيم ليست عشوائية. لقد حصلنا على هذه القيم من خلال البحث في الإحصائيات حول الأمراض.

بعد ذلك ، نحتاج إلى سؤال المستخدم عما إذا كان يريد اختبار حجم سكاني كبير أو صغير للمرض الذي يختاره.

disp ("اختيار حجم السكان.")

fprintf ('20 / n200 / n ') السرعة = الإدخال (' السكان المختارون: '،' s ') ؛ إذا كانت تساوي (السرعة ، '20') حجم السكان = 20 ؛ elseif isequal (speed، '200') Population_size = 200؛ نهاية

شرح الكود

هذا يطبع بيانًا للمستخدم ويطلب من المستخدم إدخال حجم السكان الذي يريد اختباره. هذا الإصدار لا يأخذ في الاعتبار المدخلات غير الصالحة. سيؤدي الإدخال غير الصحيح إلى حدوث خطأ وإيقاف البرنامج تمامًا. تم اختيار رقم 20 لأنه حجم عينة صغير لا يزال يعطي فكرة جيدة عن كيفية انتشار العدوى بين مجموعة صغيرة من السكان. تم اختيار 200 شخص كخيار أكبر لأن 200 نقطة تم رسمها على الرسم البياني بالكاد تحتوي على أي تداخل في النقاط بحيث يمكن رؤية كل شيء بسهولة وتمييزه عن بعضه البعض.

بعد ذلك ، علينا إيجاد سرعة المحاكاة.

disp ("اختر سرعة المحاكاة.")

fprintf ('سريع / n بطيء / n') السرعة = الإدخال ('السرعة المختارة:'، 's') ؛ if isequal (speed، 'Fast') sim_speed = 0 ؛ elseif isequal (speed، 'Slow') sim_speed = 0.25 ؛ نهاية

شرح الكود

كانت هذه العملية مماثلة للحصول على نوع المرض وحجم السكان. للصيام ، لن يكون هناك وقفة. وللبطء ، سيكون هناك تأخر 0.25 ثانية في حلقة for عند تشغيل المحاكاة.

رائعة! الآن لدينا كل المدخلات التي نحتاجها من المستخدم! دعنا ننتقل إلى جمع البيانات لنسب مختلفة من الأشخاص غير المطعمين.

الخطوة 13: اختر نسبة مئوية من الأشخاص غير الملقحين واحسب متوسط عدد غير الملقحين والمصابين بالنسبة المئوية المختارة

هذا الرمز مخصص لـ 0٪ من الأشخاص غير المطعمين.

٪ -------٪ 0 غير مُلقح ------------

per_infect_av_0 = ، بالنسبة المئوية_of_unvacc_and_infec_av_0 = ، بالنسبة لـ i = 1:20 = عدوى سيم (unvacc ، لقاح ، حجم السكان ، 0 ، 1 ، sim_speed) ؛ per_infect_av_0 = [per_infect_av_0، out (1، 1)] ؛ النسبة المئوية_of_unvacc_and_infec_av_0 = [نسبة مئوية_من_ف_حساب_و_إنفك_اف_0 ، خارج (1 ، 2)] ؛ end average_infected_0 = متوسط (per_infect_av_0) ؛ average_unvacc_and_infected_0 = متوسط (نسبة مئوية_من_ف_حساب_و_إنفك_اف_0) ؛

شرح الكود:

يتم تشغيل حلقة for 20 مرة. يتم تخزين الإخراج من الوظيفة ، عدوى سيم () ، في الخارج. في كل مرة يتم تشغيل حلقة for ، تتم إضافة النسبة المئوية للمصابين في إجمالي عدد السكان إلى المصفوفة ، "per_infect_av_0". بالإضافة إلى ذلك ، يتم أيضًا إضافة النسبة المئوية للمُلقحين والمصابين في كل مرة إلى مصفوفة "النسبة المئوية للتلقيح". في السطرين الأخيرين ، يتم حساب متوسط هاتين المصفوفتين المذكورتين أعلاه وتخزينهما في متغيرات. للتلخيص ، يتم تخزين النسب المئوية لكل محاكاة ومتوسطها ورسمها البياني. تُستخدم مونت كارلو لإظهار متوسط قيمة تشغيل محاكاة وإظهار النتيجة. لأغراضنا التجريبية ، نختار تشغيل المحاكاة 20 مرة ومتوسط تلك القيم.

تحد:

كرر لجميع النسب المئوية التي تريد اختبارها! يمكن القيام بذلك عن طريق تغيير أسماء المتغيرات وفقًا لأرقام النسبة المئوية. اختبرنا 0٪ و 5٪ و 10٪ و 20٪ و 30٪ و 50٪.

ملحوظة:

السطر الوحيد الذي يجب تغييره في الكود الفعلي هو

خارج = عدوى سيم (unvacc ، لقاح ، عدد السكان ، 0 ، 1 ، sim_speed) ؛

قم بتغيير الصفر إلى النسبة المئوية بالصيغة العشرية. على سبيل المثال ، بالنسبة لمحاكاة 5٪ غير محصنة ، يجب استبدال 0 بـ 0.5.

الخطوة 14: الرسم البياني: "اتجاه العدوى في غير الملقحين مقابل. تم التطعيم لمرض معين

هذا هو الكود لعمل رسم بياني لاتجاه العدوى في الأشخاص غير المطعمين مقابل الأشخاص غير الملقحين.

Graph_mat_y = [average_infected_0 ، و average_infected_5 ، و average_infected_10 ، و average_infected_20 ، و average_infected_30 ، و average_infected_50] ؛

Graph_mat_x = [0، 5، 10، 20، 30، 50] ؛ المنحدر = (average_infected_5-average_infected_0) / 5 ؛ line_y = [average_infected_0، (المنحدر * 50) + average_infected_0] ؛ line_x = [0، 50] ؛ الشكل (2) قطعة أرض (graph_mat_x، graph_mat_y) ؛ line (line_x، line_y، 'Color'، 'red'، 'LineStyle'، '-') ؛ العنوان (["الاتجاه في عدم التطعيم" ، المرض]) ؛ 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: المنتج النهائي: كيف تبدو المحاكاة

يمكن العثور على كل الشفرة هنا

موصى به: