文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

对衍射最经典的解释是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)

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

以上就是Python光学仿真学习衍射算法初步理解的详细内容,更多关于Python光学仿真衍射算法的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯