В Scipy есть много специальных функций, в частности функции Бесселя jn
(всегда обозначаются прописной буквой J_n(x)) и сферические функции Бесселя spherical_jn
(обозначаются строчной буквой j_n(x)). С другой стороны, в mpmath есть quadosc
, специальный метод для интеграции быстро колеблющихся функций, таких как jn
и spherical_jn
. Проблема, которую я обнаружил, заключается в том, что кажется, что quadosc
из mpmath не поддерживается, например, jn
из scipy в качестве входных данных для создания этого интеграла. Я имею в виду, что если я использую quad
, импортированный из numpy, поэтому не возникает никакой ошибки TypeError, но quad
не очень подходит для оценки интегралов J_n (x) или j_n (x), когда x очень большой.
(***) На сайте SymPy найти по "Колебательной квадратуре (quadosc)", этот пример взят оттуда.
from mpmath import findroot, quadosc, inf, j0
j0zero = lambda n: findroot(j0, pi*(n-0.25)) # ***
I = quadosc(j0, [0, inf], zeros=j0zero)
print(I)
I = 1.0 # OK, this is the correct answer.
Но если я использую J_n(x), импортированный из numpy:
from scipy.special import jn
f = lambda x: jn(0,x)
j0zero = lambda n: findroot(f, pi*(n-0.25))
II = quadosc(f, [0, inf], zeros=j0zero)
print(II)
затем я получил следующую ошибку (отредактировано: добавлен Traceback)
TypeError Traceback (most recent call last)
~/anaconda3/lib/python3.7/site-packages/mpmath/calculus/optimization.py in findroot(ctx, f, x0, solver, tol, verbose, verify, **kwargs)
927 try:
--> 928 fx = f(*x0)
929 multidimensional = isinstance(fx, (list, tuple, ctx.matrix))
<ipython-input-449-aeebd9a1e908> in <lambda>(x)
2
----> 3 f = lambda x: jn(0,x)
4 j0zero = lambda n: findroot(f, pi*(n-0.25))
TypeError: ufunc 'jv' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
<ipython-input-449-aeebd9a1e908> in <module>
3 f = lambda x: jn(0,x)
4 j0zero = lambda n: findroot(f, pi*(n-0.25))
----> 5 II = quadosc(f, [0, inf], zeros=j0zero)
6 print(II)
~/anaconda3/lib/python3.7/site-packages/mpmath/calculus/quadrature.py in quadosc(ctx, f, interval, omega, period, zeros)
998 # raise ValueError("zeros do not appear to be correctly indexed")
999 n = 1
-> 1000 s = ctx.quadgl(f, [a, zeros(n)])
1001 def term(k):
1002 return ctx.quadgl(f, [zeros(k), zeros(k+1)]
~/anaconda3/lib/python3.7/site-packages/mpmath/calculus/optimization.py in findroot(ctx, f, x0, solver, tol, verbose, verify, **kwargs)
929 multidimensional = isinstance(fx, (list, tuple, ctx.matrix))
930 except TypeError:
--> 931 fx = f(x0[0])
932 multidimensional = False
933 if 'multidimensional' in kwargs:
С другой стороны, если я использую quad
, то я получаю
from scipy.integrate import quad
f = lambda x: jn(0,x)
III = quad(f,0,inf)[0]
print(III)
III = -21.154674722694516 # What is an incorrect answer.
Итак, как я могу использовать функцию jn
из scipy внутри quadosc
из mpmath? Как я могу исправить эту ошибку? Спасибо за помощь.
jv
напрямую, покажите трассировку, чтобы мы могли увидеть, где возникает ошибка. Я подозреваю, что mpmath передает свой собственный класс чисел функции scioy.numpy, которую он не может обработать. - person hpaulj   schedule 22.12.2019jn
иjv
функцию scipy для случая n=v=0, то естьjn(0,x)
иjv(0,x)
и обе они являются одной и той же функцией. - person Diogo   schedule 22.12.2019jn
, я вижу, что это другое имя дляjv
. - person hpaulj   schedule 22.12.2019jv
, когда вы звонитеjn
. Это прояснилось. Проблема в том, чтоquadosc
передаетmpmath
числа функцииjn
, которая может использовать толькоC
удвоений (или эквивалентных чисел с плавающей запятой). - person hpaulj   schedule 22.12.2019jn
наjv
, проблема не исчезнет, и я получу ту же ошибку. Проблема в том, что quadosc не понимаетjn
(илиjv
) как интегрант. Таким образом, если существует какой-то способ заставить mpmath и scipy взаимодействовать между собой, то quadosc можно применять для большого класса специальных функций, особенно осциллирующих функций. - person Diogo   schedule 22.12.2019