You need to enable JavaScript to run this app. 自定义实现第一类贝塞尔函数无穷级数x超约35后结果异常的问题
优惠活动
大模型
产品
解决方案
定价
更多

自定义实现第一类贝塞尔函数无穷级数x超约35后结果异常的问题

问题根因

你遇到的x>35后结果跳变的问题,根本不是单纯的舍入误差问题,是核心逻辑bug+算法选型不适配共同导致的:

  • 级数方法的固有缺陷:你用的整数阶第一类贝塞尔的级数展开,是典型的交错级数。当x值很大时,级数里的单项会先涨到e^(x/2)量级的峰值,比如x=40时峰值项能到1e8量级,而最终J_n(x)的真实值通常只有1以下的量级——本质是把两个数量级差8个量级的超大数做加减抵消,只要循环停止条件不对,根本等不到小残差累加完就会提前退出。这也是你换了Decimal高精度计算、调了容差都没用的核心原因:没改停止逻辑,高精度也抵不过提前停算漏了关键项。
  • 停止判据的硬bug:你现在写的收敛判定逻辑,只要累加值J_old在迭代阶段碰到接近0的情况,就直接把收敛门槛拉到tol/2,不管后续还有多少修正项没加。大x下级数的阶段性累加值本来就很容易反复穿过0点,这时候循环直接终止,结果自然会和真实值偏差很大,出现无规律的波动。
可直接落地的修复方案
  • 替换停止判据:不要用相邻两次累加值的相对变化做收敛判断,要跟踪当前迭代项的绝对值。因为交错级数的余项绝对值永远小于第一个被丢弃的单项大小,当单项的绝对值小到满足容差要求时再停止,就不会被阶段性的零值骗到。
  • 改用递推方式计算级数项:不要每次循环都硬算x的高次幂、再除以大阶乘,用相邻项的递推关系计算,从根源上避免大数值溢出和抵消误差,普通双精度浮点就能满足需求,不需要用Decimal做高精度转换。
    修正后的核心计算函数参考:
import math
import numpy as np
import matplotlib.pyplot as plt

def bessel(nu, x, tol):
    if not float(nu).is_integer():
        raise ValueError("nu 必须为整数阶")
    nu = int(nu)
    J = 0.0
    m = 0
    while True:
        # 递推计算当前单项,避免直接计算超大的幂和阶乘
        if m == 0:
            term = (x / 2) ** nu / math.factorial(nu)
        else:
            term *= - (x / 2) ** 2 / (m * (m + nu))
        J += term
        # 至少算5项,当单项绝对值满足容差要求时停止
        if m > 5 and abs(term) < tol * abs(J):
            break
        m += 1
    return J, m
  • 大x场景切渐近展开:当x > 1.5*(nu +1)时,不要再硬算级数求和,直接用第一类贝塞尔的大x渐近展开公式计算,精度完全能满足工程需求,也不会遇到级数抵消的问题。
  • 去掉重复计算:你原来的循环里对同一个点的贝塞尔值重复调用了3次函数(为了取迭代次数数组的值),直接在单次调用里把结果和迭代数存下来就行,能减少2/3的重复计算量。调整后的循环逻辑:
tol_J_lam = 0.01
lam = np.linspace(0, 40, 121, endpoint=True)
J0 = []
J1 = []
m0 = []
m1 = []

for xi in lam:
    j0, iter0 = bessel(0, xi, tol_J_lam)
    j1, iter1 = bessel(1, xi, tol_J_lam)
    J0.append(j0)
    J1.append(j1)
    m0.append(iter0)
    m1.append(iter1)
之前的调整没有效果的原因

你之前收紧容差、换Decimal高精度类型没作用,本质是两个核心问题没解决:一是停止逻辑还是被阶段性零值触发了提前退出,哪怕精度再高,漏加的项也补不上;二是没有用递推算项,还是直接硬算高次幂和阶乘,就算精度上去了,大数值的抵消误差还是会累积。

内容的提问来源于stack exchange,提问作者Pedro Faria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 11:54:11