在Python中使用odeint求解时间相关系数的普通微分方程

4
我想使用scipy的odeint函数解决一个包含7个常微分方程(ODEs)和15个时间相关系数的系统。我将这些系数存储在字典中,以便在定义的函数(func)中使用odeint()时可以通过键名访问它们。这些系数取决于时间,在每个系数的字典中,我调用了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个回答

1
字典应该包含函数而不是已经被计算出来的值(就像现在这样):
coefficients = {'coeff1' : lambda x: 1+time_dep(x)}

然后稍后获取函数并使用正确的时间进行调用:
dt_mrna = coefficients['coeff1'](t) * mrna * protein

不错的回答。除了使用lambda避免额外的函数之外,在您看来,使用字典而不是仅定义相关函数并从func()内部调用它们的特定原因是什么? - Colin

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接