繁体   English   中英

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

[英]solve ordinary differential equation with time dependent coefficients in 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()

字典应包含函数,而不应包含评估值(目前):

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

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

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

您已将单个数字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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM