翻译:博士
如何在 Python 中实现 SEIR(易感、暴露、感染、康复)等季节性强制流行病学模型的分叉图?我已经知道如何实现模型本身并显示采样的时间序列(请参阅此 stackoverflow 问题),但我正在努力从教科书中重现分叉图。
背景和我的尝试
我试图重现《人类和动物传染病建模》(Keeling 2007)一书中的数据,以验证我的模型实现,并学习/可视化不同模型参数如何影响动态系统的演化。下图是课本图。
我已经找到了使用逻辑图的分叉图的实现(请参阅此ipython 食谱、此pythonalgos bifurcation和此stackoverflow 问题)。我从这些实现中得到的主要结论是,分叉图上的单个点的 x 分量等于变化参数的某个特定值(例如 Beta 1 = 0.025),而其 y 分量是解(数字或其他形式)对于给定的模型/函数,在时间 t 处。我使用这个逻辑来实现plot_bifurcation本问题末尾代码部分中的功能。
问题
为什么我的面板输出与图中的不符?我假设如果我的面板与教科书中的输出不匹配,我就无法尝试重现教科书中的分叉图。
我尝试实现一个函数来生成分叉图,但输出看起来很奇怪。我对分叉图有什么误解吗?
注意:在代码执行期间我没有收到任何警告/错误。
重现我的数字的代码
from typing import Callable, Dict, List, Optional, Any
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
def seasonal_seir(y: List, t: List, params: Dict[str, Any]):
"""Seasonally forced SEIR model.
Function parameters much match with those required
by `scipy.integrate.odeint` …Run Code Online (Sandbox Code Playgroud) 我正在从 Python 学习 Julia。我想获取数组的元素,b使得每个元素都在 array 中a。我在 Julia 中的尝试是在 python 中完成我需要的操作后显示的。我的问题是:在 Julia 中是否有更好/更快的方法来做到这一点?我对我在 Julia 中编写的内容的简单性感到怀疑,并且担心这样一个看似幼稚的解决方案可能具有次优的性能(同样来自 Python)。
Python:
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([7, 8, 2, 3, 5])
indices_b_in_a = np.nonzero(np.isin(b, a))
b_in_a = b[indices_b_in_a]
# array([2, 3])
Run Code Online (Sandbox Code Playgroud)
朱莉娅:
a = [1, 2, 3, 4];
b = [7, 8, 2, 3, 5];
indices_b_in_a = findall(ele -> ele in a, b);
b_in_a = b[indices_b_in_a];
#2-element Vector{Int64}:
# 2
# 3
Run Code Online (Sandbox Code Playgroud) 以下代码来自pg. 93并行和高性能计算,是 2D 数组的单个连续内存分配:
double **malloc_2D(int nrows, int ncols) {
double **x = (double **)malloc(
nrows*sizeof(double*)
+ nrows*ncols*sizeof(double)); // L1
x[0] = (double *)x + nrows; // L2
for (int j = 1; j < nrows; j++) { // L3
x[j] = x[j-1] + ncols;
}
return x;
}
Run Code Online (Sandbox Code Playgroud)
书中指出,这提高了内存分配和缓存效率。是否有任何理由在效率方面更喜欢第一个代码而不是下面的代码?看起来下面的代码更具可读性,并且也可以轻松地与 MPI 一起使用(我只提到这一点,因为本书稍后也介绍了 MPI)。
double *malloc_2D(int nrows, int ncols) {
double *M = (double *)malloc(nrows * ncols * sizeof(double))
return M
}
Run Code Online (Sandbox Code Playgroud)
我添加了下图,以确保我的第一个代码的思维模型是正确的。如果不是,请在答案中提及。该图像是调用第一个函数创建 5 x 2 矩阵的结果。请注意,为了清楚起见,我只是将索引写在下图中的框中,当然,存储在这些内存位置的值不会是 …