在平流数值求解的背景下,我尝试在时间循环中实现以下递推公式:

如您所见,我需要(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)中?
更新
在公式中:

时间索引j必须从j=1开始,因为我们有术语T_(i,j-1)。
因此,对于第一次迭代,我们有:
T_i,2 = T_i,0 - s (T_(i+1),1 - T_(i-1),1)
那么,如果只使用时间循环(而不是这样的空间循环),我不能计算dudx[i]=T[i+1]-T[i-1]),我的意思是,如果不预先计算dudx[i] = T_(i+1),1 - T_(i-1),1,我怎么能计算dudx[i] = T_(i+1),1 - T_(i-1),1呢?
这就是我在最初的问题中试图实现的窍门。主要的问题是我被迫只使用时间循环。
如果我可以在T[i][j]元素中使用2D数组,对于空间元素使用i,对于时间使用j,代码会更简单,但在我的检查中不允许使用2D数组。
发布于 2018-11-28 09:58:30
我在您的代码中看到了几个问题。首先是符号。从您发布的数值方案来看,您使用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解决方案的Leap蛙方法通常是通过在另一个变量(如u_prev )中保留上一个时间步骤的副本来实现的。因此,如果您使用跳蛙时间方案加上中心差分空间方案,最后您应该有如下所示
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在time n-1,dudx在当前时间使用u n。此外,您还可以用
for j in space...:
dudx[j] = u[j+1]-u[j-1]https://stackoverflow.com/questions/53492094
复制相似问题