Python计算级数A、B时A²+B²结果异常的问题排查
级数计算错误排查
要计算两个级数:
- ( A = \frac{x^1}{1!} - \frac{x^3}{3!} + \frac{x^5}{5!} - ... - \frac{x^{51}}{51!} )
- ( B = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - ... - \frac{x^{50}}{50!} )
根据数学原理,( A^2 + B^2 ) 应近似等于1,但运行以下代码后得到2.xxxxxx的结果,需排查错误:
def factorial(n): fac = 1 for i in range(2, n+1): fac *= i return fac def calcA(x): c = True A = 0 for i in range(1, 51, 2): if c: A += (x**i)/factorial(i) else: A -= (x**i)/factorial(i) c = not c return A def calcB(x): B = 1 c = False for i in range(2, 50, 2): if c: B += (x**i)/factorial(i) else: B -= (x**i)/factorial(i) c = not c return B
错误原因分析
代码的核心问题是循环范围未包含级数的最后一项,导致A和B的计算值偏离预期:
- calcA的循环范围错误:原级数要求计算到 ( -\frac{x^{51}}{51!} ),但
range(1, 51, 2)是左闭右开区间,只会生成1、3、…、49,漏掉了51这一项。 - calcB的循环范围错误:原级数要求计算到 ( -\frac{x^{50}}{50!} ),但
range(2, 50, 2)只会生成2、4、…、48,漏掉了50这一项。
这两个遗漏导致A和B的实际计算值与理论值偏差,最终平方和远大于1。
修正后的代码
def factorial(n): fac = 1 for i in range(2, n+1): fac *= i return fac def calcA(x): c = True A = 0 # 修正循环范围,包含51 for i in range(1, 52, 2): if c: A += (x**i)/factorial(i) else: A -= (x**i)/factorial(i) c = not c return A def calcB(x): B = 1 c = False # 修正循环范围,包含50 for i in range(2, 51, 2): if c: B += (x**i)/factorial(i) else: B -= (x**i)/factorial(i) c = not c return B
修正后,A和B会完整计算到指定的最后一项,此时 ( A^2 + B^2 ) 的结果会近似等于1,符合数学预期。
内容的提问来源于stack exchange,提问作者user20358901
相关产品推荐
相关产品推荐

