python动力学建模与仿真_PyMC3中的简单动力学模型

本文通过Python的PyMC3库构建基本的SIR动力学模型,旨在推断参数r0和g。SIR模型用于描述传染病的传播,其中dS/dt和dI/dt分别与r0和g有关。代码示例展示了如何用数值方法解决动力学方程,并使用马尔可夫链蒙特卡洛方法(MCMC)进行参数估计。在尝试过程中遇到了递归过深的问题,但最终得到了2000次采样的轨迹。
摘要由CSDN通过智能技术生成

我试图在PyMC3中建立一个动力学系统的模型,来推断两个参数。该模型是流行病学中常用的基本SIR:

dS/dt=-r0*g*S*I

dI/dt=g*I(r*S-1)

其中r0和g是要推断的参数。到目前为止,我根本走不远。我见过的唯一一个例子,把这样一个马尔可夫链放在一起会产生递归太深的错误。下面是我的示例代码。在# Time

t = np.linspace(0, 8, 200)

# Simulated observation

def SIR(y, t, r0, gamma) :

S = - r0 * gamma * y[0] * y[1]

I = r0 * gamma * y[0] * y[1] - gamma * y[1]

return [S, I]

# Currently no noise, we just want to infer params r0 = 16 and g = 0.5

solution = odeint(SIR, [0.99, 0.01, 0], t, args=(16., 0.5))

with pymc.Model() as model :

r0 = pymc.Normal("r0", 15, sd=10)

gamma = pymc.Uniform("gamma", 0.3, 1.)

# Use forward Euler to solve

dt = t[1] - t[0]

# Initial conditions

S = [0.99]

I = [0.01]

for i in range(1, len(t)) :

S.append(pymc.Normal("S%i" % i, \

mu = S[-1] + dt * (-r0 * gamma * S[-1] * I[-1]), \

sd = solution[:, 0].std()))

I.append(pymc.Normal("I%i" % i, \

mu = I[-1] + dt * ( r0 * gamma * S[-1] * I[-1] - gamma * I[-1]), \

sd = solution[:, 1].std()))

Imcmc = pymc.Normal("Imcmc", mu = I, sd = solution[:, 1].std(), observed = solution[:, 1])

#start = pymc.find_MAP()

trace = pymc.sample(2000, pymc.NUTS())

任何帮助都将不胜感激。谢谢!在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值