Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy scipy ODE,当NSTEP超过时会发生什么?_Numpy_Scipy_Ode_Numerical Integration - Fatal编程技术网

Numpy scipy ODE,当NSTEP超过时会发生什么?

Numpy scipy ODE,当NSTEP超过时会发生什么?,numpy,scipy,ode,numerical-integration,Numpy,Scipy,Ode,Numerical Integration,我在数百万个案例中使用scipy ode进行数值积分,偶尔会出现错误: 此调用中完成的工作过多(可能是错误的Dfun类型) 我增加了相当多的NSTEP(500000),并且还尝试为“僵硬”问题指定BDF方法,如前所述 我的问题是:发生这种情况时会发生什么?集成运行被抛出了吗?或者,我能强迫它被扔掉吗?我不在乎是否会丢失数百万次运行中的几次,但我不希望数据被污染。发生此错误时,返回值是可疑的。作为一个测试用例,我试着用10个步骤将dy/dt=y从0积分到1: from scipy.integrat

我在数百万个案例中使用scipy ode进行数值积分,偶尔会出现错误:

此调用中完成的工作过多(可能是错误的Dfun类型)

我增加了相当多的NSTEP(500000),并且还尝试为“僵硬”问题指定BDF方法,如前所述


我的问题是:发生这种情况时会发生什么?集成运行被抛出了吗?或者,我能强迫它被扔掉吗?我不在乎是否会丢失数百万次运行中的几次,但我不希望数据被污染。

发生此错误时,返回值是可疑的。作为一个测试用例,我试着用10个步骤将dy/dt=y从0积分到1:

from scipy.integrate import ode
r = ode(lambda t, y: y).set_initial_value(1, 0).set_integrator('lsoda', nsteps=10)
print(r.integrate(1))
这将打印带有警告的
[1.40213975]
“此调用完成的工作量过多(可能是错误的Dfun类型)”。返回值显然是错误的:精确解是
exp(1)=2.718…
当达到nsteps时,积分过程似乎确实停止了,此时找到的任何y都会返回,即使它不是y(1)

您可以通过在
r.integrate
之后调用
r.successful()
来检测此问题:如果返回False,则最近的步骤失败

增加nsteps(这里50就足够了)可以消除警告并返回正确的值


旁白:考虑使用<代码> SovivIVP<代码>,这消除了对旧代码< ODE < /C> >方法的一些微观管理(在<代码> SoviyIVP)中没有<代码> NSTROP> <代码>选项。 好的,那么澄清一下,集成实际上并没有在nsteps停止,它一直在进行,直到它完成,并且只是在nsteps上抛出警告?重新阅读代码,它在到达nsteps时终止,所以我的答案是错误的。请参阅修订版。好的,谢谢。那么,有没有一种方法可以抛弃这种整合呢?或者我可以捕捉到这个警告并手动将其抛出?另一方面,我仍然在使用旧的ODE,因为我需要根据位置而不是时间(参见我前面的问题:)退出,只需在每次

r.integrate
后检查
r.successful()
。在答案中编辑。
from scipy.integrate import ode
r = ode(lambda t, y: y).set_initial_value(1, 0).set_integrator('lsoda', nsteps=10)
print(r.integrate(1))