Scipy、odeint和输入设置成odeint输入函数

Scipy, odeint and setting of input into odeint input function

我正在通过 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 实现中:第一次做这种事情,但是我觉得很奇怪 switch_a 函数只是忽略了预设输入:关于如何解决 this/what 的任何想法都可能出错了?我已经尝试从内部手动为该函数播种,但是由于在 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_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)