我正在使用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)。这样,我的函数返回的斜率字段如下:
(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))
其中x
和y
是分别包含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
?