2016-11-06 7 views
0

Итак, я написал функцию, использующую конкретный тип решателя для интеграции пары систем ODE. По какой-то причине, с которой я не могу справиться, функция, которую я написал для определения RHS ODE, возвращает кортеж при запуске внутри интегрирующей функции (или, соответственно, указывает ошибка), но всякий раз, когда я проверяю массив он возвращается отдельно, массив кажется ... хорошо ... и массив, который должен работать нормально.scipy.integrate.ode, проблема с возвратом возвращаемых функций

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. 
+0

С какой вклад вы звоните 'solve_decay_system'? – Wrzlprmft

+0

Я называю это таким образом: 'т = numpy.linspace (0,0, 10,0, 10) u_0 = numpy.array ([1,0, 0,0, 0,0, 0,0]) solve_decay_system (т, u_0, solver_type = "dopri5" , K_1 = 0,0, K_2 = 0,0, K_3 = 0,0) ' – BenL

ответ

1

Производная функция ожидает (time, state,...) в качестве первых аргументов,

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]]