You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scipy二维逆快速傅里叶变换(ifft2)在傅里叶光学仿真中失效问题求助

Scipy二维逆快速傅里叶变换(ifft2)在傅里叶光学仿真中失效问题求助

我最近跟着一个傅里叶光学的Python教程做单缝衍射的仿真,目标是实现get_U(z, k)函数并绘制对应的衍射图样,但始终得不到正确的结果——绘图窗口里全是白色,检查后发现计算得到的U变量全是(nan+nanj)值。

我对照了教程里的公式,看起来是完全一致的。考虑到np.sqrt()可能会遇到负数输入,我试过加np.abs()包裹根号里的内容,也用过np.where()把负数转换成0,但都没能得到预期的衍射图样。

以下是我的代码:

import numpy as np
import scipy as sp
from scipy.fft import fft2, ifft2, fftfreq, fftshift
import matplotlib.pyplot as plt
import pint

plt.style.use(['grayscale'])
u = pint.UnitRegistry()

D = 0.1 * u.mm
lam = 660 * u.mm

x = np.linspace(-2, 2, 1600) * u.mm
xv, yv = np.meshgrid(x, x)

U0 = (np.abs(xv) < D/2) * (np.abs(yv) < 0.5 * u.mm)
U0 = U0.astype(float)

A = fft2(U0)
kx = fftfreq(len(x), np.diff(x)[0]) * 2 * np.pi
kxv, kyv = np.meshgrid(kx, kx)

def get_U(z, k):
  return ifft2(A*np.exp(1j*z.magnitude*np.sqrt(k.magnitude**2 - kxv.magnitude**2 - kyv.magnitude**2)))
k = 2*np.pi/(lam)
d = 3 * u.cm
U = get_U(d, k)

plt.figure(figsize=(5, 5))
plt.pcolormesh(xv, yv, np.abs(U), cmap='inferno')
plt.xlabel('$x$ [mm]')
plt.ylabel('$y$ [mm]')
plt.title('Single slit diffraction')
plt.show()

麻烦各位帮我看看问题出在哪里?为什么会出现全是nan的复数数组,该怎么调整才能得到正确的衍射图样?

备注:内容来源于stack exchange,提问作者Hrishav Saha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:04:30