2016-04-24 69 views
0

是否有可能采用scipy ODE集成商的单一步骤?我知道step参数为scipy.integrate.ode.integrate,但我不知道如何设置t这个参数,以保证它完全采用一个完整的步骤。最明显的选择是t=inf,而是给出了一个ODE失败::以单一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?我正在写一个普通图书馆,不知道典型的步长是多少。

回答

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

0

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

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

+0

我不是在寻找一个固定的步骤。但即使是可变步骤求解器仍然有步骤(传递给'set_selout'的函数在每个之后都被调用)。我会尝试从selout函数返回'-1'来做我想做的事。 – drhagen

+0

是的,这就是我的答案的重点:'set_selout'是你可能想要的,但你的问题是关于用集成器执行一个步骤。 – Cyb3rFly3r

+0

“数值积分器的设计并不是按照固定步骤设计的” - 它取决于方法。例如,明确的[Runge-Kutta](https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods)使用固定步长。 – dkv