首页 文章

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

提问于
浏览
0

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

Recurrence Leapfrog

如您所见,我需要(j-1)和previous(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)?

UPDATE 1 :

在公式中:
recurrence formula

时间索引 j 必须从 j=1 开始,因为我们有 T_(i,j-1) 这个词 .

Sor第一次迭代,我们有:

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) ,我的意思是,不预先计算 dudx[i] = T_(i+1),1 - T_(i-1),1

这是我尝试在原始问题中实施的技巧,你能看到我的问题吗?主要的问题是我被强制只使用时间循环 .

如果我可以使用带有 T[i][j] 元素的二维数组, i 用于空间和 j 时间,但代码将更简单,但我不允许在我的检查中使用二维数组 .

谢谢你的帮助

1 回答

  • 1

    我在代码中看到的问题很少 . 首先是符号 . 从您发布的数值方案看起来,您使用 j 和使用 i 的空间离散时间,使用两者的中心差异 . 但是在你的代码中,看起来时间循环是用 i 编写的,这很令人困惑 . 我将在这里使用 j 作为空间和 n .

    第二,这一行

    u[1:nx-1] = btemp[1:nx-1] - cfl*(u[2:nx] - u[0:nx-2])
    

    是不正确的,因为对于空间导数du / dx,您需要在 every spatial point 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 在当前时间 n 使用 u . 此外,您可以使用计算 dudx

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

相关问题