Python光学仿真学习衍射算法初步理解

作者:微小冷 时间:2021-01-07 13:54:46 

对衍射最经典的解释是Huygens-Fresnel原理,Huygens认为波阵面上每一点都会成为新的波源,这些子波源的相互干涉就形成了衍射。这显然是一种离散的观点,仿佛是专门为程序员准备的一样。

假设一束光打在一个方形孔上,这个方形孔被细分成 n×n个网格,那么每个网格都相当于是一个小孔,而这些小孔的互相干涉,即为衍射。随着网格不断被细分,最终可以逼近真实的衍射情形。那么,假设矩孔处为等相位面,其网格坐标为  (i,j),到衍射屏距离为 d d d,那么对于衍射屏上任意一点P(x,y),其光强为

Python光学仿真学习衍射算法初步理解

同理,我们刚刚写下的平面矩孔光强叠加也出现了问题,如果我们默认矩孔上每个格点都是一个点光源,那么打在衍射屏上之后,应该遵从球面波的衰减原则。又因为这种假设其实忽略了从光源射到矩孔过程中的光线的传播方向,所以应该有一个倾斜因子,即 ( i , j ) 点打在 ( x , y )点的光强为

Python光学仿真学习衍射算法初步理解


#基尔霍夫衍射,衍射屏坐标范围-dGrid:dGrid,光源坐标(0,0)
#简单的矩孔衍射,dSource为光源到小孔的距离;dScreen为衍射屏到小孔距离
#dHole为矩孔网格尺寸;dGrid为衍射屏网格尺寸;nGrid为网格数目
def squareDiff(dSource=1,dScreen=1.4,dWave=1e-6,
           dHole=3e-5,nGrid=100,dGrid=1e-5):
   nX,nY = nGrid*np.array([1,1])
   axisX = np.arange(-nX,nX+1)*dGrid      
   axisY = np.arange(-nY,nY+1)*dGrid
   xAxis,yAxis = np.meshgrid(axisX,axisY)  #此为衍射屏的x坐标
   axisX = np.arange(-nX,nX+1)*dHole      
   axisY = np.arange(-nY,nY+1)*dHole
   xHole,yHole = np.meshgrid(axisX,axisY)  #此为矩孔的x坐标
   dArrS = np.sqrt(xHole**2+yHole**2+dSource**2)   #孔平面到光源的距离
   nSide = int(nGrid*2+1)              #格点个数
   pane = np.zeros([nSide,nSide])      #衍射屏强度
   for m in range(nSide):
       for n in range(nSide):
           dArr = np.sqrt((xHole-xAxis[m,n])**2+(yHole-yAxis[m,n])**2+dScreen**2)
           pane[m,n] = np.sum(
               np.cos(np.pi*2*(dArr+dArrS)/dWave)/dArr/dArrS)
   pane = np.abs(pane)
   pane = pane/np.max(np.array(pane))
   fig = plt.figure()
   ax = axd(fig)
   ax.plot_surface(xAxis,yAxis,pane)
   plt.show()
   return pane, xAxis, yAxis

其结果为

Python光学仿真学习衍射算法初步理解

Python光学仿真学习衍射算法初步理解

故可定义矩阵索引


#输入对于M*M矩阵的第一个值到N*N矩阵的距离,返回M(m,n)的距离矩阵
def getDisMat(dMat,N,m,n):
   dMat = np.mat(dMat)
   A = dMat[1:m,1:n]
   B = dMat[1:m,0:N-n+1]
   C = dMat[0:N-m+1,1:n]
   D = dMat[0:N-m+1,0:N-n+1]
   return np.vstack((np.hstack((np.flip(A),np.flipud(B))),np.hstack((np.fliplr(C),D))))    #stack矩阵拼接,flip翻转矩阵

相应地算法改为(其他位置不变)


   dArrS = np.sqrt(xHole**2+yHole**2+dSource**2) #孔平面到光源的距离
   dScreen = np.sqrt(                             #衍射平上第(0,0)个点的距离矩阵
       (xHole-xAxis[0,0])**2+(yHole-yAxis[0,0])**2+dScreen**2)
   nSide = int(nGrid*2+1)              #格点个数
   pane = np.zeros([nSide,nSide])      #衍射屏强度
   for m in range(nSide):
       for n in range(nSide):
           dArr = getDisMat(dScreen,nSide,m,n)

但这种优化是极其有限的,这是直观无脑的思维方式所带来的麻烦。在接下来的傅里叶光学中,我们将继续处理衍射的计算问题。

来源:https://blog.csdn.net/m0_37816922/article/details/109587926

标签:光学仿真,衍射,算法
0
投稿

猜你喜欢

  • python中判断数字是否为质数的实例讲解

    2022-02-17 13:19:05
  • python中数组和列表的简单实例

    2021-04-15 20:04:42
  • python 安全地删除列表元素的方法

    2022-11-20 16:21:35
  • JS 页面自动加载函数(兼容多浏览器)

    2024-04-19 09:51:04
  • Python 在OpenCV里实现仿射变换—坐标变换效果

    2022-06-19 15:13:40
  • Python任务调度模块APScheduler使用

    2021-08-23 05:45:44
  • 详解Python计算机视觉 图像扭曲(仿射扭曲)

    2021-06-13 15:57:43
  • SQL SERVER2012中新增函数之字符串函数CONCAT详解

    2024-01-23 18:15:23
  • 简单了解什么是神经网络

    2023-10-11 22:26:34
  • python获取酷狗音乐top500的下载地址 MP3格式

    2021-05-06 04:38:05
  • 详解python数值与字符串高级用法

    2021-08-07 15:05:52
  • centos6使用docker部署redis主从数据库操作示例

    2024-01-12 16:46:06
  • Sub-Pixel Bug?!

    2010-03-24 18:09:00
  • 有时间先后的翻页

    2008-05-23 13:14:00
  • 重新restore了mysql到另一台机器上后mysql 编码问题报错

    2024-01-24 05:10:41
  • Python基本数据类型之字符串str

    2021-06-03 22:47:31
  • 使用C#连接并读取MongoDB数据库

    2024-01-15 17:12:13
  • node.js 中国天气预报 简单实现

    2024-05-13 10:05:44
  • SQL语句中OR和AND的混合使用的小技巧

    2024-01-13 12:40:22
  • rs.open与conn.execute详细解释

    2008-07-03 12:54:00
  • asp之家 网络编程 m.aspxhome.com