当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy fft.fht用法及代码示例


本文简要介绍 python 语言中 scipy.fft.fht 的用法。

用法:

scipy.fft.fht(a, dln, mu, offset=0.0, bias=0.0)#

计算快速汉克尔变换。

使用 FFTLog 算法 [1]、[2] 计算对数间隔周期序列的离散汉克尔变换。

参数

a 类似数组 (…, n)

实周期输入数组,均匀对数间隔。对于多维输入,变换是在最后一个轴上执行的。

dln 浮点数

输入数组的均匀对数间距。

mu 浮点数

汉克尔变换的阶数,任何正实数或负实数。

offset 浮点数,可选

输出阵列的均匀对数间距的偏移。

bias 浮点数,可选

幂律偏差的指数,任何正或负实数。

返回

A 类似数组 (…, n)

变换后的输出数组是实数、周期性、均匀对数间隔且与输入数组形状相同的数组。

注意

该函数计算汉克尔变换的离散版本

其中 是阶数 的贝塞尔函数。索引 可以是任何实数,正数或负数。

输入数组a是一个长度为周期的序列\(n\) ,均匀对数间隔间距,

以点为中心\(r_c\) 。注意中心索引\(j_c = (n-1)/2\) 是half-integral如果\(n\) 是偶数,所以\(r_c\) 位于两个输入元素之间。类似地,输出数组A是一个长度为周期的序列\(n\) ,也均匀地以对数间隔

以点 为中心。

中心点\(r_c\) \(k_c\) 周期间隔的数量可以任意选择,但通常选择乘积\(k_c r_c = k_j r_{n-1-j} = k_{n-1-j} r_j\) 要团结。可以使用以下命令更改此设置抵消参数,控制对数偏移\(\log(k_c) = \mathtt{offset} - \log(r_c)\) 输出数组的。选择一个最佳值抵消可以减少离散汉克尔变换的振铃。

如果偏置参数非零,则该函数计算偏置汉克尔变换的离散版本

其中\(q\) 的值是偏见,以及幂律偏差\(a_q(r) = a(r) \, (kr)^{-q}\) 应用于输入序列。偏置变换可以帮助近似连续变换\(a(r)\) 如果有一个值\(q\) 这样\(a_q(r)\) 接近于周期序列,在这种情况下得到的结果\(A(k)\) 将接近连续变换。

参考

[1]

塔尔曼 J.D.,1978,J.Comp。物理, 29, 35

[2] (1,2)

汉密尔顿 A.J.S.,2000,MNRAS,312, 257 (astro-ph/9905191)

例子

该示例是[2]中提供的fftlogtest.f的改编版本。它评估积分

>>> import numpy as np
>>> from scipy import fft
>>> import matplotlib.pyplot as plt

变换的参数。

>>> mu = 0.0                     # Order mu of Bessel function
>>> r = np.logspace(-7, 1, 128)  # Input evaluation points
>>> dln = np.log(r[1]/r[0])      # Step size
>>> offset = fft.fhtoffset(dln, initial=-6*np.log(10), mu=mu)
>>> k = np.exp(offset)/r[::-1]   # Output evaluation points

定义分析函数。

>>> def f(x, mu):
...     """Analytical function: x^(mu+1) exp(-x^2/2)."""
...     return x**(mu + 1)*np.exp(-x**2/2)

评估 r 处的函数并使用 FFTLog 计算 k 处的相应值。

>>> a_r = f(r, mu)
>>> fht = fft.fht(a_r, dln, mu=mu, offset=offset)

对于此示例,我们实际上可以计算分析响应(在本例中与输入函数相同)进行比较并计算相对误差。

>>> a_k = f(k, mu)
>>> rel_err = abs((fht-a_k)/a_k)

绘制结果。

>>> figargs = {'sharex': True, 'sharey': True, 'constrained_layout': True}
>>> fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4), **figargs)
>>> ax1.set_title(r'$r^{\mu+1}\ \exp(-r^2/2)$')
>>> ax1.loglog(r, a_r, 'k', lw=2)
>>> ax1.set_xlabel('r')
>>> ax2.set_title(r'$k^{\mu+1} \exp(-k^2/2)$')
>>> ax2.loglog(k, a_k, 'k', lw=2, label='Analytical')
>>> ax2.loglog(k, fht, 'C3--', lw=2, label='FFTLog')
>>> ax2.set_xlabel('k')
>>> ax2.legend(loc=3, framealpha=1)
>>> ax2.set_ylim([1e-10, 1e1])
>>> ax2b = ax2.twinx()
>>> ax2b.loglog(k, rel_err, 'C0', label='Rel. Error (-)')
>>> ax2b.set_ylabel('Rel. Error (-)', color='C0')
>>> ax2b.tick_params(axis='y', labelcolor='C0')
>>> ax2b.legend(loc=4, framealpha=1)
>>> ax2b.set_ylim([1e-9, 1e-3])
>>> plt.show()
scipy-fft-fht-1.png

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.fft.fht。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。