Python实现矩形孔的夫朗和费衍射图样输出
时间: 2024-02-12 11:06:38 浏览: 146
以下是 Python 实现矩形孔的夫朗和费衍射图样输出的示例代码:
import numpy as np
import matplotlib.pyplot as plt
def rect(x, y, w, h):
return np.logical_and(np.logical_and(x >= -w/2, x <= w/2), np.logical_and(y >= -h/2, y <= h/2))
def fraunhofer_rect(wavelength, a, L, N):
x = np.linspace(-a/2, a/2, N)
y = np.linspace(-a/2, a/2, N)
X, Y = np.meshgrid(x, y)
aperture = rect(X, Y, L, L)
aperture_ft = np.fft.fftshift(np.fft.fft2(aperture))
pattern = np.abs(aperture_ft)**2
dx = x[1] - x[0]
dy = y[1] - y[0]
kx = 2*np.pi*np.fft.fftshift(np.fft.fftfreq(N, dx))
ky = 2*np.pi*np.fft.fftshift(np.fft.fftfreq(N, dy))
KX, KY = np.meshgrid(kx, ky)
scaling = 1.0/(wavelength*L)
pattern = np.fft.fftshift(pattern)
pattern = pattern/scaling**2
return pattern, kx, ky
def fresnel_rect(wavelength, a, L, N, z):
x = np.linspace(-a/2, a/2, N)
y = np.linspace(-a/2, a/2, N)
X, Y = np.meshgrid(x, y)
aperture = rect(X, Y, L, L)
aperture_ft = np.fft.fftshift(np.fft.fft2(aperture))
dx = x[1] - x[0]
dy = y[1] - y[0]
kx = 2*np.pi*np.fft.fftshift(np.fft.fftfreq(N, dx))
ky = 2*np.pi*np.fft.fftshift(np.fft.fftfreq(N, dy))
KX, KY = np.meshgrid(kx, ky)
scaling = np.exp(1j*np.pi*wavelength*z*(KX**2 + KY**2))
pattern_ft = aperture_ft*scaling
pattern = np.abs(np.fft.ifft2(np.fft.ifftshift(pattern_ft)))**2
dxp = wavelength*z/(L*N*dx)
dyp = wavelength*z/(L*N*dy)
xp = np.linspace(-wavelength*z/L, wavelength*z/L, N)
yp = np.linspace(-wavelength*z/L, wavelength*z/L, N)
return pattern, xp, yp
# Fraunhofer diffraction
pattern, kx, ky = fraunhofer_rect(633e-9, 0.1, 2e-3, 1024)
plt.imshow(pattern, extent=[kx.min(), kx.max(), ky.min(), ky.max()], cmap='gray')
plt.xlabel('kx (1/m)')
plt.ylabel('ky (1/m)')
plt.title('Fraunhofer diffraction pattern')
plt.show()
# Fresnel diffraction
pattern, xp, yp = fresnel_rect(633e-9, 0.1, 2e-3, 1024, 1.0)
plt.imshow(pattern, extent=[xp.min(), xp.max(), yp.min(), yp.max()], cmap='gray')
plt.xlabel('x (m)')
plt.ylabel('y (m)')
plt.title('Fresnel diffraction pattern (z = 1 m)')
plt.show()
这段代码中,rect
函数用于生成矩形孔的孔径函数,fraunhofer_rect
函数用于计算矩形孔的 Fraunhofer 衍射图样,fresnel_rect
函数用于计算矩形孔的 Fresnel 衍射图样。在主程序中,我们先输出 Fraunhofer 衍射图样,然后输出 Fresnel 衍射图样。你可以根据自己的需要修改函数的输入参数来生成不同的图像。
相关推荐










