[英]Ordinary differential equation - Odeint with unknown initial value in python, jupyter
[英]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.