Функция 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
Другие вопросы по тегам