系列计算精度

时间:2017-09-05 14:30:29

标签: python precision calculation

我需要找到系列前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)

2 个答案:

答案 0 :(得分:1)

很好地说@NPE,不幸的是,这仍然无法解决问题。

我想提醒你注意这样一个事实:收敛得足够快,以至于你可以说abs(a) < e然后y的精确度是{ {1}}。

这意味着,即使你让你的循环再进行一次迭代,当e接近e时,你仍然会比x精度更少(更少!)。

要解决此问题,您应该将.50更改为:

while

答案 1 :(得分:0)

您过早停止一次迭代:只要nom / den低于阈值,就会在y

换句话说,您需要重新构建while循环。