激光谐振腔衍射仿真(spyder python3.11)

本文介绍了使用Anaconda中的Spyder(Python3.11)进行激光衍射仿真的详细步骤。通过傅里叶变换模拟衍射过程,展示了衍射图案的迭代变化,并分析了光强随衍射次数的变化。实验发现,衍射图案的稳定性和光强分布受初始光场分布参数a的影响。
部署运行你感兴趣的模型镜像
  • 仿真方法

使用软件说明:anaconda中的spyder(python3.11)

import numpy as np
import matplotlib.pyplot as plt

# 定义参数
lamda = 0.6*10**(-3)  # 波长
n = 800  # 网格点数
L = 800 # 腔长
R = L/2  # 曲率半径
d = 10  # 衍射面尺寸
k = 2 * np.pi / lamda

# 创建坐标网格
x = np.linspace(-d/2, d/2, n)
y = np.linspace(-d/2, d/2, n)
X, Y = np.meshgrid(x, y)

M=np.zeros((800,800),dtype=float)
#接收衍射场的范围
M[300:499,300:499]=1
#镜面孔径作用

#傅里叶变换,模拟衍射过程
#初始化相位因子
slens=1/(R)*((-1/2)*((X)**2+(Y)**2))*k
confocal=np.exp(1j*slens)
fp=1
#赋值exp(jkL)/(jL)
F0=np.exp(1j*k*L)/(1j*lamda*L)
#赋值exp[jk(X^2+Y^2)/2L]
F1=np.exp(1j*k*(X**2+Y**2)/2/L)
fF1=np.fft.fft2(F1)
a=M*np.exp(-(X**2 + Y**2) / (2*R**2))#输入光场分布



for i in range(5):  
    fa=np.fft.fft2(a)
    Fuf=fa*fF1
    U=F0*np.fft.fftshift(np.fft.ifft2(Fuf))
    maxnorm=np.max(abs(U))
    U=U/maxnorm
    a=M*U*fp
    I=abs(U)**2

    plt.figure(figsize=(6, 4))  
    plt.imshow(I, cmap='gray', extent=[-1, 1, -1, 1])  
    plt.colorbar(label='Intensity')  
    plt.title(f'Diffraction Step {i+1}')  
    plt.savefig(f'diffraction_step_{i+1}.png')  
    plt.show()  
 
#假设50次之后光场变化较稳定,模拟间隔20次的衍射图案变化    
total_intensities = []
for i in range(0, 1001, 20):  
    for _ in range(20):  
      fa=np.fft.fft2(a)
      Fuf=fa*fF1
      U=F0*np.fft.fftshift(np.fft.ifft2(Fuf))
      maxnorm=np.max(abs(U))
      U=U/maxnorm
      a=M*U*fp
      I=abs(U)**2   
      plt.figure(figsize=(6, 4))  
      plt.imshow(I, cmap='gray', extent=[-1, 1, -1, 1])  
      plt.colorbar(label='Intensity')  #增加一个光强的色条
      plt.title(f'Diffraction Step {i} (after every 20 steps)')  
      plt.savefig(f'diffraction_step_{i}_every_20.png')  
      plt.show()  # 如果不想每次都显示,可以注释掉这行代码  
      
      total_intensity = np.sum(I)  # 计算当前I的总值  
      total_intensities.append(total_intensity)  # 将总值添加到列表中 

element_count = len(total_intensities) 

plt.plot(range(element_count), total_intensities)  
plt.xlabel('Iteration')  
plt.ylabel('Total Intensity')  
plt.title('Total Intensity vs Iteration')  
plt.show()
#记录总光强随循环次数的变化

1.根据菲涅尔衍射的傅里叶变换公式写出光场函数

#傅里叶变换,模拟衍射过程

#初始化相位因子

slens=1/(R)*((-1/2)*((X)**2+(Y)**2))*k

confocal=np.exp(1j*slens)

fp=1

#赋值exp(jkL)/(jL)

F0=np.exp(1j*k*L)/(1j*lamda*L)

#赋值exp[jk(X^2+Y^2)/2L]

F1=np.exp(1j*k*(X**2+Y**2)/2/L)

fF1=np.fft.fft2(F1)

a=M*np.exp(-(X**2 + Y**2) / (2*R**2))

2.显示衍射图案

# 可视化衍射图案

plt.imshow(I, cmap='gray')

plt.title('Diffraction Pattern')

plt.xlabel('X')

plt.ylabel('Y')

plt.show()

3.分次数分间隔迭代显示并保存图片

for i in range(5): 

    fa=np.fft.fft2(a)

    Fuf=fa*fF1

    U=F0*np.fft.fftshift(np.fft.ifft2(Fuf))

    maxnorm=np.max(abs(U))

    U=U/maxnorm

    a=M*U*fp

    I=abs(U)**2

    plt.figure(figsize=(6, 4)) 

    plt.imshow(I, cmap='gray', extent=[-1, 1, -1, 1]) 

    plt.colorbar(label='Intensity')    #增加一个光强的色条

    plt.title(f'Diffraction Step {i+1}') 

    plt.savefig(f'diffraction_step_{i+1}.png') 

    plt.show() 

#假设50次之后光场变化较稳定,模拟间隔20次的衍射图案变化   

N=50

for i in range(N, 1001, 20): 

    for _ in range(20): 

      fa=np.fft.fft2(a)

      Fuf=fa*fF1

      U=F0*np.fft.fftshift(np.fft.ifft2(Fuf))

      maxnorm=np.max(abs(U))

      U=U/maxnorm

      a=M*U*fp

      I=abs(U)**2  

      plt.figure(figsize=(6, 4)) 

      plt.imshow(I, cmap='gray', extent=[-1, 1, -1, 1]) 

      plt.colorbar(label='Intensity')  #增加一个光强的色条

      plt.title(f'Diffraction Step {i} (after every 20 steps)') 

      plt.savefig(f'diffraction_step_{i}_every_20.png') 

      plt.show() 

  • 过程分析

1.输入光场分布

a=M*np.exp(-(X**2 + Y**2) / (2*R**2))

每次循环根据新的U值改变a的取值

for i in range(1000):

    fa=np.fft.fft2(a)(将光场变换到频域)

    Fuf=fa*fF1(频域相乘)

    U=F0*np.fft.fftshift(np.fft.ifft2(Fuf))(解算新的光场)

    maxnorm=np.max(abs(U))

    U=U/maxnorm(归一化防止溢出)

a=M*U*fp(经过镜面孔径作用后新的光场分布函数)

2.记录总光强随循环次数的变化

      total_intensity = np.sum(I)  # 计算当前I的总值 

      total_intensities.append(total_intensity)  # 将总值添加到列表中 (添加进循环)

element_count = len(total_intensities)

plt.plot(range(element_count), total_intensities)  plt.xlabel('Iteration') 

plt.ylabel('Total Intensity') 

plt.title('Total Intensity vs Iteration') 

plt.show()

#记录总光强随循环次数的变化

  • 结果讨论

  1. 刚开始若干单程衍射

次数1

次数3

次数2                                    

次数5

次数4

可见刚开始若干次单程衍射的图案都不一样,

图像在30-40次之间开始趋于稳定

  1. 光强随衍射次数的变化

可见光强迅速增大达到峰值,经过震荡后然后渐渐趋于稳定。

3.改变a的值

缩小a的值由10050,衍射图案缩小且发生变化。

图像在20次左右便趋于稳定(也可能是由于图像太小不好观察的缘故)

增大a100150,衍射图案放大且同样发生变化。

观察到衍射图案在80100次左右趋于稳定

可见,衍射光强分布明显受到a的取值影响。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### Spyder Python 3.11 GDAL 小车运行 示例代码 或 解决方案 Spyder 是一个强大的 Python 集成开发环境(IDE),适用于科学计算和数据分析[^1]。GDAL 是一个用于处理地理空间数据的库,可以通过 Anaconda 环境轻松安装[^3]。以下是一个结合 SpyderPython 3.11 和 GDAL 的示例解决方案,展示如何加载和处理栅格数据,并模拟“小车运行”的场景。 #### 示例代码:使用 GDAL 加载栅格数据并模拟小车运行 ```python from osgeo import gdal import numpy as np # 打开栅格数据文件 def open_raster(file_path): dataset = gdal.Open(file_path, gdal.GA_ReadOnly) if dataset is None: print("无法打开栅格文件") return None return dataset # 获取栅格数据的值 def get_raster_data(dataset): band = dataset.GetRasterBand(1) # 假设使用第一个波段 data = band.ReadAsArray() return data # 模拟小车运行逻辑 def simulate_car_movement(raster_data): rows, cols = raster_data.shape start_row, start_col = rows // 2, cols // 2 # 小车从中心开始 path = [(start_row, start_col)] for i in range(10): # 模拟10步移动 current_row, current_col = path[-1] # 简单规则:向右移动 next_col = min(current_col + 1, cols - 1) path.append((current_row, next_col)) return path # 主函数 if __name__ == '__main__': file_path = "example.tif" # 替换为实际的栅格文件路径 dataset = open_raster(file_path) if dataset is not None: raster_data = get_raster_data(dataset) car_path = simulate_car_movement(raster_data) print("小车路径:", car_path) ``` #### 说明 - 使用 `osgeo.gdal` 加载栅格数据文件[^3]。 - 栅格数据被读取为 NumPy 数组,便于后续处理。 - 小车的运行逻辑简单地定义为从栅格中心向右移动[^1]。 #### 安装 GDAL 和 Spyder 的步骤 1. 创建一个新的 Anaconda 环境: ```bash conda create --name pygdal python=3.11 ``` 2. 激活该环境: ```bash conda activate pygdal ``` 3. 安装 GDAL: ```bash conda install -c conda-forge gdal ``` 4. 安装 Spyder: ```bash conda install spyder ``` 确保在激活的环境中运行 Spyder,以加载正确的依赖项[^1]。 --- ### 注意事项 - 如果在 Windows 环境下使用 `multiprocessing`,需要确保代码包含 `if __name__ == '__main__':` 的保护语句[^2]。 - 对于复杂的地理空间数据处理任务,可以结合 `rasterio` 和其他库进行扩展[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值