没有出现ZeroDivisionError时如何处理RuntimeWarning?

时间:2019-02-10 21:45:49

标签: python numpy matplotlib

我正在使用numpy和matplotlib.pyplot编写一个函数,根据我在旧博客中找到的一些代码生成斜率字段。该代码可以正常工作,但是我正在尝试为其创建函数。该函数采用x和y的范围,频率,最后是dy / dx =(x和y的某些函数)形式的一些微分方程。微分方程本身就是一个函数。当然,根据等式,可以除以零。完成后,我得到一个

RuntimeWarning: divide by zero encountered in double_scalars 

和其余的斜率字段按预期方式显示在pyplot中,而在导致除零的任何坐标上都没有值。在这些坐标处找到方程的实际值超出了简单函数的范围,但是我显然希望处理此类情况。

我用来测试不同方法的微分方程可以在python中描述为:

def fun3(x, y):
    return (x + y) / (x - y)

对于此特定方程式,唯一引起问题的点是点(0,0)。这样,我的函数返回的斜率字段如下:

slope field

(0,0)处没有行,但这不是问题。问题是在显示该字段之前,我得到了上面描述的RuntimeWarning

实际生成该字段的代码在这里:

for j in x:
    for k in y:

        slope = diff(j, k)
        domain = np.linspace(j - 0.07, j + 0.07, 2)

        def fun(x1, y1):
            z = slope * (domain - x1) + y1
            return z

        field += plt.plot(domain, fun(j, k))

其中xy是分别包含x值和y值的ndarray,在此处绘制线,包括在这种情况下为(0,0)。 field是函数返回的结果,该函数是添加到剧情中的艺术家的列表。

我解决此问题的第一个尝试是在分配ZeroDivisionError之前使用以下方法在循环中捕获slope

try:
    diff(j, k)
except ZeroDivisionError:
    continue

diff是上面fun3描述的方程式。但是,这不能产生期望的结果,并且实际上对输出没有任何改变。当我尝试使用类似方法在函数外部重新创建此结果时,

try:
    fun3(0, 0)
except ZeroDivisionError:
    print('oops')

'oops'按预期方式打印。是什么让它与无法使用的函数中的代码不同?最终,它通过调用fun3并检查ZeroDivisionError来完成相同的操作。当嵌套循环最终达到值(0,0)时,如果没有出现ZeroDivisionError,我该如何处理RuntimeWarning

0 个答案:

没有答案