尝试绘制一维波动方程以进行基准测试

计算科学 数值分析 波传播
2021-12-11 11:37:58

我正在尝试使用 python 绘制一维波动方程的参考解。

上面的链接说明如下:对于固定在右端并在左端自由并在左端受到锤击的杆t=0s 其中锤击引起恒定速度V0从发生x<a<L,位移如下:

An=2V0asin((n12)πa/L)vπ(n12)2πa/L

ψ(x,t)=n=1,cos((n12)πx/L)sin((n12)πt/τ)

在哪里τ=L/c, ψ是位移,v=E/ρa是初始速度的距离V0发生。

看来作者用过cτ=L/c而不是使用v为波速?这让我很困惑,但我的直觉告诉我c=v=E/ρ

对于标准化杆位移ψ^(x,t)=(c/V0a)ψ(x,t)使用前 100 个正常模式(即n=1,100) 并选择a/L=0.1, 这就是我们得到的t/τ=1.28

在此处输入图像描述

现在编码python

import matplotlib.pyplot as plt
from numpy import *
plt.ion()

n = 100
L = 25
a = 2.5
E = 100
rho = 1
V0 = 3
c = (E/rho)**0.5
x = linspace(0, L, 100)
u = []
ti = 1.28*L/c
for xi in x:
    SUM = 0
    for i in range(1,n+1,1):
        Ai = V0*a*2*sin((i-0.5)*a*pi/L)/(c*pi*(i-0.5)**2*pi*a/L)
        SUM = SUM+Ai*cos((i-0.5)*pi*xi/L)*sin((n-0.5)*pi*ti/(L/c))
    u.append(SUM)


u = [x * (c/V0*a) for x in u]
plt.plot(x/L,u)
plt.show()

产生以下情节:

在此处输入图像描述

这实际上与上面的正确情节无关。

我已经检查并重新检查了方程式。我不确定我哪里出错了,希望这不是作者提供的错误?最重要的是最终结果,所以我希望我正确实施它?请帮忙。

编辑

根据下面的答案,这里是工作代码。

import matplotlib.pyplot as plt
from numpy import *
plt.ion()

n = 100
L = 25
a = 2.5
E = 100
rho = 1
V0 = 3
c = (E/rho)**0.5
x = linspace(0, L, 100)
u = []
ti = 1.28*L/c
for xi in x:
    SUM = 0
    for i in range(1,n+1,1):
        Ai = V0*a*2*sin((i-0.5)*a*pi/L)/(c*pi*(i-0.5)**2*pi*a/L)
        SUM = SUM+Ai*cos((i-0.5)*pi*xi/L)*sin((i-0.5)*pi*ti/(L/c))
    u.append(SUM)



u = [x * (c/V0/a) for x in u]
plt.plot(x/L,u)
plt.show()
1个回答

您的代码有两个问题:

1) 你在混音in在以下行中:

SUM = SUM+Ai*cos((i-0.5)*pi*xi/L)*sin((n-0.5)*pi*ti/(L/c))

它应该是:

SUM = SUM+Ai*cos((i-0.5)*pi*xi/L)*sin((i-0.5)*pi*ti/(L/c))

2)您必须标准化杆位移。那么系数是:

    Ai = 2*sin((i-0.5)*a*pi/L)/(pi*(i-0.5)**2*pi*a/L)

这些变化的结果是:

在此处输入图像描述