小编Jar*_*ier的帖子

动力系统分岔图

翻译:博士

如何在 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 simulation modeling scipy numerical-methods

5
推荐指数
1
解决办法
603
查看次数

仅获取一个数组中存在于另一数组中的元素

我正在从 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)

julia

3
推荐指数
1
解决办法
544
查看次数

了解二维数组的高效连续内存分配

以下代码来自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 矩阵的结果。请注意,为了清楚起见,我只是将索引写在下图中的框中,当然,存储在这些内存位置的值不会是 …

c malloc multidimensional-array

2
推荐指数
1
解决办法
191
查看次数