Python数值分析求解波动方程绘制波包变化图 Python光学仿真数值分析求解波动方程绘制波包变化图
微小冷 人气:0想了解Python光学仿真数值分析求解波动方程绘制波包变化图的相关内容吗,微小冷在本文为您仔细讲解Python数值分析求解波动方程绘制波包变化图的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Python光学仿真,Python数值分析求解波动方程,Python绘制波包变化图,下面大家一起来学习吧。
波动方程数值解
波动方程是三大物理方程之一,也就是弦振动方程,其特点是时间与空间均为二阶偏导数。其自由空间解便是我们熟知的三角函数形式,也可以写成自然虚指数形式。
一般来说,既然有了精确的解析解,那也就没必要再去做不精确的数值模拟,但数值模拟的好处有两个,一是避免无穷小,从而在思维上更加直观;二是颇具启发性,对于一些解析无解的情况也有一定的处理能力。
对此,我们首先考虑一维波动方程
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()
其形状为
现考虑让这个光波在 [ 0 , L ] 范围内往返传播,在此采用Dirichlet边界条件,取
至此,我们得到了光场的所有信息,原则上可以预测这个波包的所有行为,其迭代过程为
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是随时间变化的参量,现有的matplotlib.pyplot
已经无法满足我们绘制动态图片的需求,所以引入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 # 动态图绘制命令 # 输入分别为画图窗口,动画函数,动画函数输入变量,延时,初始函数 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)
得到结果为
这个图虽然很符合我们的预期,但有些物理过程并不清晰,我们不妨把初始波包设置为只有一个波峰的孤波
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光学仿真数值分析求解波动方程绘制波包变化图的详细内容,更多关于Python数值分析求解波动方程绘制波包变化图的资料请关注其它相关文章!
加载全部内容