存储 2 个先前的数组以实现 Leapfrog 数值方案
Store 2 previous array to implement Leapfrog numerical Scheme
在平流数值求解的背景下,我尝试在时间循环中实现以下递归公式:
如您所见,我需要 (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])
,我如何计算 (T_(i+1),1 - T_(i-1),1)
,我的意思是,不预先计算 dudx[i] = T_(i+1),1 - T_(i-1),1
?
这是我在最初的问题中尝试实施的技巧。主要问题是我只能使用时间循环。
如果我可以使用带有 T[i][j]
元素的二维数组,i
空间和 j
时间,代码会更简单,但我不允许在我的代码中使用二维数组考试.
我在您的代码中看到的问题很少。首先是符号。从您发布的数字方案来看,您似乎正在使用 j
和 space 以及 i
的中心差异来离散化时间。但是在您的代码中,时间循环似乎是根据 i
编写的,这令人困惑。我将使用 j
作为 space,使用 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 time scheme plus central difference spatial scheme,最后你应该有这样的东西
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]
在平流数值求解的背景下,我尝试在时间循环中实现以下递归公式:
如您所见,我需要 (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])
,我如何计算 (T_(i+1),1 - T_(i-1),1)
,我的意思是,不预先计算 dudx[i] = T_(i+1),1 - T_(i-1),1
?
这是我在最初的问题中尝试实施的技巧。主要问题是我只能使用时间循环。
如果我可以使用带有 T[i][j]
元素的二维数组,i
空间和 j
时间,代码会更简单,但我不允许在我的代码中使用二维数组考试.
我在您的代码中看到的问题很少。首先是符号。从您发布的数字方案来看,您似乎正在使用 j
和 space 以及 i
的中心差异来离散化时间。但是在您的代码中,时间循环似乎是根据 i
编写的,这令人困惑。我将使用 j
作为 space,使用 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 time scheme plus central difference spatial scheme,最后你应该有这样的东西
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]