循环-存储2个先前的数组以实现Leapfrog数值方案

时间:2018-11-27 02:59:22

标签: numerical-methods recurrence

在对流数值求解的情况下,我尝试在时间循环中实现以下递归公式:

Recurrence Leapfrog

如您所见,我需要(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:

在公式中:recurrence formula

时间索引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数组。

感谢您的帮助

1 个答案:

答案 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+1u_prev在时间n-1,而dudx在时间u使用{当前时间n。此外,您可以使用

来计算dudx
for j in space...:
    dudx[j] = u[j+1]-u[j-1]