我怎么能创建一个 "RuntimeWarning: invalid value encountered in double_scalars" 除外?
How could I create an except for "RuntimeWarning: invalid value encountered in double_scalars"?
我正在研究数值推导,并试验 Δx 的值在 python 中可以有多小。我知道使用 np.linspace(0, 1, 1000)
会创建四舍五入为 0 的值。为了防止我原本干净的输出 window 显示错误消息,我试过这个:
try:
#do the numeric derivation
except RuntimeWarning:
#do something else
else:
#the actual function of the program
但是当我 运行 时,我仍然收到以下消息:
RuntimeWarning: invalid value encountered in double_scalars
那么,有没有办法让我排除那个确切的警告?我也尝试排除整个警告文本(例如,从运行时到 _scalars),但没有任何效果。
这是我的程序
import numpy as np
import matplotlib.pyplot as plt
xValue = np.linspace(0, 5, 5)
ΔxValues = np.linspace(0, 1, 1000)
def f(x):
return x**2 + 2*x + 4
def fDerN(x, Δx):
return (f(x + Δx) - f(x))/Δx
def fDerA(x):
return 2*x + 2
difference1, difference2, difference3, difference4, difference5= [], [], [], [], []
for Δx in ΔxValues:
try:
fDerN(1, Δx)
fDerN(2, Δx)
fDerN(3, Δx)
fDerN(4, Δx)
fDerN(5, Δx)
except RuntimeWarning:
hasBeenWarning = True #Just to have an indented piece of code
else:
difference1.append(abs(fDerN(1, Δx) - fDerA(1)))
difference2.append(abs(fDerN(2, Δx) - fDerA(2)))
difference3.append(abs(fDerN(3, Δx) - fDerA(3)))
difference4.append(abs(fDerN(4, Δx) - fDerA(4)))
difference5.append(abs(fDerN(5, Δx) - fDerA(5)))
plt.plot(ΔxValues, difference1, label="x = 1")
plt.plot(ΔxValues, difference2, label="x = 2")
plt.plot(ΔxValues, difference3, label="x = 3")
plt.plot(ΔxValues, difference4, label="x = 4")
plt.plot(ΔxValues, difference5, label="x = 5")
plt.title("Difference between numeric and algebraic derivation for different values of x og Δx")
plt.grid()
plt.legend()
plt.show()
如果这行得通,那是因为我把它翻译成英文了。
您将 ΔxValues
定义为 np.linspace(0, 1, 1000)
。问题是在
def fDerN(x, Δx):
return (f(x + Δx) - f(x))/Δx
你除以 Δx
。 ΔxValues
中第一个数是0,显然会出现被0除的错误。
print(ΔxValues[0])
# 0.0
通过重新定义 ΔxValues
或简单地使用 ΔxValues[1:]
来规避此问题
要在 try/except 中捕获警告,就好像它是错误一样,您可以使用警告模块中的 filterwarnings。
import warnings
warnings.filterwarnings("error")
我正在研究数值推导,并试验 Δx 的值在 python 中可以有多小。我知道使用 np.linspace(0, 1, 1000)
会创建四舍五入为 0 的值。为了防止我原本干净的输出 window 显示错误消息,我试过这个:
try:
#do the numeric derivation
except RuntimeWarning:
#do something else
else:
#the actual function of the program
但是当我 运行 时,我仍然收到以下消息:
RuntimeWarning: invalid value encountered in double_scalars
那么,有没有办法让我排除那个确切的警告?我也尝试排除整个警告文本(例如,从运行时到 _scalars),但没有任何效果。
这是我的程序
import numpy as np
import matplotlib.pyplot as plt
xValue = np.linspace(0, 5, 5)
ΔxValues = np.linspace(0, 1, 1000)
def f(x):
return x**2 + 2*x + 4
def fDerN(x, Δx):
return (f(x + Δx) - f(x))/Δx
def fDerA(x):
return 2*x + 2
difference1, difference2, difference3, difference4, difference5= [], [], [], [], []
for Δx in ΔxValues:
try:
fDerN(1, Δx)
fDerN(2, Δx)
fDerN(3, Δx)
fDerN(4, Δx)
fDerN(5, Δx)
except RuntimeWarning:
hasBeenWarning = True #Just to have an indented piece of code
else:
difference1.append(abs(fDerN(1, Δx) - fDerA(1)))
difference2.append(abs(fDerN(2, Δx) - fDerA(2)))
difference3.append(abs(fDerN(3, Δx) - fDerA(3)))
difference4.append(abs(fDerN(4, Δx) - fDerA(4)))
difference5.append(abs(fDerN(5, Δx) - fDerA(5)))
plt.plot(ΔxValues, difference1, label="x = 1")
plt.plot(ΔxValues, difference2, label="x = 2")
plt.plot(ΔxValues, difference3, label="x = 3")
plt.plot(ΔxValues, difference4, label="x = 4")
plt.plot(ΔxValues, difference5, label="x = 5")
plt.title("Difference between numeric and algebraic derivation for different values of x og Δx")
plt.grid()
plt.legend()
plt.show()
如果这行得通,那是因为我把它翻译成英文了。
您将 ΔxValues
定义为 np.linspace(0, 1, 1000)
。问题是在
def fDerN(x, Δx):
return (f(x + Δx) - f(x))/Δx
你除以 Δx
。 ΔxValues
中第一个数是0,显然会出现被0除的错误。
print(ΔxValues[0])
# 0.0
通过重新定义 ΔxValues
或简单地使用 ΔxValues[1:]
要在 try/except 中捕获警告,就好像它是错误一样,您可以使用警告模块中的 filterwarnings。
import warnings
warnings.filterwarnings("error")