首页 文章

Scipy,odeint和输入到odeint输入功能的设置

提问于
浏览
1

我通过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函数只是忽略了预设的输入:关于如何解决这个问题的任何想法/什么可能出错?我已经尝试从内部手动播种函数,但是至少有一个输入(v)应该在odeint过程中发生变化,这是不行的 .

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)

Function

1 回答

  • 2

    鉴于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)
    

相关问题