Numpy scipy.integrate.ode,函数返回元组时出现问题

Numpy scipy.integrate.ode,函数返回元组时出现问题,numpy,scipy,ode,integrator,Numpy,Scipy,Ode,Integrator,因此,我编写了一个函数,使用特定的解算器类型来集成一对ODE系统。出于某种原因,我无法完全理解,我编写的用于定义ODE RHS的函数在集成函数中运行时返回一个元组(或者错误指示的那样),但每当我测试它单独返回的数组时,数组似乎…嗯。。。和数组,应该可以正常工作 def solve_decay_system(t, u_0, solver_type="dopri5", K_1=0.0, K_2=0.0, K_3=0.0): def decay(u, K_1 = K_1, K_2=K_2,

因此,我编写了一个函数,使用特定的解算器类型来集成一对ODE系统。出于某种原因,我无法完全理解,我编写的用于定义ODE RHS的函数在集成函数中运行时返回一个元组(或者错误指示的那样),但每当我测试它单独返回的数组时,数组似乎…嗯。。。和数组,应该可以正常工作

def solve_decay_system(t, u_0, solver_type="dopri5", K_1=0.0, K_2=0.0, K_3=0.0):

    def decay(u, K_1 = K_1, K_2=K_2, K_3=K_3):

        dydt = numpy.array([-K_1 * u[0], K_1 * u[0] - K_2 * u[1], K_2 * u[1] - K_3*u[2], K_3*u[2]])
        dydt = numpy.array(dydt)
        print dydt, type(dydt)
        return dydt
        #return [1, 2, 3, 4]

    u = numpy.empty((4, t.size))
    u_0 = numpy.array([1.0, 0.0, 0.0, 0.0])
    u[0, 0] = u_0[0]
    u[1, 0] = u_0[1]
    u[2, 0] = u_0[2]
    u[3, 0] = u_0[3]

    integrator = integrate.ode(decay)
    integrator.set_integrator(solver_type)
    integrator.set_initial_value(u[:, 0])
    integrator.set_f_params(u, K_1, K_2, K_3)

    for (n, t_n) in enumerate(t[1:]):
        print n
        integrator.integrate(t_n)
        if not integrator.successful():
            break

        u[:, n + 1] = integrator.y


    return u
任何关于如何解决这一问题的建议都将非常有用。以下是结果错误,供参考:

ValueError                                Traceback (most recent call last)
<ipython-input-230-8f9be46c3d95> in <module>()
----> 1 solve_decay_system(t, u_0, solver_type="dopri5", K_1=0.0, K_2=0.0,     K_3=0.0)

<ipython-input-229-a05ddca0f334> in solve_decay_system(t, u_0, solver_type,     K_1, K_2, K_3)
     24     for (n, t_n) in enumerate(t[1:]):
     25         print n
---> 26         integrator.integrate(t_n)
     27         if not integrator.successful():
     28             break

C:\Users\Ben\Anaconda2\lib\site-packages\scipy\integrate\_ode.pyc in     integrate(self, t, step, relax)
    409         except SystemError:
    410             # f2py issue with tuple returns, see ticket 1187.
--> 411             raise ValueError('Function to integrate must not return     a tuple.')
    412 
    413         return self._y

ValueError: Function to integrate must not return a tuple.
ValueError回溯(最近一次调用)
在()
---->1求解衰变系统(t,u_0,solver_type=“dopri5”,K_1=0.0,K_2=0.0,K_3=0.0)
在求解衰变系统中(t,u,0,解算器类型,K,1,2,3)
24对于枚举(t[1:])中的(n,tn):
25印刷品
--->26积分器。集成(t_n)
27如果不是integrator.successful():
28休息
C:\Users\Ben\Anaconda2\lib\site packages\scipy\integrate\\u ode.pyc in integrate(self、t、step、relax)
409系统错误除外:
410#f2py问题与元组返回,见票证1187。
-->411 raise VALUERROR('要集成的函数不能返回元组')
412
413返回自我
ValueError:要集成的函数不能返回元组。

导数函数期望
(时间、状态等)
作为第一个参数

def decay(t, u, K_1 = K_1, K_2=K_2, K_3=K_3):
即使颂歌是自主的

状态不是参数,特别是如果您将状态列表作为参数

  integrator.set_f_params(K_1, K_2, K_3)
通过这些更改,您的代码应该可以运行。(最多
n=8

即使你只是返回一个列表

def decay(t, u, K_1 = K_1, K_2=K_2, K_3=K_3):
    return  [-K_1 * u[0], K_1 * u[0] - K_2 * u[1], K_2 * u[1] - K_3*u[2], K_3*u[2]]

你会用什么输入来调用解衰变系统?我这样叫它:
t=numpy.linspace(0.0,10.0,10)u\u 0=numpy.array([1.0,0.0,0.0,0.0,0.0])解衰变系统(t,u\u 0,solver\u type=“dopri5”,K\u 1=0.0,K\u 2=0.0,K\u 3=0.0)