【发布时间】:2013-05-07 08:55:23
【问题描述】:
我想解决一个 ODE 系统,其中在前 30,000 秒内,我希望我的一个状态变量从相同的初始值开始。在这 30,000 秒之后,我想将该状态变量的初始值更改为不同的值,并在其余时间模拟系统。这是我的代码:
def ode_rhs(y, t):
ydot[0] = -p[7]*y[0]*y[1] + p[8]*y[8] + p[9]*y[8]
ydot[1] = -p[7]*y[0]*y[1] + p[8]*y[8]
ydot[2] = -p[10]*y[2]*y[3] + p[11]*y[9] + p[12]*y[9]
ydot[3] = -p[13]*y[3]*y[6] + p[14]*y[10] + p[15]*y[10] - p[10]*y[2]*y[3] + p[11]*y[9] + p[9]*y[8] - p[21]*y[3]
ydot[4] = -p[19]*y[4]*y[5] - p[16]*y[4]*y[5] + p[17]*y[11] - p[23]*y[4] + y[7]*p[20]
ydot[5] = -p[19]*y[4]*y[5] + p[15]*y[10] - p[16]*y[4]*y[5] + p[17]*y[11] + p[18]*y[11] + p[12]*y[9] - p[22]*y[5]
ydot[6] = -p[13]*y[3]*y[6] + p[14]*y[10] - p[22]*y[6] - p[25]*y[6] - p[23]*y[6]
ydot[7] = 0
ydot[8] = p[7]*y[0]*y[1] - p[8]*y[8] - p[9]*y[8]
ydot[9] = p[10]*y[2]*y[3] - p[11]*y[9] - p[12]*y[9] - p[21]*y[9]
ydot[10] = p[13]*y[3]*y[6] - p[14]*y[10] - p[15]*y[10] - p[22]*y[10] - p[21]*y[10] - p[23]*y[10]
ydot[11] = p[19]*y[4]*y[5] + p[16]*y[4]*y[5] - p[17]*y[11] - p[18]*y[11] - p[22]*y[11] - p[23]*y[11]
ydot[12] = p[22]*y[10] + p[22]*y[11] + p[22]*y[5] + p[22]*y[6] + p[21]*y[10] + p[21]*y[3] + p[21]*y[9] + p[24]*y[13] + p[25]*y[6] + p[23]*y[10] + p[23]*y[11] + p[23]*y[4] + p[23]*y[6]
ydot[13] = p[15]*y[10] + p[18]*y[11] - p[24]*y[13]
return ydot
pysb.bng.generate_equations(model)
alias_model_components()
p = np.array([k.value for k in model.parameters])
ydot = np.zeros(len(model.odes))
y0 = np.zeros(len(model.odes))
y0[0:7] = p[0:7]
t = np.linspace(0.0,1000000.0,100000)
r = odeint(ode_rhs,y0,t)
因此,换句话说,我想在前 30,000 秒内每次调用 odeint 时将 y0[1] 设置为相同的值 (100)。在将信号输入系统之前,我正在有效地尝试让系统平衡一段时间。我考虑过将if t < 30000: y0[1] = 100 之类的东西作为ode_rhs() 函数的第一行,但我不太确定它是否有效。
【问题讨论】:
-
我不确定我是否关注你,但初始条件是初始条件,例如 t=0。在初始时间之后更改初始条件是没有意义的。此外,您只调用一次
odeint。 “在前 30,000 秒内每次调用 odeint”是什么意思? -
为什么这个问题有
matlab标签?为什么不scipy? -
你是对的 - 它应该被标记为
scipy而不是matlab。谢谢。 -
好的,我更新了标签。
标签: python numpy scipy integrate ode