Scipy には多くの特別な関数があり、特にベッセル関数jn
(常に大文字の J_n(x) で示されます) と球面ベッセル関数spherical_jn
(小文字の j_n(x) で示されます) があります。一方、mpmath have は、やquadosc
のような急速に振動する関数を統合するための特別な方法です。私が得た問題は、mpmath からサポートされていないように見えることです。たとえば、scipy からこの積分を行うための入力として。つまり、numpy からインポートされたものを使用すると、TypeError のエラーは何も得られませんが、x が非常に大きい場合に J_n(x) または j_n(x) の積分を評価するのにはあまり適していません。jn
spherical_jn
quadosc
jn
quad
quad
(***) SymPyが "Oscilatory quadrature (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.
しかし、numpy からインポートされた J_n(x) を使用する場合:
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)
次に、次のエラーが発生しました(編集済み:トレースバックを追加しました)
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.
では、mpmathjn
内で scipy からの関数を使用するにはどうすればよいでしょうか? quadosc
このエラーを修正するにはどうすればよいですか? 助けてくれてありがとう。