scipy.special.ive#
- scipy.special.ive(v, z, out=None) = <ufunc 'ive'>#
第一类修正贝塞尔函数的指数缩放。
定义为
ive(v, z) = iv(v, z) * exp(-abs(z.real))
对于没有实部的虚数,返回第一类未缩放的贝塞尔函数
iv
。- 参数:
- vfloat 数组型
阶。
- zfloat 或 complex 数组型
自变量。
- outndarray,可选
函数值的可选输出数组
- 返回:
- 标量或 ndarray
指数修正贝塞尔函数的值。
备注
对于正数v,将调用 AMOS [1] zbesi 例程。它利用幂级数适用于小z,渐近展开适用于大abs(z),由弗龙斯基标准化的米勒算法及适用于中间大小的诺伊曼级数,以及适用于大阶数 \(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,用于复参数和非负阶的贝塞尔函数的可移植程序包”,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]])
绘制 -5 到 5 的 0 到 3 阶函数。
>>> 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()