You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:24:07