scipy.special.jve#

scipy.special.jve(v, z, out=None) = <ufunc 'jve'>#

階數為 v 的第一類指數縮放貝索函數。

定義為

jve(v, z) = jv(v, z) * exp(-abs(z.imag))
參數:
varray_like

階數 (float)。

zarray_like

引數 (float 或 complex)。

outndarray, optional

函數值的選用性輸出陣列

回傳值:
Jscalar 或 ndarray

指數縮放貝索函數的值。

另請參閱

jv

未縮放的第一類貝索函數

註解

對於正 v 值,計算是使用 AMOS [1] zbesj 常式進行,其利用與修改後的貝索函數 \(I_v\) 的關聯性,

\[ \begin{align}\begin{aligned}J_v(z) = \exp(v\pi\imath/2) I_v(-\imath z)\qquad (\Im z > 0)\\J_v(z) = \exp(-v\pi\imath/2) I_v(\imath z)\qquad (\Im z < 0)\end{aligned}\end{align} \]

對於負 v 值,公式為,

\[J_{-v}(z) = J_v(z) \cos(\pi v) - Y_v(z) \sin(\pi v)\]

其中 \(Y_v(z)\) 是第二類貝索函數,使用 AMOS 常式 zbesy 計算。 請注意,對於整數 v,第二項正好為零;為了提高準確性,對於 v 值使得 v = floor(v) 的情況,第二項會明確地省略。

指數縮放貝索函數對於大的引數 z 很有用:對於這些情況,未縮放的貝索函數很容易發生下溢或溢位。

參考文獻

[1]

Donald E. Amos, “AMOS, 用於複數引數與非負階數貝索函數的可攜式套件”, http://netlib.org/amos/

範例

比較 jvjve 對於大的複數引數 z 的輸出,方法是在 z=1000j 處計算階數為 v=1 的值。 我們看到 jv 溢位,但 jve 回傳一個有限的數字

>>> import numpy as np
>>> from scipy.special import jv, jve
>>> v = 1
>>> z = 1000j
>>> jv(v, z), jve(v, z)
((inf+infj), (7.721967686709077e-19+0.012610930256928629j))

對於 z 的實數引數,jve 回傳與 jv 相同的值。

>>> v, z = 1, 1000
>>> jv(v, z), jve(v, z)
(0.004728311907089523, 0.004728311907089523)

透過為 v 提供列表或 NumPy 陣列,可以同時針對多個階數評估函數

>>> jve([1, 3, 5], 1j)
array([1.27304208e-17+2.07910415e-01j, -4.99352086e-19-8.15530777e-03j,
       6.11480940e-21+9.98657141e-05j])

以相同的方式,透過為 z 提供列表或 NumPy 陣列,可以在一次呼叫中針對多個點評估函數

>>> jve(1, np.array([1j, 2j, 3j]))
array([1.27308412e-17+0.20791042j, 1.31814423e-17+0.21526929j,
       1.20521602e-17+0.19682671j])

也可以透過為 vz 提供具有相容形狀以進行廣播的陣列,同時針對多個階數在多個點上評估。 計算兩個不同階數 v 和三個點 zjve,結果會產生 2x3 陣列。

>>> v = np.array([[1], [3]])
>>> z = np.array([1j, 2j, 3j])
>>> v.shape, z.shape
((2, 1), (3,))
>>> jve(v, z)
array([[1.27304208e-17+0.20791042j,  1.31810070e-17+0.21526929j,
        1.20517622e-17+0.19682671j],
       [-4.99352086e-19-0.00815531j, -1.76289571e-18-0.02879122j,
        -2.92578784e-18-0.04778332j]])