from scipy.interpolate import InterpolatedUnivariateSpline as Spline
import numpy as np
x, y = # Import/create data vectors
# Do this if y is both negative and positive
fnc = Spline(x,y, k=1) #I usually choose k=1 in case anything gets extrapolated.
# Otherwise do this
spl = Spline(np.log(x), np.log(y), k=1)
fnc = lambda x : np.exp(spl(np.log(x)))
# Continue as normal with hankel.transform(fnc, kvec)
4条答案
按热度按时间ggazkfy81#
我是hankel的作者。虽然我不建议在这种情况下使用我的代码(因为正如你提到的,它需要一个可调用的输入函数,它的目的是准确地计算积分,而不是做DHT),但我会说这是可能的。
所有你需要做的就是插入你的输入1D数组。如何做到这一点取决于你,但通常情况下,像下面这样的操作效果很好:
这样做的一个大问题是选择参数
N
和h
,使得变换对于kvec
中k
的所有值都很好地近似。如果kvec
跨越很宽的动态范围,那么hankel
的效率非常低,因为它在变换中为每个k
使用相同的底层数组(长度为N
),这意味着最困难的k
设置了性能级别。因此,再次强调,简而言之,我不推荐使用
hankel
,但如果您找不到其他任何东西,它仍然可以工作;- )lpwwtiir2#
我的一个朋友正在寻找Python中的Hankel变换,在决定没有可用的东西之后-部分基于这个问题的答案-找到我分享我的。
我现在已经整理、记录并发布了代码PyHank(docs)。
这个软件包执行准离散汉克尔变换,如原始问题所要求的(如果几年太晚了!)但希望这个答案能把未来发现这个问题的用户(比如我的朋友)引导到正确的地方。
vsaztqbk3#
如果您阅读Hankel的文档,通过Transforms一节,您将看到要执行转换,您调用
hankel.transform(function, array, ret_err=bool)
,因此您只需要执行所需转换形式的函数。我相信在Wikipedia条目中有Hankel Transformation的转换函数列表。gblwokeq4#
截至2023年,离散汉克尔变换有了很好的实现。
https://docs.scipy.org/doc/scipy/reference/generated/scipy.fft.fht.html
我也对计算径向对称函数的二维傅里叶逆很感兴趣。我不确定当我试图在2D网格上采样并直接计算2D傅立叶逆时,或者如果我计算汉克尔变换并在对数间隔网格上插值时,采样误差是否更糟。