我需要找到系列前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)
答案 0 :(得分:1)
很好地说@NPE,不幸的是,这仍然无法解决问题。
我想提醒你注意这样一个事实:不收敛得足够快,以至于你可以说abs(a) < e
然后y
的精确度是{ {1}}。
这意味着,即使你让你的循环再进行一次迭代,当e
接近e
时,你仍然会比x
精度更少(更少!)。
要解决此问题,您应该将.50
更改为:
while
答案 1 :(得分:0)
您过早停止一次迭代:只要nom / den
低于阈值,就会在y
换句话说,您需要重新构建while
循环。