Python 3 error "Overflow error: (34, 'Numerical result out of range')
Python 3 error "Overflow error: (34, 'Numerical result out of range')
我认为类似的问题已经回答 and here。
对于执行梯形和辛普森 1by3 规则的代码,我也遇到了类似的问题。我有 运行 桌面上的代码运行良好,但使用不同的机器时,代码失败。
我正在分享代码和错误消息。
代码
import numpy as np
exp = 5.33333
ul = 10
ll = -10
n = 50
def f(x): # The function
return np.e**x**2
def trapezoidal(ll, ul, n): #Setting up Trapezoidal rule
traint = (f(ll) + f(ul)) / 2
h = (ul - ll) / 2
for i in range(1,n):
k = ll + i * h
traint = traint + f(k)
traint = h * traint
return traint
def simpson1by3(ll, ul, n): #Setting up Simpson 1by3 rule
simint = (f(ll) + f(ul)) / 2
h = (ul - ll) / 2
for i in range(1,n,2):
simint = simint + (2 * f(ll + i * h)) + (4 * f(ll + ((i + 1) * h)))
simint = simint * h / 3
return simint
res_sim = simpson1by3(ll, ul, n)
res_trap = trapezoidal(ll, ul, n)
e_rel_trap = (res_trap - exp) / exp
e_rel_simp = (res_simp - exp) / exp
f1 = open("trap.txt", "w+")
f2 = open("simp.txt", "w+")
for n in range(1,50):
h = (ul - ll) / 2
res_trap = trapezoidal(ll, ul, n)
res_simp = simpson1by3(ll, ul, n)
f1.write(str(n) + " " + str(res_trap) + '\n')
f2.write(str(n) + " " + str(res_simp) + '\n')
f1.close()
f2.close()
错误信息是,
Traceback (most recent call last):
File "simpson1by3+trapezoidal.py", line 30, in <module>
res_sim = simpson1by3(ll, ul, n)
File "simpson1by3+trapezoidal.py", line 26, in simpson1by3
simint = simint + (2 * f(ll + i * h)) + (4 * f(ll + ((i + 1) * h)))
File "simpson1by3+trapezoidal.py", line 11, in f
return np.e**x**2
OverflowError: (34, 'Numerical result out of range')
这主要是由于您本地机器的限制。
你看,python 只为整数和浮点数分配了一定数量的 space
int
通常是4,float
.
通常是8
在您的代码中,您已使用 f
将数据类型设置为 float
您的计算机无法处理占用 16 字节内存的此类计算,
如果您确定您的计算或输入中没有任何小数,
您可以将数据类型更改为整数。对于输入,如果它仍然不起作用,请考虑同时更改答案的数据类型/
希望对您有所帮助
看来你的积分区间设置有误。如果我没记错的话,间隔应该像 (b-a)/2n,即 ul-ll/n
或 ul-ll/2n
取决于您的设置,而不是 ul-ll/2
。将间隔设置为 ul-ll/2
会使您的实际积分上限太大,并且对于像 e**x**2 这样的函数,它会溢出最大 Pythonic float 范围(大约 1.8e308 == 2^1024 ==我机器上的 FP256 MAX)
我认为类似的问题已经回答
代码
import numpy as np
exp = 5.33333
ul = 10
ll = -10
n = 50
def f(x): # The function
return np.e**x**2
def trapezoidal(ll, ul, n): #Setting up Trapezoidal rule
traint = (f(ll) + f(ul)) / 2
h = (ul - ll) / 2
for i in range(1,n):
k = ll + i * h
traint = traint + f(k)
traint = h * traint
return traint
def simpson1by3(ll, ul, n): #Setting up Simpson 1by3 rule
simint = (f(ll) + f(ul)) / 2
h = (ul - ll) / 2
for i in range(1,n,2):
simint = simint + (2 * f(ll + i * h)) + (4 * f(ll + ((i + 1) * h)))
simint = simint * h / 3
return simint
res_sim = simpson1by3(ll, ul, n)
res_trap = trapezoidal(ll, ul, n)
e_rel_trap = (res_trap - exp) / exp
e_rel_simp = (res_simp - exp) / exp
f1 = open("trap.txt", "w+")
f2 = open("simp.txt", "w+")
for n in range(1,50):
h = (ul - ll) / 2
res_trap = trapezoidal(ll, ul, n)
res_simp = simpson1by3(ll, ul, n)
f1.write(str(n) + " " + str(res_trap) + '\n')
f2.write(str(n) + " " + str(res_simp) + '\n')
f1.close()
f2.close()
错误信息是,
Traceback (most recent call last):
File "simpson1by3+trapezoidal.py", line 30, in <module>
res_sim = simpson1by3(ll, ul, n)
File "simpson1by3+trapezoidal.py", line 26, in simpson1by3
simint = simint + (2 * f(ll + i * h)) + (4 * f(ll + ((i + 1) * h)))
File "simpson1by3+trapezoidal.py", line 11, in f
return np.e**x**2
OverflowError: (34, 'Numerical result out of range')
这主要是由于您本地机器的限制。
你看,python 只为整数和浮点数分配了一定数量的 space
int
通常是4,float
.
在您的代码中,您已使用 f
您的计算机无法处理占用 16 字节内存的此类计算, 如果您确定您的计算或输入中没有任何小数, 您可以将数据类型更改为整数。对于输入,如果它仍然不起作用,请考虑同时更改答案的数据类型/
希望对您有所帮助
看来你的积分区间设置有误。如果我没记错的话,间隔应该像 (b-a)/2n,即 ul-ll/n
或 ul-ll/2n
取决于您的设置,而不是 ul-ll/2
。将间隔设置为 ul-ll/2
会使您的实际积分上限太大,并且对于像 e**x**2 这样的函数,它会溢出最大 Pythonic float 范围(大约 1.8e308 == 2^1024 ==我机器上的 FP256 MAX)