角谱衍射仿真 python
时间: 2025-06-08 07:58:26 浏览: 13
### Python 角谱衍射仿真实现方法
角谱法是一种用于模拟光学系统的传播现象的方法,特别适用于远场和近场的衍射分析。以下是基于Python实现角谱衍射仿真的具体方法以及所需库。
#### 所需库
为了完成角谱衍射仿真,通常需要用到以下Python科学计算库:
- **NumPy**: 提供高效的数组操作功能。
- **SciPy**: 提供快速傅里叶变换(FFT)和其他数值运算工具。
- **Matplotlib**: 用于可视化结果。
这些库可以通过`pip install numpy scipy matplotlib`命令安装。
---
#### 基本原理
角谱法的核心思想是通过傅里叶变换将空间域中的光场转换到频域,在频域中应用传输函数后再逆变换回空间域。其主要步骤如下:
1. 将初始光场分布 $U_0(x, y)$ 进行二维离散傅里叶变换得到角谱 $A(f_x, f_y)$。
2. 对于给定距离$z$,应用自由空间传播因子 $\exp(i \cdot 2\pi z \sqrt{f_\lambda^2 - f_x^2 - f_y^2})$ 到角谱上[^3]。
3. 使用逆傅里叶变换将修改后的角谱变回到空间域,获得新的光场分布 $U(z, x, y)$。
其中,$f_\lambda = 1/\lambda$ 是波数对应的频率上限,$\lambda$ 表示波长。
---
#### 实现代码
下面是一个简单的Python脚本,展示如何使用角谱法进行衍射仿真:
```python
import numpy as np
from scipy.fftpack import fftshift, ifftshift, fft2, ifft2
import matplotlib.pyplot as plt
# 参数设置
wavelength = 500e-9 # 波长 (米)
k = 2 * np.pi / wavelength # 波矢
dx = dy = 1e-6 # 空间采样间隔 (米)
Lx = Ly = 0.001 # 平面大小 (米)
Nx = Ny = int(Lx / dx) # 网格点数量
distance = 0.1 # 传播距离 (米)
# 创建网格
x = np.linspace(-Lx / 2, Lx / 2, Nx)
y = np.linspace(-Ly / 2, Ly / 2, Ny)
X, Y = np.meshgrid(x, y)
# 初始光场分布(假设为圆形孔)
radius = 0.0002 # 圆形孔半径 (米)
initial_field = np.where(np.sqrt(X**2 + Y**2) <= radius, 1.0, 0.0)
# 频率轴
fx = np.fft.fftshift(np.fft.fftfreq(Nx, d=dx))
fy = np.fft.fftshift(np.fft.fftfreq(Ny, d=dy))
FX, FY = np.meshgrid(fx, fy)
# 自由空间传播因子
propagation_factor = np.exp(
1j * 2 * np.pi * distance *
np.sqrt((1 / wavelength)**2 - FX**2 - FY**2 + 0j)
)
# 角谱法核心过程
spectrum = fftshift(fft2(ifftshift(initial_field))) # 获得角谱
final_spectrum = spectrum * propagation_factor # 应用传播因子
final_field = ifftshift(ifft2(fftshift(final_spectrum))).real # 返回空间域
# 可视化结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title("Initial Field Distribution")
plt.pcolormesh(X, Y, initial_field, shading='auto', cmap="viridis")
plt.colorbar()
plt.axis('equal')
plt.subplot(1, 2, 2)
plt.title("Final Field Distribution after Propagation")
plt.pcolormesh(X, Y, final_field, shading='auto', cmap="viridis")
plt.colorbar()
plt.axis('equal')
plt.tight_layout()
plt.show()
```
此代码实现了从一个圆形单位振幅光场出发,经过指定距离传播后的新光场分布。
---
#### 关键参数说明
- `wavelength`: 光波的波长,决定了衍射效应的程度。
- `distance`: 传播距离,影响最终光场的空间分布。
- `dx`, `dy`: 空间采样步长,决定分辨率和计算精度。
- `radius`: 初始光场形状(此处为圆形),可以根据实际需求调整。
以上代码展示了完整的流程,并提供了清晰的结果可视化方式。
---
阅读全文
相关推荐
















