是否可以使用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
吗?我正在写一个通用库,不知道典型的步长是多少。
答案 0 :(得分:0)
数值积分器并非真正按照固定步骤设计,因此即使可能,也很难以这种方式实现目标。您可以通过使用最大和最小步长参数进行捏造来找到方法。
但是,如果您想检查集成商正在做什么,或者将某些日志记录功能附加到集成商流程,您可以这样做:使用set_solout()
method。
作为参数传递给callable
的函数(set_solout()
对象)将在每个集成步骤中被调用。
答案 1 :(得分:0)
我做了一些测试,并确认设置step=True
和t
等于任何正有限数,只需要一步。如果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
的原因。