0

作为一个 SymPy 新手,我正在考虑以下 SymPy 表达式(它应该等于 1 if 0<x<1):

f = Sum((2/(lambda_m*besselj(1, lambda_m)))*besselj(0,x*lambda_m), (m, 1, oo))

lambda_mm第-个零在哪里besselj(0,x)

现在,mpmath有一个函数besseljzero(0,m,0)可以精确计算这个。

不幸的是,如果我在上面的公式中替换(手动,我的意思是......)lambda_mbesseljzero(0,m,0)SymPy 会给我一个错误,因为m它不是整数......

我想通过创建一个函数来解决这个问题,该函数应该:

  • j0(m)如果m不计算为整数则返回
  • besseljzero(0,m,0)如果确实如此,请返回

但我不知道如何进行。

这是一个好主意,有人可以帮助我吗?

4

1 回答 1

0

问题是 MPMath 用于数值评估,通常为您提供数值近似值,而 SymPy 以符号方式运行:任意精度与无限精度不同。您无法从 MPMath 计算无限的输出总和,因为您实际上必须处理无限多的求和。

为了象征性地计算您的总和,SymPy 必须具有所有参数的表示形式,并了解您所描述的身份 ( f(x)==1if 0<x<1) 或能够推导出它。情况似乎并非如此。

因此,您所能做的就是以数字方式近似结果,例如,使用 MPMath 的实现:

from mpmath import besseljzero, besselj
from itertools import count

threshold = 1e-5
min_m = 100

def f(x):
    Sum = 0
    for m in count(1):
        lambda_m = besseljzero(0,m,0)
        summand = 2/(lambda_m*besselj(1, lambda_m))*besselj(0,x*lambda_m)
        Sum += summand
        if m>min_m and abs(summand)<threshold:
            break
    return Sum
于 2017-05-01T16:19:33.283 回答