在对流数值求解的情况下,我尝试在时间循环中实现以下递归公式:
如您所见,我需要(j-1)的第二个上一个时间值和(j)的上一个值来计算(j + 1)个时间值。
我不知道如何实现此重复公式。在下面我在python中的尝试下,其中u
代表每次迭代的值T
的数组:
l = 1
# Time loop
for i in range(1,nt+1):
# Leapfrog scheme
# Store (i-1) value for scheme formula
if (l < 2):
atemp = copy(u)
l = l+1
elif (l == 2):
btemp = copy(atemp)
l = 1
u[1:nx-1] = btemp[1:nx-1] - cfl*(u[2:nx] - u[0:nx-2])
t=t+dt
系数cfl
等于s
。
但是模拟结果不能给出完全好的结果。我认为我的做法不正确。
任何人都可以帮助我实现这种重复性吗,即主要是如何及时存储(j-1)值以将其注入用于计算(j + 1)的公式中?
更新1:
时间索引j
必须从j=1
开始,因为我们有了术语T_(i,j-1)
。
对于第一次迭代,我们有:
T_i,2 = T_i,0 - s (T_(i+1),1 - T_(i-1),1)
然后,如果In仅使用时间循环(而不是空间循环),则我无法计算dudx[i]=T[i+1]-T[i-1])
,那么我如何计算(T_(i+1),1 - T_(i-1),1)
,而不用预先计算{{1} }?
那是我尝试在原始问题中实现的技巧,您能看到我的问题吗?主要问题是我只能使用时间循环。
如果我可以将2D数组与dudx[i] = T_(i+1),1 - T_(i-1),1
元素一起使用,将T[i][j]
用于空间,将i
用于时间,则代码会更简单,但是我不允许在检查中使用2D数组。
感谢您的帮助
答案 0 :(得分:1)
我在您的代码中看到的问题很少。首先是符号。从发布的数字方案来看,您似乎正在使用j
和时间i
来离散时间和使用两者的中心差来离散空间。但是在您的代码中,时间循环似乎是用i
编写的,这很令人困惑。在这里,我将使用j
作为空间,n
作为时间。
第二行,
u[1:nx-1] = btemp[1:nx-1] - cfl*(u[2:nx] - u[0:nx-2])
是不正确的,因为对于空间导数du / dx,您需要在u
的每个空间点上应用中心差分方案。因此,u[2:nx] - u[0:nx-2]
并没有采取任何措施,只是从包含右边边界点的解中减去似乎包含左边边界点的解。您需要正确计算此空间导数。
最后,实际上将n-1
解决方案考虑在内的Leapfrog方法通常是通过将先前时间步长的副本保留在另一个变量(例如u_prev
)中来实现的。因此,如果您使用Leapfrog时间方案加上中心差空间方案,最后应该有类似的
u_prev = u_init
u = u_prev
for n in time...:
u_new = u_prev - cfl*(dudx)
u_prev = u
u = u_new
请注意,LHS上的u
用于计算时间n+1
,u_prev
在时间n-1
,而dudx
在时间u
使用{当前时间n
。此外,您可以使用
dudx
for j in space...:
dudx[j] = u[j+1]-u[j-1]