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) 使用渐近展开,对中间大小使用由朗斯基行列式归一化的米勒算法和诺伊曼级数,以及对大阶数使用 \(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)
通过为 v 参数提供列表或 NumPy 数组作为参数,计算不同阶数的函数在一点的值
>>> 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 提供数组,计算不同阶数的函数在多个点的值。这两个数组必须可广播到正确的形状。要计算 1D 点数组的 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()