scipy.integrate.ode,函数返回元组的问题
scipy.integrate.ode, issue with function returning tuple
所以我编写了一个函数来使用特定的求解器类型来集成几个 ODE 系统。出于某种原因,我无法完全理解,我编写的用于定义 ODE 的 RHS 的函数在积分函数内 运行 时返回一个元组(或者错误指示),但无论何时我单独测试了它的数组 returns,数组似乎是......嗯......和数组,应该可以正常工作。
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.
求导函数需要 (time, state,...)
作为第一个参数,
def decay(t, u, K_1 = K_1, K_2=K_2, K_3=K_3):
即使 ODE 是自治的。
状态不是参数,尤其是。如果您将状态列表作为参数。
integrator.set_f_params(K_1, K_2, K_3)
通过这些更改,您的代码应该 运行。 (最多 n=8
。)
即使你只是return一个列表
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]]
所以我编写了一个函数来使用特定的求解器类型来集成几个 ODE 系统。出于某种原因,我无法完全理解,我编写的用于定义 ODE 的 RHS 的函数在积分函数内 运行 时返回一个元组(或者错误指示),但无论何时我单独测试了它的数组 returns,数组似乎是......嗯......和数组,应该可以正常工作。
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.
求导函数需要 (time, state,...)
作为第一个参数,
def decay(t, u, K_1 = K_1, K_2=K_2, K_3=K_3):
即使 ODE 是自治的。
状态不是参数,尤其是。如果您将状态列表作为参数。
integrator.set_f_params(K_1, K_2, K_3)
通过这些更改,您的代码应该 运行。 (最多 n=8
。)
即使你只是return一个列表
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]]