在python中解决具有时间相关系数的常微分方程(odeint)

时间:2017-06-15 21:51:08

标签: python dictionary scipy ode

我想使用scipy的odeint函数求解具有15个时间相关系数的7个常微分方程(ODE)系统。

我将系数存储在字典中,以便我可以通过我定义为与odeint()一起使用的函数(func)中的键名来访问它们。系数取决于时间,因此在每个系数的字典中,我称之为函数time_dep(t)。但是,由于我的字典存储在odeint()使用的函数之外,所以我在开始时初始化了一个时间变量t = 0。现在我担心当odeint()分析访问它们时系数保持不变(在t = 0)。

非常感谢任何帮助!

这是一个最小的工作示例的尝试,它不完美,但我打印出系数值,它没有改变,这是我不想要的:):

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

t = 0 

def time_dep(t):
    return (10 * np.exp(-t))

coefficients = {'coeff1' : 1 + time_dep(t)}

def func(state, t, coefficients):
    mrna    = state[0]
    protein = state[1]
    dt_mrna = coefficients['coeff1'] * mrna * protein
    dt_protein = coefficients['coeff1'] * protein
    print(coefficients['coeff1'])
    return[dt_mrna,dt_protein]

state0 = [1,1]
t = np.arange(0,100,0.1)

solve = odeint(func,state0,t,args=(coefficients,))
plt.plot(t,solve)
plt.show()

2 个答案:

答案 0 :(得分:1)

字典应该包含函数而不是评估值(如右图所示):

coefficients = {'coeff1' : lambda x: 1+time_dep(x)}

然后稍后获取该函数并使用正确的时间调用:

dt_mrna = coefficients['coeff1'](t) * mrna * protein

答案 1 :(得分:1)

您已将单个号码1 + time_dep(0)存储为coefficients['coeff1']的值。而不是这样做,将函数本身存储在字典中,并在func()中调用函数。像这样:

coefficients = {'coeff1' : time_dep}

def func(state, t, coefficients):
    mrna    = state[0]
    protein = state[1]
    c1 = 1 + coefficients['coeff1'](t)
    dt_mrna = c1 * mrna * protein
    dt_protein = c1 * protein
    return [dt_mrna, dt_protein]