✅ Пост по событиям прошедшей недели

Nov 2, 2024·
Mikle Web Page
Mikle Web Page
· 4 min read

События предыдущей недели

Прошедшая неделя была насыщенной: я работал над программной реализацией модели SIR для эпидемиологического моделирования с использованием метода Рунге-Кутта и перевёл эту задачу на Python через классы. Также я расширил функциональность сайта на Hugo, добавив полезные ссылки на ресурсы для исследователей.


1. Моделирование эпидемии методом Рунге-Кутта

Описание задачи

Для моделирования распространения эпидемии я использовал модель SIR, которая разделяет популяцию на три группы:

  • \( S \) — здоровые, восприимчивые к болезни;
  • \( I \) — инфицированные;
  • \( R \) — выздоровевшие.

Модель учитывает два параметра: коэффициент заражения \( a = 0.007 \) и коэффициент выздоровления \( b = 0.003 \). Критическое значение инфицированных crit_I установлено на уровне 90. Если число заражённых превышает критическое значение, здоровые особи продолжают заражаться, иначе заражённые изолируются и выздоравливают.

Реализация в Julia с использованием метода Рунге-Кутта

Для решения системы дифференциальных уравнений я воспользовался пакетом DifferentialEquations.jl. Программный код включает настройку начальных условий, параметры модели, а также реализацию логики изменения значений \( S \), \( I \), и \( R \) в зависимости от текущего числа инфицированных.

import Pkg
Pkg.add("Plots")
Pkg.add("DifferentialEquations")

N = 7777       # Общее количество особей
I = 700        # Начальное число инфицированных
R = 0          # Начальное число выздоровевших
S = N - I - R  # Начальное число здоровых

a = 0.007      # Коэффициент заражения
b = 0.003      # Коэффициент выздоровления
crit_I = 90    # Критическое число инфицированных

u0 = [S, I, R] # Начальные условия
tspan = (0.0, 2500.0)


# Определение комбинированной фазы с учетом критического порога
function combo_case!(du, u, p, t)
    a, b, crit_I = p
    if u[2] > crit_I
        du[1] = -a * u[1]          # Количество восприимчивых особей уменьшается за счет заражений
        du[2] = a * u[1] - u[2] * b # Количество инфицированных изменяется из-за заражений и выздоровлений
        du[3] = u[2] * b           # Количество выздоровевших увеличивается
    else
        du[1] = 0                  # Количество восприимчивых особей остается неизменным
        du[2] = -u[2] * b          # Количество инфицированных уменьшается только за счет выздоровлений
        du[3] = u[2] * b           # Количество выздоровевших увеличивается
    end
end

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

Реализация на Python с использованием классов

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

class Simulation:
    def __init__(self, N=7777, I=700, R=0, a=0.007, b=0.003, crit_I=90):
        self.N = N  # Общее количество особей
        self.I = I  # Инфицированные
        self.R = R  # С иммунитетом
        self.S = N - I - R  # Здоровые
        self.a = a  # Коэффициент заболевания
        self.b = b  # Коэффициент выздоровления
        self.crit_I = crit_I  # Критическое значение инфицированных
        self.t = 0  # Время
        self.count_I = []
        self.count_R = []
        self.count_S = []
    
    def plot_results(self, include_S=False):
        plt.figure(dpi=100)
        time_range = np.arange(0, len(self.count_I), 1)
        plt.plot(time_range, self.count_I, lw=2, label='I', color='red')
        plt.plot(time_range, self.count_R, lw=2, label='R', color='green')
        if include_S and self.count_S:
            plt.plot(time_range, self.count_S, lw=2, label='S', color='blue')
        plt.grid()
        plt.legend()
        plt.show()

Сценарий симуляции с критическим уровнем инфицированных

Класс GeneralScenario наследуется от Simulation и реализует основной цикл симуляции, который учитывает изменение состояния популяции в зависимости от критического числа зараженных. Если число инфицированных превышает crit_I, здоровые продолжают заражаться, иначе инфекция постепенно снижается.

class GeneralScenario(Simulation):
    def run_simulation(self, max_steps=10000):
        while self.t != max_steps and int(self.I) != 0:
            if self.I > self.crit_I:
                self.S -= self.a * self.S
                self.I += self.a * self.S - self.I * self.b 
                self.R += self.I * self.b
            else:
                self.I -= self.I * self.b
                self.R += self.I * self.b
            self.count_S.append(self.S)
            self.count_I.append(self.I)
            self.count_R.append(self.R)
            self.t += 1
        print("Общий цикл завершен на шаге:", self.t)

2. Дополнение сайта на Hugo

На сайт, построенный с использованием Hugo, были добавлены ссылки на различные ресурсы для исследователей и учёных, чтобы пользователи могли быстро получить доступ к популярным академическим платформам. Ниже приведен список добавленных ресурсов:

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


Выводы

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

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

Список литературы

  1. DifferentialEquations.jl Documentation
  2. Hugo Documentation
  3. Wikipedia: SIR modelhttps://en.wikipedia.org/wiki/Compartmental_models_in_epidemiology#The_SIR_model