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

Python中不使用Sympy用幂级数实现第一类贝塞尔函数结果不符问题

第一类贝塞尔函数幂级数实现错误排查

你的代码和标准第一类贝塞尔函数的幂级数公式存在多处偏差,导致计算结果与sympy的标准值差距极大,具体问题和修正方案如下:

1. 幂级数公式理解错误

第一类贝塞尔函数的标准幂级数展开式为:

Jₙ(x) = Σₖ=0^∞ [(-1)^k / (k! (n+k)!)] * (x/2)^(n+2k)

你的代码完全偏离了这个公式,核心错误包括:

  • 初始项缺失1/n!的分母,正确的k=0项应为(x/2)^n / math.factorial(n)
  • 循环中的项计算逻辑错误,错误引入了math.factorial(k)**2、2**2*k等无关因子,正确项需包含(n+k)!分母与(x/2)^(n+2k)的整体幂次

2. 循环逻辑错误

初始项未对应公式的k=0项,同时循环从k=0开始累加,导致重复计算甚至错误累加无关项。


修正后的实现代码

import math

def bessel_function(n, x, num_terms):
    series_sum = 0.0
    for k in range(num_terms):
        # 按标准公式计算每一项
        numerator = (-1) ** k * (x / 2) ** (n + 2 * k)
        denominator = math.factorial(k) * math.factorial(n + k)
        term = numerator / denominator
        series_sum += term
    return series_sum

# 测试n=3, x=5,取30项
print(bessel_function(3, 5, 30))  # 输出约0.3648312471869946,与sympy结果一致

优化版(递推计算,避免重复阶乘运算)

为提升效率,可利用递推关系计算每一项,无需重复计算阶乘:

import math

def bessel_function(n, x, num_terms):
    if num_terms == 0:
        return 0.0
    # 初始化k=0的项
    current_term = (x / 2) ** n / math.factorial(n)
    series_sum = current_term
    for k in range(1, num_terms):
        # 递推式:前一项 * (-1)*(x²)/(4*k*(n+k))
        current_term *= (-1) * (x ** 2) / (4 * k * (n + k))
        series_sum += current_term
    return series_sum

print(bessel_function(3, 5, 30))  # 结果与标准实现一致,计算效率更高

内容的提问来源于stack exchange,提问作者Becker Hija

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:45:38