scipy.special.ive#
- scipy.special.ive(v, z, out=None) = <ufunc 'ive'>#
指数缩放的第一类修正贝塞尔函数。
定义为
ive(v, z) = iv(v, z) * exp(-abs(z.real))
对于没有实部的虚数,返回未缩放的第一类贝塞尔函数
iv
。- 参数:
- v浮点数组类型
阶数。
- z浮点数或复数数组类型
参数。
- outndarray, 可选
用于函数值的可选输出数组
- 返回:
- 标量或 ndarray
指数缩放的修正贝塞尔函数值。
备注
对于正的 v,将调用 AMOS [1] zbesi 例程。它对小 z 使用幂级数,对大 abs(z) 使用渐近展开,对中等量级使用经 Wronskian 归一化的 Miller 算法和 Neumann 级数,以及对大阶数使用 \(I_v(z)\) 和 \(J_v(z)\) 的均匀渐近展开。必要时,使用反向递推生成序列或降低阶数。
上述计算在右半平面完成,并通过以下公式延续到左半平面,
\[I_v(z \exp(\pm\imath\pi)) = \exp(\pm\pi v) I_v(z)\](当 z 的实部为正时有效)。对于负的 v,使用以下公式
\[I_{-v}(z) = I_v(z) + \frac{2}{\pi} \sin(\pi v) K_v(z)\],其中 \(K_v(z)\) 是第二类修正贝塞尔函数,使用 AMOS 例程 zbesk 计算。
ive
对于大参数 z 很有用:对于这些参数,iv
容易溢出,而ive
由于指数缩放而不会。参考文献
[1]Donald E. Amos, “AMOS, A Portable Package for Bessel Functions of a Complex Argument and Nonnegative Order”, http://netlib.org/amos/
示例
在以下示例中,
iv
返回无穷大,而ive
仍然返回一个有限数。>>> from scipy.special import iv, ive >>> import numpy as np >>> import matplotlib.pyplot as plt >>> iv(3, 1000.), ive(3, 1000.) (inf, 0.01256056218254712)
通过提供列表或 NumPy 数组作为 v 参数的实参,计算函数在一点处不同阶数的值
>>> ive([0, 1, 1.5], 1.) array([0.46575961, 0.20791042, 0.10798193])
通过提供 z 的数组,计算函数在几个点处阶数为0的值。
>>> points = np.array([-2., 0., 3.]) >>> ive(0, points) array([0.30850832, 1. , 0.24300035])
通过同时提供 v 和 z 的数组,计算函数在几个点处不同阶数的值。两个数组都必须能够广播到正确的形状。要计算一维点数组的0、1和2阶
>>> ive([[0], [1], [2]], points) array([[ 0.30850832, 1. , 0.24300035], [-0.21526929, 0. , 0.19682671], [ 0.09323903, 0. , 0.11178255]])
绘制阶数为0到3的函数在-5到5范围内的曲线。
>>> fig, ax = plt.subplots() >>> x = np.linspace(-5., 5., 1000) >>> for i in range(4): ... ax.plot(x, ive(i, x), label=fr'$I_{i!r}(z)\cdot e^{{-|z|}}$') >>> ax.legend() >>> ax.set_xlabel(r"$z$") >>> plt.show()