0

我有一个 python 脚本,它在一些参数空间下打印出一个错误:

IntegrationWarning: The occurrence of round-off error is detected, which prevents the requested tolerance from being achieved.  The error may be underestimated.
function_integral = quad(some_function, x_a, x_b, args = (some parameters))[0]

在此代码中,x_b >= x_a,始终,并且 some_function(x) >= 0,始终。因此,function_integral >= 0,总是。或者它应该这样做。

代码继续运行,但是,由于我故意添加的错误(以捕获可能的错误)而崩溃后不久,在这种情况下,需要 function_integral >= 0。我用以下粗略的方法在此处崩溃了此代码:

if function_integral < 0.:
     print("some stuff about the parameters")
     1/0

其中,使用 ipython,然后我使用“调试”进入并探索问题。

当 x_b = x_a + gamma 时,似乎会出现“IntegrationWarning”错误的这种特殊打印输出,其中 gamma 与 x_b 和 x_a 相比非常小。代码中有 x_b = x_a 的情况,在此期间,上面的积分不是必需的,因为在这些情况下,有理由认为 function_integral 应该为零。因此,这里没有使用积分函数。

在舍入错误之后,代码似乎在 function_integral = -1e-11 附近返回一个整数值,因此,基本上为零,但是,它是负数的事实会导致问题(并且舍入错误本身会引起对准确性的关注的代码,如果它要继续运行)。

我可以通过在 x_b 基本上等于 x_a 时设置 function_integral = 0 来绕过这个问题,这对于我的目的可能已经足够了,但是,我想进一步探索这个问题,看看是什么导致它发生在第一名。

出于某种原因,当我在计算积分(以及其他一些事情)并输出/返回其值的函数中添加内置崩溃时,它不会在此处捕获错误。只是在后面的代码中,当 function_integral 用于定义另一个必须 >= 0 的参数时,会发生崩溃(我也是内置的)。

所以,问题是,当 Python 打印出诸如“IntegrationWarning”之类的内置错误之一时,如何使代码崩溃(以调试它)?

编辑:我最终采用了一种快速而肮脏的方法,即如果 x_b = x_a + gamma 则不调用 quad(),其中 gamma 与 x_b 和 x_a 相比较小。对此解决方案并不完全满意,但在这种情况下,它可能就足够了。很想听到调试这种情况的替代方法。

4

1 回答 1

0
import sys

try:
    if function_integral < 0.:
        print("some stuff about the parameters")
except IntegrationWarning:
    sys.exit(1)

当出现“集成错误”时,这应该退出代码

于 2020-11-21T22:47:02.520 回答