Python Scipy、odeint和odeint输入函数的输入设置
我通过odeint(见下图)集成生化ODE,但是调用时,主输入函数似乎是用奇怪的数字重新设置(或替换)输入参数。尽管参数“iu”(v的感应率,在整个过程中应保持不变)和“v”(结果之一,在整个odeint中应变化)分别设置为100和0,但如果在整个功能中打印,输出似乎为:Python Scipy、odeint和odeint输入函数的输入设置,python,function,scipy,ode,Python,Function,Scipy,Ode,我通过odeint(见下图)集成生化ODE,但是调用时,主输入函数似乎是用奇怪的数字重新设置(或替换)输入参数。尽管参数“iu”(v的感应率,在整个过程中应保持不变)和“v”(结果之一,在整个odeint中应变化)分别设置为100和0,但如果在整个功能中打印,输出似乎为: '0.000999900009999 100 0 0 10 9 2 2 3' 虽然它看起来更像这样: '0 0 0 100 10 9 2 2 3' 我不确定错误是在我的初始函数中,还是在我的odeint实现中:第一次做这种
'0.000999900009999 100 0 0 10 9 2 2 3'
虽然它看起来更像这样:
'0 0 0 100 10 9 2 2 3'
我不确定错误是在我的初始函数中,还是在我的odeint实现中:第一次做这种事情,但是我发现奇怪的是,switch_a函数忽略了预设输入:关于如何解决这个问题的想法/可能出了什么问题?我已经尝试从内部手动为函数设置种子,但是在odeint过程中,至少有一个输入(v)应该发生变化,这是行不通的
initial = np.array([0,0])#sets initial
#parameters
iv = 0
iu= 100
u = 0
v = 0
au = 10
av = 9
b=2
n=2
k=3
def switch_a(initial, timepool, u, v, iv, iu , au , av ,b , n , k ):
zu = (1+iv/k)**n #to simplify equation
zv = (1+ iu/k)**n
u = -u + (au/(1+((v/zu)**b)))
print (u, v, iv, iu, au, av, b, n, k)
v = -v + (av/(1+((u/zv)**b)))
res = np.array([u, v])
return res
args = (iv, iu, u, v, au, av, b, n, k)
timepool = np.linspace (1, 50, 50)
solution1a = sp.odeint (switch_a, initial, timepool,args)
假设u和v是这个方程组中的动力学变量,它们应该进入
switch\u a
函数的第一个参数,而不是后面的参数。我认为这可能更接近你想要做的事情:
def switch_a(variables, timepool, iv, iu , au , av ,b , n , k ):
u, v = variables
zu = (1+iv/k)**n #to simplify equation
zv = (1+ iu/k)**n
u2 = -u + (au/(1+((v/zu)**b)))
print (u, v, iv, iu, au, av, b, n, k)
v2 = -v + (av/(1+((u/zv)**b)))
res = np.array([u2, v2])
return res
args = (iv, iu, au, av, b, n, k)
timepool = np.linspace (1, 50, 50)
solution1a = sp.odeint (switch_a, initial, timepool, args)
您完全正确:函数似乎在这种形式下工作!谢谢ODE函数的格式是
derivs(state,time,params)
,其中time
实际上是一个时间,而不是要从解决方案中获取样本的完整时间列表。如果您在某个时刻使用ODE函数中的时间,这种更精确的命名可能有助于获得更好的直觉。