Python光學(xué)仿真學(xué)習(xí)衍射算法初步理解
對(duì)衍射最經(jīng)典的解釋是Huygens-Fresnel原理,Huygens認(rèn)為波陣面上每一點(diǎn)都會(huì)成為新的波源,這些子波源的相互干涉就形成了衍射。這顯然是一種離散的觀點(diǎn),仿佛是專門為程序員準(zhǔn)備的一樣。
假設(shè)一束光打在一個(gè)方形孔上,這個(gè)方形孔被細(xì)分成 n×n個(gè)網(wǎng)格,那么每個(gè)網(wǎng)格都相當(dāng)于是一個(gè)小孔,而這些小孔的互相干涉,即為衍射。隨著網(wǎng)格不斷被細(xì)分,最終可以逼近真實(shí)的衍射情形。那么,假設(shè)矩孔處為等相位面,其網(wǎng)格坐標(biāo)為 (i,j),到衍射屏距離為 d d d,那么對(duì)于衍射屏上任意一點(diǎn)P(x,y),其光強(qiáng)為
同理,我們剛剛寫下的平面矩孔光強(qiáng)疊加也出現(xiàn)了問題,如果我們默認(rèn)矩孔上每個(gè)格點(diǎn)都是一個(gè)點(diǎn)光源,那么打在衍射屏上之后,應(yīng)該遵從球面波的衰減原則。又因?yàn)檫@種假設(shè)其實(shí)忽略了從光源射到矩孔過程中的光線的傳播方向,所以應(yīng)該有一個(gè)傾斜因子,即 ( i , j ) 點(diǎn)打在 ( x , y )點(diǎn)的光強(qiáng)為
#基爾霍夫衍射,衍射屏坐標(biāo)范圍-dGrid:dGrid,光源坐標(biāo)(0,0) #簡單的矩孔衍射,dSource為光源到小孔的距離;dScreen為衍射屏到小孔距離 #dHole為矩孔網(wǎng)格尺寸;dGrid為衍射屏網(wǎng)格尺寸;nGrid為網(wǎng)格數(shù)目 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坐標(biāo) axisX = np.arange(-nX,nX+1)*dHole axisY = np.arange(-nY,nY+1)*dHole xHole,yHole = np.meshgrid(axisX,axisY) #此為矩孔的x坐標(biāo) dArrS = np.sqrt(xHole**2+yHole**2+dSource**2) #孔平面到光源的距離 nSide = int(nGrid*2+1) #格點(diǎn)個(gè)數(shù) pane = np.zeros([nSide,nSide]) #衍射屏強(qiáng)度 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
其結(jié)果為
故可定義矩陣索引
#輸入對(duì)于M*M矩陣的第一個(gè)值到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翻轉(zhuǎn)矩陣
相應(yīng)地算法改為(其他位置不變)
dArrS = np.sqrt(xHole**2+yHole**2+dSource**2) #孔平面到光源的距離 dScreen = np.sqrt( #衍射平上第(0,0)個(gè)點(diǎn)的距離矩陣 (xHole-xAxis[0,0])**2+(yHole-yAxis[0,0])**2+dScreen**2) nSide = int(nGrid*2+1) #格點(diǎn)個(gè)數(shù) pane = np.zeros([nSide,nSide]) #衍射屏強(qiáng)度 for m in range(nSide): for n in range(nSide): dArr = getDisMat(dScreen,nSide,m,n)
但這種優(yōu)化是極其有限的,這是直觀無腦的思維方式所帶來的麻煩。在接下來的傅里葉光學(xué)中,我們將繼續(xù)處理衍射的計(jì)算問題。
以上就是Python光學(xué)仿真學(xué)習(xí)衍射算法初步理解的詳細(xì)內(nèi)容,更多關(guān)于Python光學(xué)仿真衍射算法的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python光學(xué)仿真從Maxwell方程組到波動(dòng)方程矢量算法理解學(xué)習(xí)
- Python算法繪制特洛伊小行星群實(shí)現(xiàn)示例
- Python數(shù)學(xué)建模學(xué)習(xí)模擬退火算法旅行商問題示例解析
- Python數(shù)學(xué)建模學(xué)習(xí)模擬退火算法整數(shù)規(guī)劃問題示例解析
- Python數(shù)學(xué)建模學(xué)習(xí)模擬退火算法約束條件處理示例解析
- Python數(shù)學(xué)建模學(xué)習(xí)模擬退火算法多變量函數(shù)優(yōu)化示例解析
- Python 數(shù)據(jù)結(jié)構(gòu)之十大經(jīng)典排序算法一文通關(guān)
- Python 經(jīng)典貪心算法之Prim算法案例詳解
- python算法練習(xí)之抓交通肇事犯
相關(guān)文章
解決pytorch GPU 計(jì)算過程中出現(xiàn)內(nèi)存耗盡的問題
今天小編就為大家分享一篇解決pytorch GPU 計(jì)算過程中出現(xiàn)內(nèi)存耗盡的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08python基礎(chǔ)教程之匿名函數(shù)lambda
這篇文章主要介紹了 python基礎(chǔ)教程之匿名函數(shù)lambda的相關(guān)資料,需要的朋友可以參考下2017-01-01Django 如何從request中獲取前端數(shù)據(jù)
這篇文章主要介紹了Django從request中獲取前端數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04python subprocess pipe 實(shí)時(shí)輸出日志的操作
這篇文章主要介紹了python subprocess pipe 實(shí)時(shí)輸出日志的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12Keras存在自定義loss或layer怎樣解決load_model報(bào)錯(cuò)問題
這篇文章主要介紹了Keras存在自定義loss或layer怎樣解決load_model報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09python GUI庫圖形界面開發(fā)之PyQt5菜單欄控件QMenuBar的詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5菜單欄控件QMenuBar的詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02