Функция SymPy с неопределенным аргументом
Как новичок в SymPy, я рассматриваю следующее выражение SymPy (которое должно быть равно 1, если 0<x<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)
если это так
Но я не знаю, как поступить.
Это хорошая идея, и может ли кто-нибудь мне помочь?
1 ответ
Проблема в том, что 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