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


События предыдущей недели
Прошедшая неделя была насыщенной: я работал над программной реализацией модели 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, были добавлены ссылки на различные ресурсы для исследователей и учёных, чтобы пользователи могли быстро получить доступ к популярным академическим платформам. Ниже приведен список добавленных ресурсов:
- eLibrary : https://elibrary.ru/
- Google Scholar : https://scholar.google.com/
- ORCID : https://orcid.org/
- Mendeley : https://www.mendeley.com/
- ResearchGate : https://www.researchgate.net/
- Academia.edu : https://www.academia.edu/
- arXiv : https://arxiv.org/
- GitHub : https://github.com/
Эти ресурсы предоставляют возможность вести исследовательскую деятельность, обмениваться знаниями и находить необходимые материалы.
Выводы
За прошедшую неделю я успешно реализовал программные методы для модели SIR, изучил и реализовал метод Рунге-Кутта для решения дифференциальных уравнений, а также создал гибкую реализацию модели в Python с использованием классов. Кроме того, я добавил полезные ссылки на сайт, что сделало его более удобным для исследователей.
Эти задачи помогли мне улучшить навыки программирования и работы с математическими моделями, а также создать более структурированный и функциональный сайт для пользователей.
Список литературы
- DifferentialEquations.jl Documentation
- Hugo Documentation
- Wikipedia: SIR model — https://en.wikipedia.org/wiki/Compartmental_models_in_epidemiology#The_SIR_model