【发布时间】:2017-08-16 08:30:51
【问题描述】:
我正在使用 scipy 食谱中的 Zombie Apocalypse example 来学习如何在 python 中求解 ODE 系统。
在此模型中,有一个方程可以根据出生率、死亡率和初始人口提供每天的人口数量。然后根据人口计算创建和杀死多少僵尸。
我有兴趣将人口微分方程替换为一个数据列表,该数据列表告诉我们每个时间步长的人口数量。我收到以下错误:
TypeError: can't multiply sequence by non-int of type 'float'
正如人们所指出的那样,这是因为将单个数字乘以列表是没有意义的。我不确定如何在每次 T 时将列表中的数字提供给微分方程。
这是两次尝试的代码
# solve the system dy/dt = f(y, t)
def f(y, t):
Si = [345, 299, 933, 444, 265, 322] # replaced an equation with list
Zi = y[0]
Ri = y[1]
# the model equations (see Munz et al. 2009)
f0 = B*Si*Zi + G*Ri - A*Si*Zi
f1 = d*Si + A*Si*Zi - G*Ri
return [f0, f1]
我也试过了
numbers = [345, 299, 933, 444, 265, 322]
for t in [0, 5]:
Si = numbers
# solve the system dy/dt = f(y, t)
def f(y, t):
Zi = y[0]
Ri = y[1]
# the model equations (see Munz et al. 2009)
f0 = B*Si*Zi + G*Ri - A*Si*Zi
f1 = d*Si + A*Si*Zi - G*Ri
return [f0, f1]
这两种尝试都有相同的问题,即向 f0 和 f1 提供整个列表,而不是从列表中迭代地提供 1 个数字。
【问题讨论】:
-
对于我正在做的现实生活中的问题,我需要用真实数据列表替换系统中的 1 个微分方程。我也尝试在 Y 函数定义之外定义 Si,但得到相同的错误
codenumbers = [345, 299, 933, 444, 265, 322]codefor t in [0, 5]: @ 987654329@ Si = 数字 -
不要谈论用数字列表替换微分方程(这对我来说没有意义),而是尝试从一开始就根据您拥有的信息来解释问题。例如,类似“我有一个数字列表。这些数字的含义是 [...]。我想建模一个过程,其中这些数字用于 [...]”
-
你是对的,我用一种特别愚蠢的方式表达了我的问题,我深表歉意。我确实理解你的观点和 python 错误,我不能将我的数字乘以一个列表。我试图了解如何在每个时间步 t 向 f0 和 f1 方程提供列表中的项目。感谢您抽出宝贵时间提供帮助。
-
我没有清楚地表达我想要做什么。我是一名生物学家,我有一个简单的 ODE 系统,它模拟蛋白质如何被激活,然后与其他几种蛋白质相互作用。我现在有关于给定时间跨度内激活蛋白质水平的真实数据,我想用真实的时间序列数据替换代表模型中该蛋白质激活的方程。在僵尸启示录模型的类比中,我想用不同时间点的人类流行列表替换描述人口出生率和死亡率的方程。
-
我已编辑问题标题和问题。感谢您的宝贵时间。