溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python光學仿真數(shù)值分析怎么求解波動方程繪制波包變化圖

發(fā)布時間:2021-10-20 15:24:28 來源:億速云 閱讀:143 作者:iii 欄目:開發(fā)技術

本篇內容介紹了“Python光學仿真數(shù)值分析怎么求解波動方程繪制波包變化圖”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

波動方程數(shù)值解

波動方程是三大物理方程之一,也就是弦振動方程,其特點是時間與空間均為二階偏導數(shù)。其自由空間解便是我們熟知的三角函數(shù)形式,也可以寫成自然虛指數(shù)形式。

一般來說,既然有了精確的解析解,那也就沒必要再去做不精確的數(shù)值模擬,但數(shù)值模擬的好處有兩個,一是避免無窮小,從而在思維上更加直觀;二是頗具啟發(fā)性,對于一些解析無解的情況也有一定的處理能力。

對此,我們首先考慮一維波動方程

Python光學仿真數(shù)值分析怎么求解波動方程繪制波包變化圖

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()

其形狀為

Python光學仿真數(shù)值分析怎么求解波動方程繪制波包變化圖

現(xiàn)考慮讓這個光波在 [ 0 , L ] 范圍內往返傳播,在此采用Dirichlet邊界條件,取

Python光學仿真數(shù)值分析怎么求解波動方程繪制波包變化圖

至此,我們得到了光場的所有信息,原則上可以預測這個波包的所有行為,其迭代過程為

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是隨時間變化的參量,現(xiàn)有的matplotlib.pyplot已經無法滿足我們繪制動態(tài)圖片的需求,所以引入animation來進行繪制,其代碼為

import matplotlib.animation as animation
#輸入時間,自變量,因變量,圖題標記
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
    # 動態(tài)圖繪制命令
    # 輸入分別為畫圖窗口,動畫函數(shù),動畫函數(shù)輸入變量,延時,初始函數(shù)
    ani = animation.FuncAnimation(fig, animate, tAxis,
        interval=200, init_func=init)
    #通過imagemagick引擎來保存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)

得到結果為

Python光學仿真數(shù)值分析怎么求解波動方程繪制波包變化圖

這個圖雖然很符合我們的預期,但有些物理過程并不清晰,我們不妨把初始波包設置為只有一個波峰的孤波

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

其圖像為

Python光學仿真數(shù)值分析怎么求解波動方程繪制波包變化圖

我們可以清晰地看到,正弦波通過腔壁后,其震動方向發(fā)生了變化,此即半波損失。

“Python光學仿真數(shù)值分析怎么求解波動方程繪制波包變化圖”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI