Оглавление:

Делать прививку или нет? Проект по наблюдению за иммунитетом стада посредством моделирования заболеваний: 15 шагов
Делать прививку или нет? Проект по наблюдению за иммунитетом стада посредством моделирования заболеваний: 15 шагов

Видео: Делать прививку или нет? Проект по наблюдению за иммунитетом стада посредством моделирования заболеваний: 15 шагов

Видео: Делать прививку или нет? Проект по наблюдению за иммунитетом стада посредством моделирования заболеваний: 15 шагов
Видео: Натан Мирвольд: Пирамиды, ложь НАСА, глобальное потепление 2024, Июль
Anonim
Делать прививку или нет? Проект по наблюдению за иммунитетом стада посредством моделирования болезней
Делать прививку или нет? Проект по наблюдению за иммунитетом стада посредством моделирования болезней

Обзор проекта:

Наш проект исследует коллективный иммунитет и надеется побудить людей пройти вакцинацию, чтобы снизить уровень инфицирования в наших общинах. Наша программа моделирует, как болезнь поражает население с разным процентом вакцинированных и невакцинированных. Он демонстрирует коллективный иммунитет, показывая, как увеличение количества вакцинированного населения может уменьшить количество пораженных.

Мы моделируем это в Matlab, используя концепции теории графов. Теория графов - это математический способ представления отношений между объектами. В теории графов у графов есть вершины (или узлы), соединенные ребрами (или линиями). В нашем проекте узлы - это заинтересованные лица, а ребра - их соединения. Например, если два узла соединены ребром, это означает, что они «друзья» или имеют некоторую форму контакта друг с другом. Этот контакт - путь распространения болезни. Вот почему мы использовали теорию графов для моделирования нашей концепции, потому что мы хотели увидеть, как болезнь распространяется среди людей, связанных в популяции.

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

Весь код проекта связан внизу!

Кредит ПК:

Ссылка Matlab на Теорию графов:

Шаг 1. Создайте матрицу смежности

Создать матрицу смежности
Создать матрицу смежности
Создать матрицу смежности
Создать матрицу смежности

Создайте новый скрипт. Мы будем называть нашу «инфекциюSim.m».

Мы собираемся создать переменную NUMOFPEOPLE. Вы можете присвоить ему любое целочисленное значение. Это будет представлять количество людей в вашем населении.

С этого момента мы будем предполагать, что

NUMOFPEOPLE = 20;

Сначала начните с использования функций теории графов Matlab для неориентированного графа.

Если вы хотите узнать больше, вот ссылка, по которой вы можете подробнее узнать об этом.

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

Создал матрицу смежности.

adjMatrix = нули (NUMOFPEOPLE);

Это создаст квадратную матрицу из нулей. Каждая строка в матрице - это человек. Каждый столбец в матрице - это человек или друг, с которыми человек встречается в течение дня.

См. Рис. 100 (выше), чтобы наглядно представить, как будет выглядеть adjMatrix для 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 = график (a); % с использованием функции графика (теория графиков) рисунок (1); h = участок (г);

См. Рисунок 1 (выше), чтобы увидеть, как добавить ребра в матрицу смежности, используя код в «Примечании».

Шаг 2: Создайте отношения

Создавайте отношения
Создавайте отношения

Теперь, когда созданы люди (вершины или узлы), нам нужно создать сеть отношений (линии или ребра графа). Это будет имитировать, как люди взаимодействуют и встречаются с другими людьми в течение дня.

Это можно сделать разными способами. Один из способов выполнить эту задачу - сначала присвоить каждому человеку случайное число, чтобы определить, со сколькими людьми каждый человек будет взаимодействовать за день.

numOfFriendsMatrix = randi ([минимум друзейПерсонканхаве, большинство друзейПерсонканхаве], 1, NUMOFPEOPLE);

В результате получается матрица случайных целых чисел размером 1 на 20, представляющая количество взаимодействий, которые каждый человек имеет в день. В столбцах этой матрицы будут числа, соответствующие каждому человеку. Например, если мы присвоим минимум друзьямПерсонканхаве = 2 и большинство друзейПерсонканхаве = 5, мы получим случайные значения от 2 до 5.

Возникли проблемы с randi ()? В терминале введите

помочь Рэнди

Затем мы составляем рандомизированную матрицу (называемую «allFriendsmatrix») того, как каждый человек в популяции связан / взаимодействует с ней.

tempMatrix = ;

count = 0; allFriendsMatrix = ; для k = 1: NUMOFPEOPLE while length (tempMatrix) ~ = numOfFriendsMatrix (k) count = count +1; темп = ранди ([1, ЧИСЛО]); tempMatrix (count) = temp; конец очистить каждое время, пока длина (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; конец allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; count = 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 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 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 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 NaN 2 18 10 16 NaN NaN NaN NaN NaN 2 6 14 3 13 NaN 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 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.

для eachRow = 1: NUMOFPEOPLE

для eachCol = 1: 9, если isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; конец конец конец

Код Пояснение

Этот двойной цикл for проходит через каждую строку и столбец allFriendsMatrix. Оператор if будет выполняться для всех значений, отличных от NaN. В основном он будет создавать ребра или линии графа. Итак, первая строка, которую мы получим, будет от человека 1 к человеку 16 и от человека 16 к человеку 1. Поскольку это неориентировано, 1 нужно изменить для обоих! Мы не можем просто иметь край от 1 до 16, а не от 16 до 1. Они должны быть симметричными для правильной работы в Matlab.

В нашем моделировании мы установили, что люди не могут взаимодействовать сами с собой. Когда мы рандомизировали значения, есть вероятность, что наша соседняя матрица имеет эти ошибки.

Исправим это с помощью следующего кода:

для каждого = 1: NUMOFPEOPLE

adjMatrix (каждый, каждый) = 0; конец

Код Пояснение

Этот цикл for гарантирует, что человек 1 не связан с человеком 1, человек 2 не связан с человеком 2 и т. Д., Делая их все 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% type: double; процентная вероятность того, что непривитые люди не заболеют

Vac% тип: двойной; процентная вероятность того, что вакцинированные люди не заболеют unvacc_perc% type: double; процент невакцинированного населения init_infect% type: int; процент вакцинированного населения

Далее нам нужно произвести некоторые расчеты.

Мы собираемся создать «инфекционный мат», который представляет собой матрицу 3 * NUMOFPEOPLE.

Vac_perc = 1-unvacc_perc;

инфекцияMat = nan (3, NUMOFPEOPLE); число = раунд (Vac_perc * NUMOFPEOPLE); инфекцияМат (1, 1: число) = вакцина; инфекцияMat (1, число + 1: конец) = unvacc; инфекцияMat (2, 1: конец) = 0; инфекцияMat (2, 1: init_infect) = 1;

Код Пояснение

строка 1: Рассчитанный процент невакцинированного населения.

строка 2: создать матрицу количества людей 3 * N

строка 3: узнать количество вакцинированных от процента вакцинированных

Строка 4: вакцинированным людям дать иммунитет, связанный с вакцинацией. Это значение присваивается на основании исследования болезни.

строка 5: для остального населения (непривитых) дать им процентный иммунитет. Это значение присваивается на основании исследования болезни.

строка 6: изначально установить всех людей как незараженные.

Строка 7: для количества людей, изначально инфицированных, заполните соответственно первую пару столбцов.

Теперь, когда мы установили все параметры для моделирования болезни, мы собираемся рандомизировать вероятность заражения человека (как вакцинированного, так и невакцинированного). Это делается на следующем этапе путем присвоения случайных значений от 0 до 1 каждому человеку в третьей строке этого «мата заражения».

Шаг 4: рандомизируйте вероятность заражения вакцинированного и непривитого человека

Затем присвойте каждому человеку случайный номер, который позже будет использоваться, чтобы определить, заразился человек или нет.

для w = 1: длина (инфекционный мат)

инфекцияМат (3, ш) = рандом; конец

Объяснение кода

Этот цикл for имеет дело с третьей строкой «заражения», созданной на последнем шаге. 'rand' присваивает значение от 0 до 1 каждому индексу строки 3.

Выход

Инфекция Мат теперь завершена! Это было с популяцией со 100% вакцинацией и 1 человеком, изначально инфицированным.

инфекцияMat =

Столбцы 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 Столбцы 13-20 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: Создайте матрицы невакцинированных и инфицированных людей на основе исходной информации

Создайте 2 матрицы с названиями «matrixUnvacc» и «matrixInfected», в которых хранятся все инфицированные люди от зараженияMat. Это будет использоваться для того, чтобы мы могли раскрасить график тех, кто инфицирован, невакцинирован или вакцинирован, помогая визуализировать влияние невакцинированных и вакцинированных людей.

очистить каждый

matrixInfected = ; matrixUnvacc = ; для h = 1: длина (инфекцияMat), если инфекцияMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; end end for person = 1: NUMOFPEOPLE if influenzaMat (2, person) == 1 matrixInfected = [matrixInfected, person]; конец конец

Код Пояснение

Создайте две пустые матрицы для хранения количества невакцинированных и инфицированных людей соответственно. Оба цикла for выполняются 20 раз, и если оператор if удовлетворяется, то число добавляется в правильную матрицу.

Выход

matrixUnvacc =

matrixInfected =

[1]

Шаг 6: Постройте исходный график

Постройте начальный график
Постройте начальный график

Далее мы собираемся построить матрицу смежности.

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

figure (1) p = plot (g, 'NodeColor', 'b', 'MarkerSize', 7); highlight (p, matrixUnvacc, 'NodeColor', 'g') highlight (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc * 100; title (['Процент непривитых:', num2str (title_unvacc), '%']); пауза (скорость)

Объяснение кода

Теория графов в Matlab имеет встроенные функции. Когда мы используем функцию graph (), мы можем преобразовать «adjMatrix» в реальный неориентированный график. Затем нам нужно создать график, используя функцию plot (), чтобы увидеть, как он выглядит. Мы устанавливаем для этого plot () переменную, чтобы мы могли легко манипулировать и изменять цвета графика во время моделирования. Все люди (или узлы) изначально имеют синий цвет. Затем для всех непривитых людей устанавливается «зеленый» цвет. Затем зараженные люди окрашиваются в красный цвет. Название устанавливается в соответствии с определенным процентным значением тестируемых невакцинированных людей. Функция pause () временно останавливает выполнение MatLab. Мы проходим через переменную скорость, которая рассчитывается в секундах.

См. Рисунок (выше), чтобы увидеть график с произвольной цветовой кодировкой.

Узнайте больше о функции highlight () в MatLab.

Шаг 7: Смоделируйте развитие инфекции

Затем нам нужно выяснить, кто заразится после взаимодействий (записанных в adjMatrix), и обновить график, когда кто-то заразится.

Используйте adjMatrix, чтобы определить, какие люди инфицированы после их взаимодействия с людьми в течение дня.

для eachRow = 1: длина (adjMatrix)

iffectionMat (2, eachRow) == 1 для eachCol = 1: length (adjMatrix) if adjMatrix (eachRow, eachCol) == 1% eachRow = человек% eachCol = его друг% друг каждого человека и посмотрите, заразятся ли они. если инфекцияMat (3, eachCol)> заражениеMat (1, eachCol) инфекцияMat (2, eachCol) = 1; выделить (p, eachCol, 'NodeColor', 'r') пауза (скорость) конец конец конец конец конец

Цикл for проходит через каждого человека. Он проверяет, заражен ли человек, проверяет каждого из людей / друзей, с которыми они общались, и проверяет, был ли уровень иммунитета друга выше, чем сила болезни. Здесь в игру вступает созданный нами ранее «зараженный мат». Сравниваются 1-я и 3-я строки каждого столбца друга, и если 3-я строка больше, это означает, что у друга недостаточно высокого иммунитета, чтобы избежать болезни, и в конечном итоге он заражается. Мы также меняем цвет с помощью выделения () на красный, если они заражены.

Теперь ваш код для моделирования должен работать! и для любого размера населения просто измените NUMOFPEOPLE!

Шаг 8: Используйте теорию Монте-Карло

Чтобы сделать еще один шаг вперед и извлечь данные из нашего симулятора («infigurationSim.m »), мы хотели рассчитать и изобразить тенденцию изменения процента невакцинированных людей, которые заразились, и процента вакцинированных людей, которые заразились. Мы предполагаем, что процент вакцинированных людей, заразившихся, должен быть намного ниже, чем процент инфицированных невакцинированных людей.

Шаг 9: Преобразуйте файл ('virusSim.m') с моделированием в функцию

Чтобы запустить Монте-Карло, мы хотели бы запустить моделирование несколько раз и накопить данные, чтобы мы могли использовать их для построения графика процентов людей, которые заразились.

Функцию можно настроить так:

функция output = инфекцияSim (unvacc, Vac, NUMOFPEOPLE, unvacc_perc, init_infect, speed)

Закомментируйте переменные в вашей симуляции, так как теперь вы передаете их через главный файл (мы начнем писать это на шаге 12):

unvacc, Vac, NUMOFPEOPLE, unvacc_perc, init_infect

Новая переменная

скорость

будет назначен в основном файле (Monte_Carlo.m).

Примечание: не забудьте конец внизу файла функции, чтобы завершить функцию!

Шаг 10: Подсчитайте процентное соотношение невакцинированных и вакцинированных людей, которые заразились

Это позволяет рассчитать процент инфицированных невакцинированных людей. Этот код находится в самом низу файла «virusSim.m».

number_of_unvacc = 0;

number_of_infec_unvacc = 0; % вычисляет процент невакцинированных людей, которые заразились для x = 1: length (инфекцияMat) ifinflationMat (1, x) == unvacc number_of_unvacc = number_of_unvacc + 1; конец, если инфекцияMat (1, x) == unvacc & ИнфекцияMat (2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; конец конец процент_из_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc) * 100;

Объяснение кода

В цикле for он будет повторяться NUMOFPEOPLE раз. Каждый раз, когда номер в файле influentialMat соответствует количеству невакцинированных людей (т.е. 0,95 == 0,95), количество невакцинированных людей будет увеличиваться на 1. Каждый раз, когда номер в файле Инфекция соответствует количеству невакцинированных, и они инфицированы, количество инфицированных и невакцинированных увеличивается на 1. Последняя строка делит количество инфицированных, невакцинированных людей на общее количество невакцинированных людей. Затем от этого рассчитывается процент.

Вызов:

Попробуйте посчитать процент вакцинированных людей, заразившихся! (Подсказка: он очень похож на приведенный выше код, однако некоторые переменные изменены, а имена скорректированы.)

Затем рассчитывается процент инфицированных людей от общей численности населения:

pre_per_infect = cumsum (инфекцияMat (2,:));

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

Объяснение кода

Кумулятивная сумма рассчитывается с использованием второй строки файла заражения, в котором хранятся единицы и нули в зависимости от того, инфицирован человек или нет. Так как функция cumsum () возвращает матрицу, мы берем последнее значение в матрице ('pre_per_infect (1, NUMOFPEOPLE)'), которое должно быть фактической суммой всех значений из 'зараженияMat (2,:)'. Разделив сумму на ЧИСЛО и умножив ее на 100, мы получим окончательный процент зараженных в общей популяции.

Шаг 11: Создайте выходную переменную в своей функции «заражениеSim.m»

output = [per_infect, процент_из_вакции_и_инфек, процент_вакции_и_инфек];

Объяснение кода

Сохраните эту информацию в выводе, который будет отправлен обратно в main (Monte_Carlo.m), когда функция будет вызвана и завершится. Эти данные используются для построения графика процентной доли инфицированных среди вакцинированных и невакцинированных.

Теперь ваша функция «virusSim.m» должна быть завершена! Однако он не запустится, потому что нам все еще нужно написать main!

Шаг 12: Создайте меню для получения от пользователя начальных условий моделирования

Помните, как мы сказали переменную

скорость

будет создан и передан через основную функцию? Нам нужно получить значения для передачи функции. Обратите внимание, порядок значений при вызове функции имеет значение!

Начните с того, что попросите пользователя ввести несколько ответов в терминал.

> Выбери болезнь. Обратите внимание, что это чувствительно к регистру >> Коклюш >> Грипп >> Корь >> Выбранное заболевание: Грипп >> Выберите численность населения. >> 20 >> 200 >> Выбрано населения: 20 >> Выберите скорость моделирования. >> Быстро >> Медленно >> Выбрана скорость: Быстро

Этот код ниже спрашивает пользователя, с каким заболеванием он хочет бороться.

disp ("Выберите болезнь. Обратите внимание, что регистр чувствителен")

fprintf ('Коклюш / nFlu / nMeasles / n') болезнь = input ('Выбранная болезнь:', 's'); если isequal (болезнь, коклюш) вакцина = 0,85; % 15% шанс заболеть непривитым заболеванием = 0,20; % 80-процентная вероятность заразиться другим заболеванием при равной вакцине (болезнь, грипп) = 0,75; % 25% шанс заболеть непривитым заболеванием = 0,31; % 69% вероятность заразиться другим заболеванием при равной вакцине (болезнь, «Корь») = 0,97; % 3-процентный шанс заболеть непривитым заболеванием = 0,10; % 90% шанс получить конец болезни

Пояснение к коду:

Функция disp () выводит инструкцию на экран, а также распечатывает различные параметры. Соответственно будет назначено заболевание. В этой версии в настоящее время не учитывается недопустимый ввод. Неверный ввод приведет к ошибке и полностью остановит программу. С каждой болезнью связаны значения вакцины и невакцинации. Эти значения НЕ случайны. Мы получили эти значения в результате исследования статистики болезней.

Затем нам нужно спросить пользователя, хотят ли они протестировать большую или малую популяцию на выбранную ими болезнь.

disp ('Выберите размер популяции.')

fprintf ('20 / n200 / n ') speed = input (' Население выбрано: ',' s '); если isequal (скорость, '20') Population_size = 20; elseif isequal (скорость, '200') Population_size = 200; конец

Объяснение кода

При этом выводится сообщение пользователю и предлагается ввести, какой размер населения он хочет протестировать. В этой версии в настоящее время не учитывается недопустимый ввод. Неверный ввод приведет к ошибке и полностью остановит программу. 20 было выбрано, потому что это небольшой размер выборки, который все же дает хорошее представление о том, как инфекция распространяется среди небольшой популяции. 200 человек были выбраны как более крупный вариант, потому что 200 точек, нанесенных на график, почти не перекрывались, поэтому все можно было легко увидеть и отличить друг от друга.

Далее нам нужно найти скорость симуляции.

disp ('Выберите скорость моделирования.')

fprintf ('Fast / nSlow / n') speed = input ('Скорость выбрана:', 's'); if isequal (speed, 'Fast') sim_speed = 0; elseif isequal (скорость, 'Медленно') sim_speed = 0,25; конец

Объяснение кода

Этот процесс был таким же, как и определение типа болезни и численности населения. Для быстрой паузы не будет. а для медленного будет задержка в 0,25 секунды в цикле for при запуске моделирования.

Большой! Теперь у нас есть все необходимые данные от пользователя! Перейдем к сбору данных о разном проценте непривитых.

Шаг 13: Выберите процент невакцинированных людей и рассчитайте среднее количество невакцинированных и инфицированных для выбранного процента

Этот код предназначен для 0% непривитых людей.

% -------% 0 Невакцинированные ------------

per_infect_av_0 = ; процент_из_unvacc_and_infec_av_0 = ; для i = 1:20 out = инфекцияSim (unvacc, вакцина, размер_популяции, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, out (1, 1)]; процент_из_unvacc_and_infec_av_0 = [процент_п_unvacc_and_infec_av_0, из (1, 2)]; конец average_infected_0 = среднее (per_infect_av_0); average_unvacc_and_infec_0 = среднее (процент_unvacc_and_infec_av_0);

Пояснение к коду:

Цикл for выполняется 20 раз. Выходные данные функции зараженияSim () сохраняются в out. Каждый раз, когда запускается цикл for, процент зараженных в общей популяции добавляется в матрицу per_infect_av_0. Кроме того, процент невакцинированных и инфицированных также каждый раз добавляется в матрицу «процент_от_unvacc_and_infec_av_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 (line_x, line_y, 'Цвет', 'красный', 'Стиль линии', '-'); title ([«Тенденция непрививки от», болезнь]); 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: Конечный продукт: как выглядит моделирование

Весь код можно найти здесь

Рекомендуемые: