级数计算精度

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 = ...