具有未评估参数的SymPy函数

时间:2017-05-01 15:22:04

标签: sympy bessel-functions

作为SymPy的新手,我正在考虑以下SymPy表达式(如果0<x<1,则应该等于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_m替换(手动,我的意思是......)besseljzero(0,m,0),SymPy会给我一个错误,因为m不是整数。

我想通过创建一个应该:

的函数来解决这个问题
    如果j0(m)未评估为整数,则
  • 返回m
  • 如果确实
  • 则返回besseljzero(0,m,0)

但我不知道如何继续。

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

1 个答案:

答案 0 :(得分:0)

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

要以符号方式计算您的总和,SymPy必须具有所有参数的表示,并且要知道您所描述的身份(f(x)==1如果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