在 Python 中求解具有时间相关系数的常微分方程 (ODEINT)



我想使用 scipy 的 odeint 函数求解一个由 7 个常微分方程 (ODE( 组成的系统,具有 15 个随时间变化的系数。

我将系数存储在字典中,以便我可以通过我定义为与 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()

您已将单个数字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]
<</div> div class="one_answers">

字典应该包含函数,而不是计算值(就像现在一样(:

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

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

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

最新更新