我正在制作一个功能,可以反复测试另一个功能,以便在用户提供的容差范围内获取值。在需要更多迭代以达到给定容差范围内的情况下,我试图让它打印错误消息,但是这条消息从未打印过,我无法弄清楚原因。
from math import e
def ctrapezoidal(f,a,b,n):
h=((b-a)/n)
y = (h/2)*(f(a)+f(b))
for x in range(n-1):
p = a + ((x+1)/n)*(b-a)
y = y + h*(f(p))
return y
def ctrap(f,a,b,n,tol):
for x in range(n):
if x is 0:
continue
elif x is 1:
continue
elif x is (n-1):
if abs((ctrapezoidal(f,a,b,x)) - (ctrapezoidal(f,a,b,(x-1)))) < tol:
print("The integral of the function between",a,"and",b,"approximates to",ctrapezoidal(f,a,b,x),"with a tolerance of",tol)
break
else:
print("The approximation needs more iterations to calculate the integral to the given tolerance.")
#This error never shows, even when given too few iterations to compute.
#The if-statement works, though, since I've tried with values
#of n one integer higher than the needed number of iterations.
else:
if abs((ctrapezoidal(f,a,b,x)) - (ctrapezoidal(f,a,b,(x-1)))) < tol:
print("The integral of the function between",a,"and",b,"approximates to",ctrapezoidal(f,a,b,x),"with a tolerance of",tol,". This calculation took",x,"iterations.")
break
else:
continue
def g(x):
y = 2*e**(2*x) + 2*x
return y
ctrap(g,1,5,1331,1.e-4)
这就是我所写的。最后一行中给定的n值是ctrap适当的最低值。 有什么想法吗?
答案 0 :(得分:1)
问题来自
行 elif x is (n-1):
当你使用is
进行比较时,Python测试左侧和右侧以查看它们是否代表字面上相同的对象。例如,它可能会比较它们的内存地址。但是,具有相同数值的两个整数通常不会是同一个对象。你可以通过启动解释器并运行
>>> 1331 is (1330 + 1)
False
这表明在代码中编写1331
时得到的整数对象与编写1330 + 1
时得到的整数对象不同,即使它们具有相同的数值。这就是你的比较失败的原因;你有不同的对象代表相同的整数,你正在测试对象相等而不是数字相等。
使用==
代替测试数字相等。
>>> 1331 == (1330 + 1)
True
请注意,Python的标准实现会将整数对象缓存到256个并包含256个,因此每个值只有一个实例。因此,最多256的整数也将比较对象相等:
>>> 256 is (255 + 1)
True
>>> 257 is (256 + 1)
False
但是,你不应该依赖于此。