python - python中复高斯的数值傅里叶变换
问题描述
我正在尝试使用numpy.fft.fft
. 作为测试函数,我使用了一个相当简单的函数:具有复杂宽度参数的高斯函数
该函数的傅里叶变换可以很容易地解析计算并给出
我的问题是我无法使用数字重现解析傅里叶变换的结果numpy.fft.fft
。这是我的代码
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from scipy.fftpack import fft, ifft, fftshift, fftfreq, fft2, ifft2
def fun(t, alpha, beta):
# a function of time and 2 parameters
norm = np.sqrt(alpha/np.pi)
return norm * np.exp( -t**2 * (alpha + 1j*beta) )
def ft_fun_analytic(om, alpha, beta):
# the analytical Fourier transform of fun(t)
gamma = 1. / (1. + 1j*beta/alpha)
norm = np.sqrt( gamma )
return norm * np.exp( -om**2 * gamma / (4.*alpha) )
t = np.linspace(-4., 4., 300000, endpoint=True)
om = 2.*np.pi * fftshift(fftfreq(len(t), d = t[1]-t[0]))
alpha, beta = [160., 0.07]
t_series = fun(t, alpha, beta)
grid_norm = (t[1]-t[0])
om_spec = grid_norm * fftshift(fft(t_series))
om_spec_analytic = ft_fun_analytic(om, alpha, beta)
fig1 = plt.figure(figsize=(10,5))
plt.subplot(121, xlabel=r'$t$', ylabel='Intensity', title=r'$f(t)$')
plt.plot(t, np.abs(t_series)**2)
plt.xlim([-0.4,0.4])
plt.subplot(122, xlabel=r'$t$', ylabel='Phase', title=r'$f(t)$')
plt.plot(t, np.angle(t_series))
plt.xlim([-0.4,0.4])
plt.show()
fig2 = plt.figure(figsize=(10,5))
plt.subplot(121, xlabel=r'$\omega$', ylabel='Intensity', title=r'$FT[f](\omega)$')
plt.plot(om, np.abs(om_spec)**2, label='numerical FT')
plt.plot(om, np.abs(om_spec_analytic)**2, '--', label='analytical FT')
plt.xlim([-120., 120.])
plt.legend()
plt.subplot(122, xlabel=r'$\omega$', ylabel='Phase', title=r'$FT[f](\omega)$')
plt.plot(om, np.angle(om_spec), label='numerical FT')
plt.plot(om, np.angle(om_spec_analytic), '--', label='analytical FT')
plt.xlim([-120., 120.])
plt.legend()
plt.show()
在频域中,数值傅里叶变换给出了正确的强度。但相位包括偏移和高频振荡:
我知道快速傅里叶变换的混叠和采样范围问题等影响。我尝试同时使用分辨率和范围。即使对于我的机器只能处理此问题的极精细采样也会发生。
有没有办法使用 重现分析结果numpy.fft.fft
?也许通过选择智能电网而不是非常好的电网?
我不是 100% 确定这个问题是属于科学计算网站还是这里。由于我(可能没有根据)的怀疑是这与指数函数评估中的数值精度有关,因此我将首先在这里尝试。
解决方案
推荐阅读
- java - 在哪里将系统属性“org.apache.logging.log4j.simplelog.StatusLogger.level”设置为 TRACE 以显示 Log4j2 内部初始化日志记录
- javascript - 如何在工具提示中显示值
- wso2is - WSO2 IS 是否支持 2 个用于常驻 SAML 身份提供者的密钥对 - 一个用于加密,另一个用于签名?
- sql - Oracle SQL Developer 查询未按字母顺序排序
- r - 跨站点对时间安排的事件进行分组 dplyr
- r - 用线图覆盖箱线图
- google-cloud-platform - BigQuery 传输服务:哪个文件导致错误?
- github-actions - 工作流文件应该位于哪个分支以便 GitHub Actions 执行它们?
- powershell - 你可以通过powershell删除另一个任务的windows任务吗?
- php - Laravel 身份验证获取错误的用户