Πίνακας περιεχομένων:

Να εμβολιαστώ ή όχι; ένα έργο για την παρατήρηση ασυλίας αγέλης μέσω προσομοίωσης ασθενειών: 15 βήματα
Να εμβολιαστώ ή όχι; ένα έργο για την παρατήρηση ασυλίας αγέλης μέσω προσομοίωσης ασθενειών: 15 βήματα

Βίντεο: Να εμβολιαστώ ή όχι; ένα έργο για την παρατήρηση ασυλίας αγέλης μέσω προσομοίωσης ασθενειών: 15 βήματα

Βίντεο: Να εμβολιαστώ ή όχι; ένα έργο για την παρατήρηση ασυλίας αγέλης μέσω προσομοίωσης ασθενειών: 15 βήματα
Βίντεο: ΄Εξι κουτιά σπίρτα-Αγκάθα Κρίστι 2024, Ιούλιος
Anonim
Να εμβολιαστεί ή όχι; ένα έργο για την παρατήρηση ασυλίας αγέλης μέσω προσομοίωσης ασθενειών
Να εμβολιαστεί ή όχι; ένα έργο για την παρατήρηση ασυλίας αγέλης μέσω προσομοίωσης ασθενειών

Επισκόπηση του έργου:

Το έργο μας διερευνά την ασυλία των κοπαδιών και ελπίζει να ενθαρρύνει τους ανθρώπους να κάνουν εμβόλια για να μειώσουν τα ποσοστά μόλυνσης στις κοινότητές μας. Το πρόγραμμά μας προσομοιώνει πώς μια ασθένεια προσβάλλει έναν πληθυσμό με διαφορετικά ποσοστά εμβολιασμένων και μη εμβολιασμένων ποσοστών. Δείχνει ασυλία αγέλης δείχνοντας πώς ένας αυξημένος αριθμός εμβολιασμένου πληθυσμού μπορεί να μειώσει τον αριθμό των προσβεβλημένων ατόμων.

Το μοντελοποιούμε αυτό στο Matlab χρησιμοποιώντας έννοιες της θεωρίας γραφημάτων. Η θεωρία γραφημάτων είναι ένας μαθηματικός τρόπος για να αναπαραστήσουμε τις σχέσεις μεταξύ αντικειμένων. Στη θεωρία γραφημάτων, τα γραφήματα έχουν κορυφές (ή κόμβους) που συνδέονται με ακμές (ή γραμμές). Για το έργο μας, οι κόμβοι είναι τα ενδιαφερόμενα άτομα και οι άκρες είναι οι συνδέσεις τους. Για παράδειγμα, εάν δύο κόμβοι συνδέονται με ένα άκρο τότε σημαίνει ότι είναι "φίλοι" ή έχουν κάποια μορφή επαφής μεταξύ τους. Αυτή η επαφή είναι ένας τρόπος εξάπλωσης της νόσου. Αυτός είναι ο λόγος για τον οποίο χρησιμοποιήσαμε τη θεωρία γραφημάτων για να μοντελοποιήσουμε την ιδέα μας επειδή θέλαμε να δούμε πώς εξαπλώνεται η ασθένεια μεταξύ ατόμων που συνδέονται σε έναν πληθυσμό.

Το έργο μας περιλαμβάνει επίσης τη μέθοδο του Μόντε Κάρλο. Η μέθοδος Monte Carlo είναι αλγόριθμοι που δημιουργούν επαναλαμβανόμενη τυχαία δειγματοληψία για τη λήψη αριθμητικών αποτελεσμάτων. Στο έργο μας, χρησιμοποιούμε αυτήν τη μέθοδο για να εκτελέσουμε την προσομοίωσή μας αρκετές φορές αλλάζοντας το ποσοστό του αρχικού μη εμβολιασμένου για να δούμε τον ρυθμό με τον οποίο μολύνονται οι άνθρωποι.

Όλος ο κώδικας έργου είναι συνδεδεμένος στο κάτω μέρος!

Πίστωση υπολογιστή:

Σύνδεσμος Matlab στη Θεωρία Γραφήματος:

Βήμα 1: Δημιουργήστε πίνακα παρακειμένου

Δημιουργία μήτρας γειτνίασης
Δημιουργία μήτρας γειτνίασης
Δημιουργία μήτρας γειτνίασης
Δημιουργία μήτρας γειτνίασης

Δημιουργήστε ένα νέο σενάριο. Θα ονομάσουμε τη δική μας «μόλυνσηSim.m».

Θα δημιουργήσουμε μια μεταβλητή "NUMOFPEOPLE". Μπορείτε να το αντιστοιχίσετε σε οποιαδήποτε ακέραιη τιμή. Αυτό θα αντιπροσωπεύει τον αριθμό των ατόμων στον πληθυσμό σας.

Από εδώ και πέρα, θα το υποθέσουμε

NUMOFPEOPLE = 20;

Πρώτα ξεκινήστε χρησιμοποιώντας συναρτήσεις θεωρίας γραφήματος του Matlab για μη κατευθυνόμενο γράφημα.

Εάν ενδιαφέρεστε να μάθετε περισσότερα, εδώ είναι ένας σύνδεσμος για να διαβάσετε περισσότερα σε βάθος.

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

Δημιουργήθηκε ένας πίνακας γειτνίασης.

adjMatrix = μηδενικά (NUMOFPEOPLE);

Αυτό θα δημιουργήσει έναν τετραγωνικό πίνακα 0s. Κάθε σειρά στη μήτρα είναι ένα άτομο. Κάθε στήλη στη μήτρα είναι ένα άτομο ή φίλος που συναντά το άτομο κατά τη διάρκεια της ημέρας.

Δείτε το Σχήμα 100 (παραπάνω) για να απεικονίσετε πώς μοιάζει το adjMatrix για 20 άτομα.

** Από αυτό το σημείο και μετά θα υποθέσουμε ότι NUMOFPEOPLE είναι ίσο με 20. **

Μπορείτε να δοκιμάσετε να σχεδιάσετε αυτόν τον πίνακα γειτονίας. Ακολουθούν λίγες περισσότερες πληροφορίες σχετικά με τη σχεδίαση τέτοιων τύπων πινάκων.

Σημείωση: Πώς λειτουργεί ο πίνακας γειτνίασης.

Πρώην:

%κάνοντας τον παρακείμενο πίνακα

a = [0, 1, 0, 0, 0; 1, 0, 1, 1, 1; 0, 1, 0, 0, 0; 0, 1, 0, 0, 0; 0, 1, 0, 0, 0] %γραφήματος g = γράφημα (α); %χρησιμοποιώντας τη συνάρτηση γραφήματος (θεωρία γραφήματος) σχήμα (1). h = διάγραμμα (g);

Δείτε το Σχήμα 1 (παραπάνω) για να δείτε πώς μπορείτε να προσθέσετε ακμές στη μήτρα γειτονίας, χρησιμοποιώντας τον κώδικα στη "Σημείωση".

Βήμα 2: Δημιουργήστε σχέσεις

Δημιουργήστε Σχέσεις
Δημιουργήστε Σχέσεις

Τώρα που δημιουργούνται τα άτομα (κορυφές ή κόμβοι), πρέπει να δημιουργήσουμε ένα δίκτυο σχέσεων (γραμμές ή ακμές του γραφήματος). Αυτό θα προσομοιώσει τον τρόπο με τον οποίο οι άνθρωποι αλληλεπιδρούν και συναντούν άλλους ανθρώπους όλη την ημέρα.

Αυτό μπορεί να γίνει με πολλούς τρόπους. Ένας τρόπος για να ολοκληρώσετε αυτήν την εργασία είναι να εκχωρήσετε πρώτα έναν τυχαίο αριθμό σε κάθε άτομο για να καθορίσετε με πόσα άτομα θα αλληλεπιδρά κάθε άτομο σε μια μέρα.

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

Αυτό δημιουργεί έναν πίνακα 1 επί 20 τυχαίων ακεραίων που αντιπροσωπεύει τον αριθμό των αλληλεπιδράσεων που έχει κάθε άτομο την ημέρα. Οι στήλες αυτής της μήτρας θα είναι ο αριθμός που αντιστοιχεί σε κάθε άτομο. Για παράδειγμα, αν εκχωρήσουμε το λιγότεροFriendsPersonCanHave = 2 και το mostFriendsPersonCanHave = 5, θα λάβουμε τυχαίες τιμές μεταξύ 2 και 5.

Αντιμετωπίζετε προβλήματα με το randi (); Στο τερματικό, πληκτρολογήστε

βοήθεια ραντί

Στη συνέχεια, κάνουμε μια τυχαιοποιημένη μήτρα (που ονομάζεται "allFriendsmatrix") για το πώς συνδέεται/αλληλεπιδρά κάθε άτομο στον πληθυσμό μέσα στον πληθυσμό.

tempMatrix = ;

μετρά = 0; allFriendsMatrix = ; για k = 1: NUMOFPEOPLE ενώ μήκος (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (count) = temp; τερματίστε το καθένα ενώ το μήκος (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; τερματισμός allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; μετρά = 0; τέλος

Σε βάθος επεξήγηση του κώδικα:

Αρχικά δημιουργούμε έναν κενό προσωρινό πίνακα για να κρατάμε τη λίστα φίλων/αλληλεπιδράσεων κάθε ατόμου. Αρχικοποιούμε επίσης την καταμέτρηση, η οποία απλώς παρακολουθεί πού να κολλήσετε τη νέα τυχαία σύνδεση στο tempMatrix. Οι βρόχοι for εκτελούνται 20 φορές έτσι ώστε αυτό να συμβαίνει για κάθε άτομο στον πληθυσμό. Ο πρώτος βρόχος while τρέχει μέχρι το tempMatrix κάθε ατόμου να έχει το ίδιο μήκος με τον τυχαία εκχωρημένο αριθμό αλληλεπιδράσεων. Σε αυτόν τον βρόχο, δημιουργείται ένας τυχαίος αριθμός που αντιστοιχεί σε άτομο σε πληθυσμό και τοποθετείται στο tempMatrix. Επειδή τα μήκη καθενός από τα tempMatrixes είναι διαφορετικά, χρειάστηκε να δημιουργήσουμε μερικές τιμές NaN, ώστε να μπορούμε να συνδέσουμε όλες αυτές τις tempMaticies σε ένα πίνακα («allFriendsMatrix»). Ο δεύτερος βρόχος while λύνει αυτό το πρόβλημα προσθέτοντας NaN σε κάθε tempMatrix. Ο βρόχος 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 NaN 8 8 2 7 11 NaN NaN NaN NaN NaN 10 13 NaN NaN NaN NaN NaN NaN NaN NaN 11 17 2 NaN NaN NaN NaN NaN NaN 10 12 NaN NaN NaN NaN NaN NaN NaN NaN 4 13 2 12 NaN NaN NaN NaN NaN NaN 17 10 9 3 1 NaN NaN NaN NaN NaN 16 16 6 NaN NaN NaN NaN NaN NaN 3 8 17 17 14 NaN NaN NaN NaN NaN 20 19 3 NaN NaN NaN NaN NaN NaN NaN 13 10 NaN NaN NaN NaN NaN NaN NaN NaN 2N 18 10 16 NaN NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN NaN NaN 8 16 14 8 NaN NaN NaN NaN NaN NaN 7 7 NaN NaN NaN NaN NaN NaN NaN NaN 19 10 9 NaN 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 NaN 1 7 NaN NaN NaN NaN NaN NaN NaN NaN 16 7 13 10 1 NaN NaN NaN NaN

Στη συνέχεια, προσθέστε αυτές τις σχέσεις στο adjMatrix.

για κάθε Σειρά = 1: NUMOFPEOPLE

για κάθεCol = 1: 9 αν isnan (allFriendsMatrix (everyRow, eachCol)) == 0 adjMatrix (everyRow, 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.

Παραγωγή

Αυτό είναι το τελικό 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

Δείτε το Σχήμα 2 για να δείτε το γράφημα του "adjMatrix".

Βήμα 3: Προσθέστε στατιστικά στοιχεία ασθενειών

Τώρα που το πρόγραμμά σας μπορεί να δημιουργήσει ένα γράφημα με ένα σύνολο τυχαίων ατόμων και να δημιουργήσει τυχαίες σχέσεις, πρέπει να εισαγάγουμε τις πληροφορίες ή τα στατιστικά στοιχεία της νόσου για να δούμε πώς αυτές οι αλληλεπιδράσεις σε έναν πληθυσμό μπορούν να αυξήσουν ή να μειώσουν τη μόλυνση.

Δημιουργήστε αυτές τις μεταβλητές:

unvacc %τύπος: διπλό; ποσοστό πιθανότητας μη εμβολιασμένων ατόμων να μην πάθουν την ασθένεια

εμβόλιο %τύπος: διπλό ποσοστιαία πιθανότητα να μην πάθουν εμβολιασμένα άτομα την ασθένεια unvacc_perc %type: double? τοις εκατό πληθυσμός μη εμβολιασμένος init_infect %τύπος: int; τοις εκατό πληθυσμός εμβολιασμένος

Στη συνέχεια πρέπει να κάνουμε κάποιους υπολογισμούς.

Θα φτιάξουμε μια «μόλυνση» που είναι μήτρα 3*NUMOFPEOPLE.

vac_perc = 1-unvacc_perc;

μόλυνσηMat = nan (3, NUMOFPEOPLE); αριθμός = στρογγυλός (vacc_perc * NUMOFPEOPLE); μόλυνσηMat (1, 1: αριθμός) = εμβόλιο. μόλυνσηMat (1, αριθμός+1: τέλος) = unvacc; μόλυνσηMat (2, 1: τέλος) = 0; infeMat (2, 1: init_infect) = 1;

Επεξήγηση κώδικα

γραμμή 1: Υπολογίζεται το ποσοστό του πληθυσμού χωρίς εμβολιασμό

γραμμή 2: δημιουργήστε έναν πίνακα 3*Ν αριθμού ατόμων

γραμμή 3: μάθετε τον αριθμό των εμβολιασμένων ατόμων από το ποσοστό εμβολιασμένων

γραμμή 4: για τα εμβολιασμένα άτομα, δώστε τους μια ασυλία που σχετίζεται με τη λήψη του εμβολίου. Αυτή η τιμή ορίζεται με βάση την έρευνα σχετικά με τη νόσο.

γραμμή 5: για τον υπόλοιπο πληθυσμό (μη εμβολιασμένα άτομα), δώστε τους το ποσοστό της ασυλίας. Αυτή η τιμή ορίζεται με βάση την έρευνα σχετικά με τη νόσο.

γραμμή 6: ρυθμίστε αρχικά όλα τα άτομα να μην έχουν μολυνθεί.

γραμμή 7: για τον αριθμό των ατόμων που μολύνθηκαν αρχικά, συμπληρώστε αναλόγως τις πρώτες ζώνες ζεύγους.

Τώρα που έχουμε ορίσει όλες τις παραμέτρους για την προσομοίωση της νόσου, πρόκειται να τυχαιοποιήσουμε την πιθανότητα να μολυνθεί το άτομο (τόσο εμβολιασμένο όσο και μη εμβολιασμένο). Αυτό γίνεται στο επόμενο βήμα, εκχωρώντας τυχαίες τιμές μεταξύ 0 και 1 σε κάθε άτομο στην τρίτη σειρά αυτού του "infeMat".

Βήμα 4: Τυχαιοποιήστε την πιθανότητα ένα εμβολιασμένο και μη εμβολιασμένο άτομο να μολυνθεί

Στη συνέχεια, εκχωρήστε σε κάθε άτομο έναν τυχαίο αριθμό, ο οποίος θα χρησιμοποιηθεί αργότερα για να καθοριστεί εάν το άτομο μολυνθεί ή όχι.

για w = 1: μήκος (μόλυνσηMat)

μόλυνσηMat (3, w) = rand; τέλος

Επεξήγηση κώδικα

Αυτό αφορά τον βρόχο για την τρίτη σειρά του "infecMat" που δημιουργήθηκε στο τελευταίο βήμα. Το 'rand' εκχωρεί μια τιμή μεταξύ 0 και 1 σε κάθε δείκτη της σειράς 3.

Παραγωγή

μόλυνση είναι τώρα ολοκληρωμένο! Αυτό συνέβη με πληθυσμό με 100% εμβολιασμό και 1 άτομο που μολύνθηκε αρχικά.

μόλυνσηMat =

Στήλες 1 έως 12 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: Μολυσμένη ή μη μολυσμένη (τιμή boolean)

σειρά 3: Αριθμός που χρησιμοποιείται για να ελέγξει εάν το άτομο που δεν έχει μολυνθεί μολυνθεί εάν συναντήσει ένα μολυσμένο άτομο. Εάν το μη μολυσμένο άτομο συναντήσει μολυσμένο άτομο, αυτός ο αριθμός είναι μεγαλύτερος από τον αριθμό στη σειρά 1 (για την ίδια στήλη), τότε είναι μολυσμένος. Θα κωδικοποιήσουμε αυτήν τη λειτουργικότητα στο βήμα 7.

Βήμα 5: Δημιουργήστε μήτρες ατόμων που δεν είναι εμβολιασμένοι και έχουν μολυνθεί από τις αρχικές πληροφορίες

Δημιουργήστε 2 μήτρες που ονομάζονται "matrixUnvacc" και "matrixInfected" που αποθηκεύει όλα τα μολυσμένα άτομα από τη μόλυνση. Αυτό θα χρησιμοποιηθεί έτσι ώστε να μπορέσουμε να κωδικοποιήσουμε χρωματικά το γράφημα όσων έχουν μολυνθεί, μη εμβολιαστεί ή εμβολιαστεί, βοηθώντας στην απεικόνιση του αντίκτυπου των μη εμβολιασμένων έναντι των εμβολιασμένων ατόμων.

καθαρίστε το καθένα

matrixInfected = ; matrixUnvacc = ; για h = 1: μήκος (μόλυνσηMat) εάν μόλυνσηMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; τελικό τέλος για άτομο = 1: NUMOFPEOPLE εάν μόλυνσηMat (2, άτομο) == 1 matrixInfected = [matrixInfected, person]; τέλος τέλος

Επεξήγηση κώδικα

Δημιουργήστε δύο άδειες μήτρες για να αποθηκεύσετε τους αριθμούς των ατόμων που δεν έχουν εμβολιαστεί και μολυνθεί, αντίστοιχα. Και οι δύο για βρόχους εκτελούνται 20 φορές και εάν ικανοποιηθεί η εντολή if, τότε ο αριθμός προστίθεται στη σωστή μήτρα.

Παραγωγή

matrixUnvacc =

matrixInfected =

[1]

Βήμα 6: Γράφημα αρχικού γραφήματος

Αρχικό γράφημα γραφήματος
Αρχικό γράφημα γραφήματος

Στη συνέχεια θα σχεδιάσουμε τον πίνακα γειτνίασης.

g = γράφημα (adjMatrix);

σχήμα (1) p = διάγραμμα (g, 'NodeColor', 'b', 'MarkerSize', 7); highlight (p, matrixUnvacc, 'NodeColor', 'g') highlight (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; τίτλος (['Ποσοστό ατόμων που δεν έχουν εμβολιαστεί:', num2str (title_unvacc), '%']); παύση (ταχύτητα)

Επεξήγηση κώδικα

Η θεωρία γραφημάτων στο Matlab έχει ενσωματωμένες συναρτήσεις. Όταν χρησιμοποιούμε τη συνάρτηση graph (), είμαστε σε θέση να μεταφράσουμε το 'adjMatrix' σε ένα πραγματικό μη κατευθυνόμενο γράφημα. Στη συνέχεια, πρέπει να δημιουργήσουμε ένα οικόπεδο χρησιμοποιώντας τη συνάρτηση plot () για να δούμε πραγματικά πώς μοιάζει. Ορίσαμε αυτό το διάγραμμα () σε μια μεταβλητή, ώστε να μπορούμε να χειριζόμαστε και να αλλάζουμε τα χρώματα του γραφήματος πιο εύκολα καθ 'όλη τη διάρκεια της προσομοίωσης. Όλα τα άτομα (ή οι κόμβοι) έχουν αρχικά οριστεί στο χρώμα «μπλε». Στη συνέχεια, όλοι οι μη εμβολιασμένοι άνθρωποι έχουν οριστεί στο χρώμα «πράσινο». Στη συνέχεια, τα μολυσμένα άτομα ρυθμίζονται στο χρώμα «κόκκινο». Ο τίτλος ορίζεται σύμφωνα με τη συγκεκριμένη ποσοστιαία τιμή των μη εμβολιασμένων ατόμων που δοκιμάζονται. Η λειτουργία παύσης () σταματά προσωρινά την εκτέλεση MatLab. Περνάμε από τη μεταβλητή ταχύτητα που κατανέμεται και υπολογίζεται σε δευτερόλεπτα.

Δείτε την εικόνα (πάνω) για να δείτε ένα τυχαίο χρωματικά κωδικοποιημένο γράφημα.

Μάθετε περισσότερα σχετικά με τη λειτουργία highlight () στο MatLab.

Βήμα 7: Προσομοίωση της εξέλιξης της μόλυνσης

Στη συνέχεια πρέπει να καταλάβουμε ποιος μολύνεται μετά τις αλληλεπιδράσεις (που καταγράφονται στο adjMatrix) και να ενημερώσουμε το γράφημα όταν κάποιος μολυνθεί.

Χρησιμοποιήστε το adjMatrix για να προσδιορίσετε ποια άτομα έχουν μολυνθεί μετά τις αλληλεπιδράσεις τους με άτομα σε μια ημέρα.

για κάθεRow = 1: length (adjMatrix)

εάν μόλυνσηMat (2, κάθεRow) == 1 για κάθεCol = 1: μήκος (adjMatrix) εάν adjMatrix (everyRow, eachCol) == 1 % eachRow = το άτομο % eachCol = ο φίλος του % φίλος κάθε ατόμου και δείτε αν έχουν μολυνθεί Το εάν μόλυνσηMat (3, κάθεCol)> μόλυνσηMat (1, κάθεCol) μόλυνσηMat (2, κάθεCol) = 1; επισήμανση (p, eachCol, 'NodeColor', 'r') pause (speed) end end end end end

Οι βρόχοι for βρόχου περνούν από κάθε άτομο. Ελέγχει ότι εάν το άτομο έχει μολυνθεί, θα ελέγξει καθένα από τα άτομα/φίλους με τους οποίους αλληλεπίδρασε και θα ελέγξει εάν το επίπεδο ασυλίας του φίλου ήταν μεγαλύτερο από τη δύναμη της νόσου. Εδώ μπαίνει στο παιχνίδι η «μόλυνση» που δημιουργήσαμε νωρίτερα. Η 1η και 3η σειρά κάθε στήλης του φίλου συγκρίνονται και αν η 3η σειρά είναι μεγαλύτερη, σημαίνει ότι ο φίλος δεν είχε αρκετά υψηλή ανοσία για να ξεφύγει από την ασθένεια και τελικά μολυνθεί. Αλλάζουμε επίσης σε χρώμα χρησιμοποιώντας highlight () σε κόκκινο εάν μολυνθούν.

Τώρα ο κωδικός σας για την προσομοίωση πρέπει να λειτουργήσει! και για οποιοδήποτε μέγεθος πληθυσμού, απλώς αλλάξτε NUMOFPEOPLE!

Βήμα 8: Χρησιμοποιήστε τη θεωρία του Μόντε Κάρλο

Για να προχωρήσουμε αυτό ένα βήμα παραπέρα και να εξαγάγουμε δεδομένα από τον προσομοιωτή μας («infeSim.m»), θέλαμε να υπολογίσουμε και να γράψουμε την τάση σε ποσοστό των μη εμβολιασμένων ατόμων που μολύνθηκαν και του ποσοστού των εμβολιασμένων που μολύνθηκαν. Υποθέτουμε ότι το ποσοστό των εμβολιασμένων ατόμων που μολύνθηκαν πρέπει να είναι πολύ χαμηλότερο από το ποσοστό των μη εμβολιασμένων ατόμων που μολύνθηκαν.

Βήμα 9: Κάντε το αρχείο ('infeSim.m') Με την προσομοίωση σε μια λειτουργία

Για να τρέξουμε το Μόντε Κάρλο, θα θέλαμε να εκτελέσουμε την προσομοίωση πολλές φορές και να συγκεντρώσουμε δεδομένα, ώστε να μπορούμε να το χρησιμοποιήσουμε για να γράψουμε τα ποσοστά των ατόμων που έχουν μολυνθεί.

Η συνάρτηση θα μπορούσε να ρυθμιστεί ως εξής:

λειτουργία εξόδου = μόλυνση Sim (unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, ταχύτητα)

Σχολιάστε τις μεταβλητές στην προσομοίωσή σας αφού τώρα τις περνάτε μέσα από το κύριο αρχείο (θα αρχίσουμε να το γράφουμε στο βήμα 12):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

Η νέα μεταβλητή

Ταχύτητα

θα αντιστοιχιστεί στο κύριο αρχείο (Monte_Carlo.m).

Σημείωση: Μην ξεχνάτε το τέλος στο κάτω μέρος του αρχείου λειτουργίας για να τερματίσετε τη λειτουργία!

Βήμα 10: Υπολογίστε το ποσοστό των μη εμβολιασμένων και εμβολιασμένων ατόμων που έχουν μολυνθεί

Αυτό υπολογίζει το ποσοστό των μη εμβολιασμένων ατόμων που μολύνθηκαν. Αυτός ο κωδικός πηγαίνει στο κάτω μέρος του αρχείου "infeSim.m".

number_of_unvacc = 0;

number_of_infec_unvacc = 0; %υπολογίζει το ποσοστό των μη εμβολιασμένων ατόμων που μολύνθηκαν για x = 1: μήκος (μόλυνσηMat) εάν μόλυνσηMat (1, x) == unvacc number_of_unvacc = number_of_unvacc+1; τερματισμός εάν το infeMat (1, x) == unvacc & τέλος τέλος %_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc)*100;

Επεξήγηση κώδικα

Στον βρόχο for, θα κάνει βρόχο πάνω από NUMOFPEOPLE φορές. Κάθε φορά που ο αριθμός στη μόλυνση αντιστοιχεί στον αριθμό μη εμβολιασμού (δηλαδή 0,95 == 0,95), τότε ο αριθμός των μη εμβολιασμένων ατόμων θα αυξάνεται κατά 1. Κάθε φορά που ο αριθμός στη μόλυνση αντιστοιχεί στον αριθμό μη εμβολιασμού και είναι μολυσμένοι, ο αριθμός των μολυσμένων και μη εμβολιασμένων αυξάνεται κατά 1. Η τελευταία γραμμή διαιρεί τον αριθμό των μολυσμένων, μη εμβολιασμένων ατόμων με τον συνολικό αριθμό των μη εμβολιασμένων. Στη συνέχεια, το ποσοστό υπολογίζεται από αυτό.

Πρόκληση:

Προσπαθήστε να υπολογίσετε το ποσοστό των εμβολιασμένων ατόμων που έχουν μολυνθεί! (Υπόδειξη: είναι πολύ παρόμοιο με αυτόν τον παραπάνω κώδικα, ωστόσο μερικές από τις μεταβλητές αλλάζουν και τα ονόματα προσαρμόζονται.)

Στη συνέχεια υπολογίζεται το ποσοστό των ατόμων που έχουν μολυνθεί με βάση τον συνολικό πληθυσμό:

pre_per_infect = cumsum (μόλυνσηMat (2,:));

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

Επεξήγηση κώδικα

Το αθροιστικό άθροισμα υπολογίζεται χρησιμοποιώντας τη δεύτερη σειρά του infeMat, η οποία αποθηκεύει 1s και 0s ανάλογα με το αν το άτομο είναι μολυσμένο ή όχι. Δεδομένου ότι η συνάρτηση cumsum () επιστρέφει έναν πίνακα, παίρνουμε την τελευταία τιμή στον πίνακα ('pre_per_infect (1, NUMOFPEOPLE)'), η οποία θα πρέπει να είναι το πραγματικό άθροισμα όλων των τιμών από το 'infecMat (2,:)'. Διαιρώντας το άθροισμα με το NUMOFPEOPLE και πολλαπλασιάζοντάς το με 100, παίρνουμε το τελικό ποσοστό μολυσμένων στον συνολικό πληθυσμό.

Βήμα 11: Δημιουργήστε μια μεταβλητή εξόδου στη λειτουργία σας "infeSim.m.m"

έξοδος = [ανά_μόλυνση, ποσοστό_νβακκ_και_αποστολής, ποσοστό_εξαγωγικού_και_εμβολίου];

Επεξήγηση κώδικα

Αποθηκεύστε αυτές τις πληροφορίες στην έξοδο, οι οποίες θα σταλούν ξανά στην κύρια (Monte_Carlo.m) όταν η λειτουργία κληθεί και ολοκληρωθεί. Αυτά τα δεδομένα χρησιμοποιούνται για τη γραφική παράσταση των ποσοστών του ποσοστού των μολυσμένων όσων είναι εμβολιασμένοι και μη εμβολιασμένοι.

Η λειτουργία σας "infeSim.m" πρέπει να γίνει τώρα! Ωστόσο, δεν θα τρέξει επειδή πρέπει να γράψουμε το κύριο!

Βήμα 12: Δημιουργήστε ένα μενού για να λάβετε αρχικές συνθήκες προσομοίωσης από το χρήστη

Θυμηθείτε πώς είπαμε τη μεταβλητή

Ταχύτητα

θα δημιουργηθεί και θα περάσει από την κύρια λειτουργία; Πρέπει να λάβουμε τις τιμές για να περάσουμε στη συνάρτηση. Σημείωση, η σειρά των τιμών κατά την κλήση της συνάρτησης έχει σημασία!

Ξεκινήστε ζητώντας από τον χρήστη να πληκτρολογήσει κάποιες απαντήσεις στο τερματικό.

> Επιλέξτε μια ασθένεια. Σημειώστε ότι έχει διάκριση πεζών -κεφαλαίων >> Περτουσίς >> Γρίπη >> Ιλαρά >> Νόσος επιλεγμένη: Γρίπη >> Επιλέξτε μέγεθος πληθυσμού. >> 20 >> 200 >> Επιλεγμένος πληθυσμός: 20 >> Επιλέξτε ταχύτητα προσομοίωσης. >> Γρήγορη >> Αργή >> Επιλεγμένη ταχύτητα: Γρήγορη

Αυτός ο κώδικας παρακάτω ρωτά τον χρήστη ποια ασθένεια θέλει να εξετάσει.

disp ("Διαλέξτε μια ασθένεια. Σημειώστε ότι είναι ευαίσθητο σε κεφαλαία")

fprintf ('Pertussis / nFlu / n Ιλαρά / n') ασθένεια = είσοδος ('Disease Chosen:', 's'); εάν είναι ισοδύναμο (ασθένεια, «κοκκύτης») εμβόλιο = 0,85 · %15 τοις εκατό πιθανότητα ασθένειας χωρίς vacc = 0,20; %80 τοις εκατό πιθανότητα εμφάνισης ασθένειας σε άλλη περίπτωση είναι ισοδύναμο (ασθένεια, «Γρίπη») εμβόλιο =.75; %25 τοις εκατό πιθανότητα ασθένειας χωρίς vacc = 0,31; %69 τοις εκατό πιθανότητα να πάθουν ασθένεια σε άλλες περιπτώσεις ανισό (ασθένεια, «ιλαρά») εμβόλιο =.97; %3 τοις εκατό πιθανότητα ασθένειας χωρίς vacc = 0,10; 90 %πιθανότητα να τερματιστεί η ασθένεια

Επεξήγηση κώδικα:

Η λειτουργία disp () εκτυπώνει τη δήλωση στην οθόνη και εκτυπώνει επίσης τις διάφορες επιλογές. Η ασθένεια θα εκχωρηθεί ανάλογα. Αυτή η έκδοση δεν περιλαμβάνει αυτήν τη στιγμή μη έγκυρη εισαγωγή. Η μη έγκυρη εισαγωγή θα δημιουργήσει σφάλμα και θα σταματήσει εντελώς το πρόγραμμα. Κάθε ασθένεια έχει τιμές εμβολίου και μη εμβολιασμού που σχετίζονται με αυτήν. Αυτές οι τιμές ΔΕΝ είναι τυχαίες. Πήραμε αυτές τις τιμές από την έρευνα στατιστικών για τις ασθένειες.

Στη συνέχεια, πρέπει να ρωτήσουμε τον χρήστη εάν θέλει να δοκιμάσει ένα μεγάλο ή μικρό μέγεθος πληθυσμού για την επιλεγμένη ασθένεια.

disp ("Επιλέξτε μέγεθος πληθυσμού.")

fprintf ('20 / n200 / n ') ταχύτητα = είσοδος (' Επιλεγμένος πληθυσμός: ',' s '); αν είναι ίσο (ταχύτητα, '20') πληθυσμιακό μέγεθος = 20? elseif isequal (ταχύτητα, '200') πληθυσμιακό μέγεθος = 200; τέλος

Επεξήγηση κώδικα

Αυτό εκτυπώνει μια δήλωση στον χρήστη και ζητά από τον χρήστη να εισαγάγει το μέγεθος του πληθυσμού που θέλει να δοκιμάσει. Αυτή η έκδοση δεν περιλαμβάνει αυτήν τη στιγμή μη έγκυρη εισαγωγή. Η μη έγκυρη εισαγωγή θα δημιουργήσει σφάλμα και θα σταματήσει εντελώς το πρόγραμμα. Το 20 επιλέχθηκε επειδή είναι ένα μικρό μέγεθος δείγματος που εξακολουθεί να δίνει μια καλή ιδέα για το πώς η μόλυνση εξαπλώνεται σε έναν μικρό πληθυσμό. 200 άτομα επιλέχθηκαν ως η μεγαλύτερη επιλογή επειδή 200 σημεία που σχεδιάστηκαν στο γράφημα είχαν σχεδόν καμία επικάλυψη πόντων, έτσι ώστε όλα να φαίνονται εύκολα και να διακρίνονται μεταξύ τους.

Στη συνέχεια, πρέπει να βρούμε την ταχύτητα της προσομοίωσης.

disp ("Επιλογή ταχύτητας προσομοίωσης.")

fprintf ('Γρήγορη / nΑργή / n') ταχύτητα = είσοδος ('Επιλεγμένη ταχύτητα:', 's'); αν είναι ισοδύναμη (ταχύτητα, 'Γρήγορη') sim_speed = 0; elseif isequal (speed, 'Slow') sim_speed = 0,25; τέλος

Επεξήγηση κώδικα

Αυτή η διαδικασία ήταν η ίδια με τη λήψη του τύπου της νόσου και του μεγέθους του πληθυσμού. Για γρήγορο, δεν θα υπάρξει παύση. και για αργό, θα υπάρχει μια καθυστέρηση 0,25 δευτερολέπτων στον βρόχο for κατά την εκτέλεση της προσομοίωσης.

Μεγάλος! Τώρα έχουμε όλες τις εισόδους από τον χρήστη που χρειαζόμαστε! Ας περάσουμε στη συλλογή δεδομένων για διαφορετικά ποσοστά μη εμβολιασμένων ατόμων.

Βήμα 13: Επιλέξτε % των μη εμβολιασμένων ατόμων και υπολογίστε τον μέσο όρο των μη εμβολιασμένων και μολυσμένων για επιλεγμένο ποσοστό

Αυτός ο κωδικός αφορά το 0% των μη εμβολιασμένων ατόμων.

% ------- % 0 Ανεμβολίαστο ------------

per_infect_av_0 = ; ποσοστό_από_unvacc_and_infec_av_0 = ; για i = 1:20 έξω = μόλυνσηSim (unvacc, εμβόλιο, μέγεθος πληθυσμού, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, out (1, 1)]; ποσοστό_ο_νβακκ_και_ϊνφεκ_αβ_0 = [ποσοστό_ο_νβακκ_και_ϊνφεκ_αβ_0, έξω (1, 2)]; τέλος μέσος_επιμονωμένος_0 = μέσος όρος (ανά_μόλυνση_αυτός_0). average_unvacc_and_infected_0 = μέσος όρος (ποσοστό_ο_νβακκ_και_infec_av_0)?

Επεξήγηση κώδικα:

Ο βρόχος for εκτελείται 20 φορές. Η έξοδος από τη συνάρτηση, infeksimSim (), αποθηκεύεται έξω. Κάθε φορά που εκτελείται ο βρόχος for, τότε το ποσοστό προσβεβλημένων στον συνολικό πληθυσμό προστίθεται στη μήτρα, 'per_infect_av_0'. Επιπλέον, το ποσοστό των μη εμβολιασμένων και μολυσμένων προστίθεται επίσης κάθε φορά στη μήτρα «ποσοστό_από_εμβολιασμού_και_infec_av_0». Στις δύο τελευταίες γραμμές, αυτοί οι δύο προαναφερθέντες πίνακες στη συνέχεια υπολογίζονται κατά μέσο όρο και αποθηκεύονται σε μεταβλητές. Συνοψίζοντας, τα ποσοστά αποθηκεύονται για κάθε προσομοίωση, υπολογίζονται κατά μέσο όρο και απεικονίζονται. Το Μόντε Κάρλο χρησιμοποιείται για να δείξει τη μέση τιμή της εκτέλεσης μιας προσομοίωσης και της εμφάνισης του αποτελέσματος. Για τους πειραματικούς μας σκοπούς, επιλέγουμε να εκτελέσουμε την προσομοίωση 20 φορές και να υπολογίσουμε αυτές τις τιμές κατά μέσο όρο.

Πρόκληση:

Επαναλάβετε για όλα τα ποσοστά που θέλετε να δοκιμάσετε! Αυτό μπορεί να γίνει αλλάζοντας τα ονόματα των μεταβλητών σύμφωνα με τους ποσοστιαίους αριθμούς. Δοκιμάσαμε το 0%, 5%, 10%, 20%, 30%και 50%.

Ιχνος:

Η μόνη γραμμή που πρέπει να αλλάξει στον πραγματικό κωδικό είναι

έξω = μόλυνσηSim (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 = [μέσος_μελημμένος_0, (κλίση*50)+μέσος_επιμονωμένος_0]; line_x = [0, 50]; σχήμα (2) γράφημα (graph_mat_x, graph_mat_y)? γραμμή (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); τίτλος (['Trend in Unvaccination for', νόσος])? xlabel («Ποσοστό αρχικού μη εμβολιασμένου») · ylabel ("Ποσοστό τελικού μολυσμένου")

Επεξήγηση κώδικα

γραμμή 1: εκχωρούνται τιμές y στους μέσους όρους του ποσοστού μολυσμένων

γραμμή 2: εκχωρούνται τιμές x στο ποσοστό του αρχικού ποσοστού μη εμβολιασμένου

γραμμή 3: υπολογίστε την κλίση 0% και 5%

γραμμή 4: αποθηκεύστε τις τιμές της γραμμής. Αυτό αποτελεί συνέχεια της ενότητας 0% έως 5%.

γραμμή 5: αποθηκεύστε τις τιμές της γραμμής. Αυτή η γραμμή εκτείνεται στο μήκος του γραφήματος.

γραμμή 6: δημιουργία σχήματος

γραμμή 7: σχεδιάστε τις τιμές γραφήματος x και y του ποσοστού μολυσμένων, που δεν είναι εμβολιασμένοι.

γραμμή 8: σχεδιάστε τη γραμμή. Αυτό χρησιμοποιείται για να δείξει ότι δεν αυξάνεται γραμμικά, αλλά εκθετικά.

γραμμή 9: Ορισμός τίτλου για το γράφημα.

γραμμή 10-11: Ορίστε ετικέτες x και y για γράφημα.

Τώρα θα πρέπει να μπορείτε να δείτε ότι όσο μεγαλύτερο ποσοστό του πληθυσμού είναι μη εμβολιασμένος, τόσο μεγαλύτερα είναι τα ποσοστά μόλυνσης. Θα δείτε επίσης ότι οι περισσότερες από τις κουκίδες που γίνονται κόκκινες είναι πράσινες κουκίδες, δείχνοντας ότι το εμβόλιο βοηθάει σε κάποιο βαθμό! Ελπίζω να σας άρεσε αυτό το σεμινάριο. Σχολιάστε αν έχετε απορίες!

Βήμα 15: Τελικό προϊόν: Πώς μοιάζει η προσομοίωση

Όλο τον κωδικό μπορείτε να τον βρείτε εδώ

Συνιστάται: