我正在使用以下函数来近似计算一个点处的函数导数:
def prime_x(f, x, h):
if not f(x+h) == f(x) and not h == 0.0:
return (f(x+h) - f(x)) / h
else:
raise PrecisionError
作为一个测试,我将f
传递为fx
,将x
传递为3.0。其中fx
是:
def fx(x):
import math
return math.exp(x)*math.sin(x)
这有一个导数为exp(x)*(sin(x)+cos(x))
的函数。根据Google和我的计算器:
exp(3)*(sin(3)+cos(3)) = -17.050059
。
到目前为止一切都很好。但是当我试着用小的h
值测试函数时,我得到了以下结果:
print prime_x(fx, 3.0, 10**-5)
-17.0502585578
print prime_x(fx, 3.0, 10**-10)
-17.0500591423
print prime_x(fx, 3.0, 10**-12)
-17.0512493014
print prime_x(fx, 3.0, 10**-13)
-17.0352620898
print prime_x(fx, 3.0, 10**-16)
__main__.PrecisionError: Mantissa is 16 digits
if not a and not b: do this
else: do that
,通常可以改为:if a or b: do that
else: do this
,这样不会让其他人阅读时感到困惑。 - askewchanelse
。您在if
中处理错误情况,然后一旦通过,处理正常情况。 - Mark Ransom