我有一个R代码,用DeSolve软件包中的ode函数求解一个常微分方程。
f <- function(t, y, parms) {
with(as.list(c(y, parms)),{
rate <- M * A/(A + K) * A
dA <- -rate + D * (IN - A)
dB <- rate - D * B
Total <- A + B
Conserved<- dA + dB - D * (IN - A) + D * B
return (list(c(dA, dB),
Total = Total, rate = rate, Conserved = Conserved))
})
}
我想在python中复制这段代码,但是,我不知道如何返回普通变量的值,例如Total
,rate
,和Conserved
。现在,我正在重新计算积分后的所有值,如下面的代码所示,但是我不知道如何重新计算变量Conserved
。
def f(C0, t):
A, B = C0
rate = M*A/(A+K)*B
dA = - rate + D*(IN-A)
dB = rate - D*B
return [dA, dB]
times = np.arange(0, 0.05*365, 0.005)
C = odeint(f, C0, times)
DF = pd.DataFrame(C, columns=['A', 'B'])
DF['time'] = times
DF['Total'] = DF['A'] + DF['B']
DF['rate'] = M*DF['A']/(DF['A']+K)*DF['B']
你能帮我转换这个R码吗?
1条答案
按热度按时间2w3kk1z51#
Python的
odeint
不直接支持内部变量的输出,但是可以模拟这种行为。巨蟒
首先创建一个包含所有变量的函数
f2
,为了简单起见,我们也输出时间t
、导数dA
、dB
和状态A
、B
:现在创建一个只返回导数的函数
f
:我们还需要一些时间步长、初始变量和参数。由于OP没有提供值,让我们将其设置为任意值,例如1.0:
现在我们用
odeint
求解模型f
:最后,我们在一个循环中使用所有内部变量运行完整的函数,结果为
odeint
而不是C0
。这个过程本质上就是R的
deSolve::ode
内部处理这个问题的方式,首先它对ode系统进行积分,然后用积分后的状态运行第二遍,以获得内部变量。右
这里为比较一个完整的R代码: