级数计算精度
Series calculation precision
我需要找到系列的前 N 个元素的总和以满足某个精度 e(例如 10^-3):
y = -(2x + (2x)^2/2 + (2x)^3/3 + ...)
y 的精确总和为 log(1 - 2*x)。
我在python中写了一个程序,但是在设置精度的情况下,sum 和 log 之间的差异 W 不为零(在某些样本中,最后一位有效数字为 1 或 2)。
from math import log
def y_func(x, e):
y = 0
nom = 2*x
den = 1
a = nom / den
while abs(a) > e:
y -= a
den += 1
nom *= 2*x
a = nom / den
return y
def main(p):
print(('{:{width}}'*4).format('X','Y','Z','W',width = 14))
prec = 10**-p
x = -.25
xk = .35
h = .05
while x <= xk:
Y = y_func(x, prec)
Z = log(1-2*x)
W = Y - Z
print(('{:<{width}.{prec}f}'*4).format(x, Y, Z, W, \
prec = p, width = 14))
x += h
if __name__ == "__main__":
main(3)
您过早地停止了一次迭代:一旦 nom / den
低于阈值,您就停止了,但在您从 y
[=18 中减去它之前=].
换句话说,您需要重组 while
循环。
说得好@NPE,不幸的是,这仍然不能解决问题。
我想提请您注意这样一个事实,即这样的级数 不会 收敛得足够快,以至于您可以说如果 abs(a) < e
那么 y
的精度是 e
.
这意味着即使您让循环再执行一次迭代,当 x
接近 .50
时,您的精度仍然会低于(少得多!)e
。
要一劳永逸地解决这个问题,您应该将 while
更改为:
while abs(y - log(1-2*x)) >= e: # > or >= depending on what you need
# y = ...
我需要找到系列的前 N 个元素的总和以满足某个精度 e(例如 10^-3):
y = -(2x + (2x)^2/2 + (2x)^3/3 + ...)
y 的精确总和为 log(1 - 2*x)。
我在python中写了一个程序,但是在设置精度的情况下,sum 和 log 之间的差异 W 不为零(在某些样本中,最后一位有效数字为 1 或 2)。
from math import log
def y_func(x, e):
y = 0
nom = 2*x
den = 1
a = nom / den
while abs(a) > e:
y -= a
den += 1
nom *= 2*x
a = nom / den
return y
def main(p):
print(('{:{width}}'*4).format('X','Y','Z','W',width = 14))
prec = 10**-p
x = -.25
xk = .35
h = .05
while x <= xk:
Y = y_func(x, prec)
Z = log(1-2*x)
W = Y - Z
print(('{:<{width}.{prec}f}'*4).format(x, Y, Z, W, \
prec = p, width = 14))
x += h
if __name__ == "__main__":
main(3)
您过早地停止了一次迭代:一旦 nom / den
低于阈值,您就停止了,但在您从 y
[=18 中减去它之前=].
换句话说,您需要重组 while
循环。
说得好@NPE,不幸的是,这仍然不能解决问题。
我想提请您注意这样一个事实,即这样的级数 不会 收敛得足够快,以至于您可以说如果 abs(a) < e
那么 y
的精度是 e
.
这意味着即使您让循环再执行一次迭代,当 x
接近 .50
时,您的精度仍然会低于(少得多!)e
。
要一劳永逸地解决这个问题,您应该将 while
更改为:
while abs(y - log(1-2*x)) >= e: # > or >= depending on what you need
# y = ...