Python光學(xué)仿真數(shù)值分析求解波動(dòng)方程繪制波包變化圖
波動(dòng)方程數(shù)值解
波動(dòng)方程是三大物理方程之一,也就是弦振動(dòng)方程,其特點(diǎn)是時(shí)間與空間均為二階偏導(dǎo)數(shù)。其自由空間解便是我們熟知的三角函數(shù)形式,也可以寫(xiě)成自然虛指數(shù)形式。
一般來(lái)說(shuō),既然有了精確的解析解,那也就沒(méi)必要再去做不精確的數(shù)值模擬,但數(shù)值模擬的好處有兩個(gè),一是避免無(wú)窮小,從而在思維上更加直觀;二是頗具啟發(fā)性,對(duì)于一些解析無(wú)解的情況也有一定的處理能力。
對(duì)此,我們首先考慮一維波動(dòng)方程
import numpy as np import matplotlib.pyplot as plt def set_y0(x,k,L): y = np.zeros_like(x) y[x<L] = np.sin(k*x[x<L])*np.sin(np.abs(x[x<L]*np.pi/L)) return y if __name__ == "__main__": x = np.linspace(0,10,1000) k = np.pi*2/1.064 L = 5 y = set_y0(x,k,L) plt.plot(x,y) plt.show()
其形狀為
現(xiàn)考慮讓這個(gè)光波在 [ 0 , L ] 范圍內(nèi)往返傳播,在此采用Dirichlet邊界條件,取
至此,我們得到了光場(chǎng)的所有信息,原則上可以預(yù)測(cè)這個(gè)波包的所有行為,其迭代過(guò)程為
def wave1d(x,t,k,L): dx = x[1]-x[0] dt = t[1]-t[0] d2 = (dt/dx)**2 y = np.zeros([len(t),len(x)]) y[0,:] = set_y0(x,k,L) y[1,:] = set_y0(x-dt,k,L) for n in range(2,len(t)): y[n] = 2*y[n-1] - y[n-2] - d2*2*y[n-1] y[n,1:] += d2*y[n-1,:-1] y[n,:-1] += d2*y[n-1,1:] #邊界條件 y[n,0] = 0 y[n,-1] = 0 return y
由于 y y y是隨時(shí)間變化的參量,現(xiàn)有的matplotlib.pyplot
已經(jīng)無(wú)法滿足我們繪制動(dòng)態(tài)圖片的需求,所以引入animation
來(lái)進(jìn)行繪制,其代碼為
import matplotlib.animation as animation #輸入時(shí)間,自變量,因變量,圖題標(biāo)記 def drawGif(t,x,ys,mark="time="): tAxis = np.linspace(0,len(t)-1,100).astype(int) fig = plt.figure() ax = fig.add_subplot(111,xlim=(0,10),ylim=(-1.5,1.5)) ax.grid() line, = ax.plot([],[],lw=0.2) time_text = ax.text(0.1,0.9,'',transform=ax.transAxes) def init(): line.set_data([],[]) time_text.set_text("") return line, time_text def animate(i): y = ys[i] line.set_data(x,y) time_text.set_text(mark+str(t[i])) return line, time_text # 動(dòng)態(tài)圖繪制命令 # 輸入分別為畫(huà)圖窗口,動(dòng)畫(huà)函數(shù),動(dòng)畫(huà)函數(shù)輸入變量,延時(shí),初始函數(shù) ani = animation.FuncAnimation(fig, animate, tAxis, interval=200, init_func=init) #通過(guò)imagemagick引擎來(lái)保存gif ani.save('wave.gif',writer='imagemagick') plt.show() if __name__ == "__main__": x = np.linspace(0,10,1000) t = np.linspace(0,12,2041) k = np.pi*2/1.064 L = 5 y = wave1d(x,t,k,L) drawGif(t,x,y)
得到結(jié)果為
這個(gè)圖雖然很符合我們的預(yù)期,但有些物理過(guò)程并不清晰,我們不妨把初始波包設(shè)置為只有一個(gè)波峰的孤波
def set_y0(x,k,L): y = np.zeros_like(x) y[x<L] = np.sin(np.abs(x[x<L]*np.pi/L)) return y
其圖像為
我們可以清晰地看到,正弦波通過(guò)腔壁后,其震動(dòng)方向發(fā)生了變化,此即半波損失。
以上就是Python光學(xué)仿真數(shù)值分析求解波動(dòng)方程繪制波包變化圖的詳細(xì)內(nèi)容,更多關(guān)于Python數(shù)值分析求解波動(dòng)方程繪制波包變化圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python OpenCV實(shí)現(xiàn)攝像頭人臉識(shí)別功能
這篇文章主要介紹了Python OpenCV實(shí)現(xiàn)攝像頭人臉識(shí)別,使用Python 3和OpenCV進(jìn)行攝像頭人臉識(shí)別的基本步驟,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07python函數(shù)enumerate,operator和Counter使用技巧實(shí)例小結(jié)
這篇文章主要介紹了python函數(shù)enumerate,operator和Counter使用技巧,結(jié)合實(shí)例形式總結(jié)分析了python內(nèi)置函數(shù)enumerate,operator和Counter基本功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-02-02python使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法詳解
這篇文章主要介紹了python使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法,結(jié)合實(shí)例形式詳細(xì)分析了Python協(xié)程的原理及使用Gevent實(shí)現(xiàn)協(xié)程操作的相關(guān)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-12-12python實(shí)現(xiàn)兩張圖片拼接為一張圖片并保存
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)兩張圖片拼接為一張圖片并保存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07詳解Python中4種超參自動(dòng)優(yōu)化算法的實(shí)現(xiàn)
要想模型效果好,每個(gè)算法工程師都應(yīng)該了解的流行超參數(shù)調(diào)優(yōu)技術(shù)。今天給大家總結(jié)超參自動(dòng)優(yōu)化方法:網(wǎng)格搜索、隨機(jī)搜索、貝葉斯優(yōu)化?和?Hyperband,感興趣的可以了解一下2022-05-05python將字典內(nèi)容寫(xiě)入json文件的實(shí)例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于python將字典內(nèi)容寫(xiě)入json文件的實(shí)例代碼,有需要的朋友們可以參考下。2020-08-08對(duì)Python中列表和數(shù)組的賦值,淺拷貝和深拷貝的實(shí)例講解
今天小編就為大家分享一篇對(duì)Python中列表和數(shù)組的賦值,淺拷貝和深拷貝的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06