在Python中通过scipy或sympy使用Kramers-Kronig(Hilbert)变换

myzjeezk  于 2022-11-29  发布在  Python
关注(0)|答案(1)|浏览(299)

本文试图用Kramers-Kronig算法将衍射反常精细结构(DAFS)实验中的反常散射因子的真实的部和虚部贡献进行转换。
我已经使用lmfit包和以下函数对我的实验数据拟合了一条平滑曲线:

`def intensity(en, phi, beta, I0=1, slope=0, Ioff=0, fprime=-1, fsec=1):
    costerm = np.cos(phi) + beta*fprime
    sinterm = np.sin(phi) + beta*fsec
    return I0 * (costerm**2 + sinterm**2) + slope*en + Ioff`

我已经找到了函数中所列参数的最小值,并使用它们根据下式计算f'的初始猜测:

`def f1_guess(f2, I, I0, phi, beta, Ioff):
    f1_guess = (1/beta) * (np.sqrt(((I-Ioff)/I0) - (math.sin(phi)+(beta*f2))) - math.cos(phi)) 
    return f1_guess`

我现在尝试使用Kramers-Kronig关系将这个初始的f'猜测转换为f”,然后将其放回lmfit过程中对强度进行建模,并随后计算精细结构。我已经尝试了一些东西,包括scipy.fftpack,以及scipy.integrate和sympy.integrate包。
我面临的问题是,我需要在有限能量范围内计算KK变换,即,而不是以下:

我应该做一些更像下面的函数的事情,通过取出已知的原子线形f“a(E),并在我的实验能量范围内积分:

然而,我很难区分E'和E(或omega'和omega)--我不知道它们之间有什么不同--因此我不确定如何以脚本格式指定这些值,以便我可以准确地计算这个积分。
有人知道我如何将f'转换为f”,并迭代我的lmfit模型,直到4个参数(I 0,Ioff,beta,phi)和f”/f'精细结构函数稳定下来吗?提前感谢!

vojdkbi0

vojdkbi01#

是的,这对于Stackoverflow来说可能有点离题,但对于共振X射线散射(包括DAFS)以及光学中的其他情况,可能需要对较大信号的微小变化(chi-扰动)进行KK变换,可以使用差分KK变换。
也就是说,f'f''是因果对,可以计算和制表--并且可以覆盖“有效无限”的频率/能量范围。对于X射线数据,在Python中,可以从XrayDB中获得因果对:(请参阅https://xraypy.github.io/XrayDB/,特别是)。
有了这个已知的因果关系对,你就可以进行差分KK变换。要在Python中实现这一点,请参见https://xraypy.github.io/xraylarch/xafs_diffkk.html,其中还包括一些背景文献的链接(披露:我是首席开发人员)。

相关问题