作为sympy newbie,我正在考虑以下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)
如果它确实
,但我不知道如何进行。
这是个好主意,有人可以帮助我吗?
问题是mpmath用于数字评估,通常为您提供数值近似值,而sympy象征性地运行:任意精度与无限精度不同。您无法计算MPMATH的无限输出总和,因为您实际上必须处理无限的许多总结。
要象征性地计算您的总和,Sympy必须具有所有参数的表示,并意识到您描述的身份(如果0<x<1
,则f(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