回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>Scipy有很多特殊的函数,特别是贝塞尔函数<code>jn</code>(总是用大写字母J琰n(x)表示)和球形贝塞尔函数<code>spherical_jn</code>(用小写字母J琰n(x)表示)。另一方面,mpmath有<code>quadosc</code>,一种积分快速振荡函数的特殊方法,如<code>jn</code>和<code>spherical_jn</code>。<em>我得到的问题是,似乎mpmath的</em><code>quadosc</code><em>不支持,例如scipy的<code>jn</code>作为输入来进行积分。我的意思是,如果我使用从numpy导入的<code>quad</code>,那么就不会得到TypeError的错误,但是<code>quad</code>在x非常大的时候,不太适合计算Jĩn(x)或Jĩn(x)的积分。你知道吗</p>
<p>(***)在通过“振荡求积(quadosc)”找到的站点<a href="https://docs.sympy.org/0.7.6/modules/mpmath/calculus/integration.html#oscillatory-quadrature-quadosc" rel="nofollow noreferrer">SymPy</a>中,这个例子来自那里。你知道吗</p>
<pre><code>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.
</code></pre>
<p>但如果我用的是从numpy进口的Jïn(x):</p>
<pre><code>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)
</code></pre>
<p>然后我得到了以下错误(编辑:添加了回溯)</p>
<pre><code>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:
</code></pre>
<p>另一方面,如果我使用<code>quad</code>,那么</p>
<pre><code>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.
</code></pre>
<p>那么,如何使用来自mpmath的<code>quadosc</code>中scipy的函数<code>jn</code>?如何修复此错误?谢谢你的帮助。你知道吗</p>