作为SymPy的新手,我正在考虑以下SymPy表达式(如果0<x<1
,则应该等于1):
f = Sum((2/(lambda_m*besselj(1, lambda_m)))*besselj(0,x*lambda_m), (m, 1, oo))
其中lambda_m
是m
- besselj(0,x)
的零。
现在,mpmath
有一个函数besseljzero(0,m,0)
,可以完全计算出来。
不幸的是,如果我在上面的公式中用lambda_m
替换(手动,我的意思是......)besseljzero(0,m,0)
,SymPy会给我一个错误,因为m
不是整数。
我想通过创建一个应该:
的函数来解决这个问题j0(m)
未评估为整数,则m
besseljzero(0,m,0)
但我不知道如何继续。
这是一个好主意,有人可以帮助我吗?
答案 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