Python光学仿真学习衍射算法初步理解
作者:微小冷 发布时间:2021-01-07 13:54:46
标签:光学仿真,衍射,算法
对衍射最经典的解释是Huygens-Fresnel原理,Huygens认为波阵面上每一点都会成为新的波源,这些子波源的相互干涉就形成了衍射。这显然是一种离散的观点,仿佛是专门为程序员准备的一样。
假设一束光打在一个方形孔上,这个方形孔被细分成 n×n个网格,那么每个网格都相当于是一个小孔,而这些小孔的互相干涉,即为衍射。随着网格不断被细分,最终可以逼近真实的衍射情形。那么,假设矩孔处为等相位面,其网格坐标为 (i,j),到衍射屏距离为 d d d,那么对于衍射屏上任意一点P(x,y),其光强为
同理,我们刚刚写下的平面矩孔光强叠加也出现了问题,如果我们默认矩孔上每个格点都是一个点光源,那么打在衍射屏上之后,应该遵从球面波的衰减原则。又因为这种假设其实忽略了从光源射到矩孔过程中的光线的传播方向,所以应该有一个倾斜因子,即 ( i , j ) 点打在 ( x , y )点的光强为
#基尔霍夫衍射,衍射屏坐标范围-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
其结果为
故可定义矩阵索引
#输入对于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


猜你喜欢
- 初识word文档-节-的概念编辑一篇word文档,往往首先从页面设置开始,从下图可以看出,页面设置常操作的有页边距、纸张方向、纸张大小4个,
- 本文实例讲述了Python求导数的方法。分享给大家供大家参考。具体实现方法如下:def func(coeff): sum=
- 本文实例讲述了Python实现抓取HTML网页并以PDF文件形式保存的方法。分享给大家供大家参考,具体如下:一、前言今天介绍将HTML网页抓
- 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方
- 书 名:细节决定交互设计的成败国际书号:ISBN 978-7-121-08232-0作 &nb
- 一、背景我们在进行代码调试时,通常使用两种方式。print 输出调试的内容或者标识通过断点调试debug但是我想知道代码的中间的每一行程序运
- 前言今天继续为大家更新Go语言学习记录的文章。首先说明pointer指针和switch是两个并没有直接关系的知识点,放在一篇文章中将的原因是
- 1.open使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。fi
- 在前面的博文中,我们介绍了如何通过软件模拟实现共享磁盘(https://www.jb51.net/network/592807.html),
- 众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著。前些天我做自己
- 今天有点囧a=['XXXX_game.sql', 'XXXX_game_sp.sql', 'XXXX
- strip_tags定义和用法strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。注释:该函数始终会剥离
- 下面通过文字说明和代码分析的方式给大家分享移动端图片上传之localResizeIMG先压缩后ajax无刷新上传,具体实现过程请看下文。现在
- 最近写项目需要画出应用程序调用链的网路拓扑图,完全自己写需要花费些时间,那么首先想到的是echarts,但echarts的自定义写法写起来非
- 前言有时候我们需要把图片填充成某个数字的整数倍才能送进模型。例如,有些模型下采样倍率是8倍,或者16倍,那么输入的长和高就分别应该是8或16
- 本文实例讲述了python创建一个最简单http webserver服务器的方法。分享给大家供大家参考。具体实现方法如下:import sy
- 1. 从键盘输入一个整数,求 100 除以它的商,并显示输出。要求对从键盘输入的数值进行异常处理。try: n=i
- 废话不多说,直接上代码吧!/** * 函数防抖 (只执行最后一次点击) * @param fn * @param delay * @retu
- 最近在使用python做接口测试,发现python中http请求方法有许多种,今天抽点时间把相关内容整理,分享给大家,具体内容如下所示:一、
- 学习到的内容:1.一个64位的int类型值,充分利用高32位和低32位,进行相关加减以及从一个64位中拆出高32位和低32位.扩展:如何自己