采取单一的ODE步骤

时间:2016-04-24 22:08:58

标签: python scipy ode

是否可以使用scipy ODE集成器执行一个步骤?我知道step scipy.integrate.ode.integrate的{​​{1}}参数,但我无法设定t参数,以确保它只需要一个完整的步骤。显而易见的选择是t=inf,但这会导致ODE失败::

from scipy.integrate import ode
obj = ode(lambda t, y: -y)
obj.set_initial_value(1)
y_new = obj.integrate(inf, step=True)

-

 DVODE--  At T (=R1) and step size H (=R2), the    
       corrector convergence failed repeatedly     
       or with abs(H) = HMIN   
      In above,  R1 =  0.0000000000000D+00   R2 =             Infinity
C:\Anaconda3\lib\site-packages\scipy\integrate\_ode.py:869: UserWarning: 
vode: Repeated convergence failures. (Perhaps bad Jacobian supplied or 
wrong choice of MF or tolerances.)
  'Unexpected istate=%s' % istate))

如果我使用t=0,则ODE根本不会前进。我可以选择一个有限的正数,但是如果t小于整个步骤,那么保证会完全迈出一步并跨越t吗?我正在写一个通用库,不知道典型的步长是多少。

2 个答案:

答案 0 :(得分:0)

数值积分器并非真正按照固定步骤设计,因此即使可能,也很难以这种方式实现目标。您可以通过使用最大和最小步长参数进行捏造来找到方法。 但是,如果您想检查集成商正在做什么,或者将某些日志记录功能附加到集成商流程,您可以这样做:使用set_solout() method

作为参数传递给callable的函数(set_solout()对象)将在每个集成步骤中被调用。

答案 1 :(得分:0)

我做了一些测试,并确认设置step=Truet等于任何正有限数,只需要一步。如果t小于下一步,它将跳过t

from scipy.integrate import ode
obj = ode(lambda t, y: -y)
obj.set_initial_value(1)
while obj.t < 1:
    y_new = obj.integrate(1, step=True)
print(obj.t) # prints 1.037070648009345

需要注意的一点是,自适应步长会根据t的特定分数来猜测初始步长。选择较小的t会导致较小的第一步。这就是为什么inf失败以及为什么没有值t会导致积分器在第一步中跳过t的原因。