如何将tan x的麦克劳林级数公式转为Python代码?计算第n项结果错误
代码问题梳理
- 最直接的错误是
pn函数没有返回值:累加计算完成后没有return语句,调用函数只会得到None,无法输出有效结果。 - 循环范围错误:原代码用
range(n)遍历i,i从0开始时对应项计算结果为0无意义,且最终仅累加了前n-1个有效项,和预期的前n项逻辑不符。 - 变量名不规范:使用Python内置函数名
sum作为累加变量,属于不良实践,可能导致后续调用内置sum函数时出现异常。 - 功能匹配偏差:如果你的需求是计算单第n项,原代码是前n项累加逻辑,和需求不符。
- 隐式约束缺失:tan x的麦克劳林级数收敛域为
|x| < π/2,如果输入x超出该范围,级数会发散得到完全错误的结果;n取值过大时,伯努利数、阶乘的计算会出现浮点数精度溢出,导致结果偏差。
你使用的系数逻辑是正确的,对应麦克劳林级数公式:
[ \tan x = \sum_{n=1}^{\infty} \frac{(-1)^{n-1} 2{2n}(2{2n}-1) B_{2n}}{(2n)!} x^{2n-1} \quad (|x|<\frac{\pi}{2}) ]
其中(B_{2n})为第2n个伯努利数,你的系数(-4**i) * (1 - 4**i)和公式中的((-1){n-1}2{2n}(2^{2n}-1))等价。
修正后代码
版本1:计算前n项的tanx近似值
import math def bernoulli(m): if m == 0: return 1 t = 0 for k in range(m): t += math.comb(m, k) * bernoulli(k) / (m - k + 1) return 1 - t def tan_approx(n_terms, x): # 收敛域校验 if abs(x) >= math.pi / 2: raise ValueError("x需满足|x| < π/2,否则级数发散") total = 0 # 从i=1到n_terms遍历,累加前n_terms个有效项 for i in range(1, n_terms + 1): b_2i = bernoulli(2 * i) term = (b_2i / math.factorial(2 * i)) * (-4 ** i) * (1 - 4 ** i) * (x ** (2 * i - 1)) total += term return total
测试示例:
# 计算pi/4的tan值,理论值为1 x = math.pi / 4 print("级数近似结果:", tan_approx(5, x)) print("标准库计算结果:", math.tan(x))
版本2:单独计算第n项
def tan_nth_term(n, x): if abs(x) >= math.pi / 2: raise ValueError("x需满足|x| < π/2,否则级数发散") if n < 1: raise ValueError("n需为大于等于1的正整数") b_2n = bernoulli(2 * n) return (b_2n / math.factorial(2 * n)) * (-4 ** n) * (1 - 4 ** n) * (x ** (2 * n - 1))
内容的提问来源于stack exchange,提问作者BUCKSHOT
相关产品推荐
相关产品推荐

