Python——一维波动方程求解

1、一维波动方程简介

     以线的横振动方程作为一维波动方程的例子,其运动学方程满足:

 

     在上式中为线密度;T为张力;代表强迫力的大小。当没有外力,且线的密度均匀等于,我们可以取,将一维波动方程化简为:

2、一维波动方程的差分解法

     在给定的初始条件:

 

     以及给定的边界条件:

     我们可以使用差分的方法将一维波动方程写为两种差分格式:

     第一种差分格式:

     第二种差分格式:   

   两种差分收敛条件:

 

2、问题

     用一种差分格式计算波动方程混合问题:

  1. α=1,h=0.2,计算k=1,2,3,4层的值;
  2. α=1,h=0.05,分别用两种差分格式计算k=1,2,20层的近似值。

 3、程序

#python
import numpy as np
import math as ma
from matplotlib import pyplot as plt
#问题1算法
def n1(a,h,N,v):
    def f1(x,h,t):
        y=ma.sin(x*h*ma.pi)+x*h*t*(1-x*h)
        return y
    def f2(x,h):
        y=ma.sin(x*h*ma.pi)
        return y
    def f3(x1,x2,x3):
        y=x1+x2-x3
        return y
    t=a*h/v
    y_t=np.zeros((N-1,N))
    for i in range(N-1):
        if i==0:
            for j in range(N-1):
                y_t[i,j]=f2(j,h)
        if i==1:
            for j in range(N-1):
                y_t[i,j]=f1(j,h,t)
        if i>1:
            for j in range(1,N-1):
                y_t[i,j]=f3(y_t[i-1,j+1],y_t[i-1,j-1],y_t[i-2,j])
    return y_t
#问题2算法
def n2(a,h,N,v):
    def f1(x,h,t):
        y=1/2*(ma.sin((x+1)*h*ma.pi)+ma.sin((x-1)*h*ma.pi)+x*h*t*(1-x*h))
        return y
    def f2(x,h):
        y=ma.sin(x*h*ma.pi)
        return y
    def f3(x1,x2,x3):
        y=x1+x2-x3
        return y
    t=a*h/v;
    y_t=np.zeros((N-1,N));
    for i in range(N-1):
        if i==0:
            for j in range(N-1):
                y_t[i,j]=f2(j,h);
        if i==1:
            for j in range(1,N-1):
                y_t[i,j]=f1(j,h,t)
        if i>1:
            for j in range(1,N-2):
                y_t[i,j]=f3(y_t[i-1,j+1],y_t[i-1,j-1],y_t[i-2,j])
    return y_t
#问题1答案
a1=1;h1=0.2;N1=6;v1=1;
y1=n1(a1,h1,N1,v1)
#问题2答案
a2=1;h2=0.05;v2=1;N2=21
y2=n1(a2,h2,N2,v2)
a3=1;h3=0.05;v3=1;N3=21
y3=n2(a3,h3,N3,v3);
#结果展示
x1=[];t1=[]
for n in range(0,6):
    x1.append(n)
for m in range(0, 5):
    t1.append(m*0.05)
x1=np.array(x1)
t1=np.array(t1)
x,y=np.meshgrid(x1,t1)
z=y1
d3=plt.axes(projection='3d')
d3.plot_surface(x,y,z,cmap='rainbow')
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
d3.set_zlabel('Z(y方向位移)/m')
d3.set_xlabel('X(位置)/m')
d3.set_ylabel('T(时间)/s')
d3.set_title('一维波动方程')
plt.show()
x2=[];t2=[];t_m2=a2*h2/v2
for n in range(0,N2):
    x2.append(n)
for m in range(0,N2-1):
    t2.append(m*t_m2)
x2=np.array(x2)
t2=np.array(t2)
x,y=np.meshgrid(x2,t2)
z=y2
d3=plt.axes(projection='3d')
d3.plot_surface(x,y,z,cmap='rainbow')
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
d3.set_zlabel('Z(y方向位移)/m')
d3.set_xlabel('X(位置)/m')
d3.set_ylabel('T(时间)/s')
d3.set_title('一维波动方程')
plt.show()
x3=[];t3=[];t_m3=a3*h2/v2
for n in range(0,N3):
    x3.append(n)
for m in range(0,N3-1):
    t3.append(m*t_m3)
x3=np.array(x3)
t3=np.array(t3)
x,y=np.meshgrid(x3,t3)
z=y3
d3=plt.axes(projection='3d')
d3.plot_surface(x,y,z,cmap='rainbow')
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
d3.set_zlabel('Z(y方向位移)/m')
d3.set_xlabel('X(位置)/m')
d3.set_ylabel('T(时间)/s')
d3.set_title('一维波动方程')
plt.show()

4、结果

Fig1.问题1

Fig2.问题2-1

Fig3.问题2-2

Fig4.N=40

Fig5.N=60

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eyu.sir

谢谢。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值