iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python光学仿真数值分析求解波动方程绘制波包变化图
  • 593
分享到

Python光学仿真数值分析求解波动方程绘制波包变化图

2024-04-02 19:04:59 593人浏览 薄情痞子

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数值分析求解波动方程绘制波包变化图的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python光学仿真数值分析求解波动方程绘制波包变化图

本文链接: https://www.lsjlt.com/news/154966.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作