0

Scipy には多くの特別な関数があり、特にベッセル関数jn(常に大文字の J_n(x) で示されます) と球面ベッセル関数spherical_jn(小文字の j_n(x) で示されます) があります。一方、mpmath have は、やquadoscのような急速に振動する関数を統合するための特別な方法です。私が得た問題は、mpmath からサポートされていないように見えることです。たとえば、scipy からこの積分を行うための入力として。つまり、numpy からインポートされたものを使用すると、TypeError のエラーは何も得られませんが、x が非常に大きい場合に J_n(x) または j_n(x) の積分を評価するのにはあまり適していません。jnspherical_jn quadosc jnquadquad

(***) 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このエラーを修正するにはどうすればよいですか? 助けてくれてありがとう。

4

2 に答える 2