在平流数值求解的背景下,我尝试在时间循环中实现以下递推公式:
如您所见,我需要(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 :
在公式中:
时间索引 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 回答
我在代码中看到的问题很少 . 首先是符号 . 从您发布的数值方案看起来,您使用
j
和使用i
的空间离散时间,使用两者的中心差异 . 但是在你的代码中,看起来时间循环是用i
编写的,这很令人困惑 . 我将在这里使用j
作为空间和n
.第二,这一行
是不正确的,因为对于空间导数du / dx,您需要在 every spatial point
u
处应用中心差分格式 . 因此,u[2:nx] - u[0:nx-2]
正在做这样的事情,它只是从解决方案中包括边界点(右边的边界点)中减去似乎是包括边界点的解决方案 . 您需要正确计算此空间导数 .最后,确实考虑到
n-1
解决方案的Leapfrog方法通常通过将前一时间步的副本保存在另一个变量(例如u_prev
)中来实现 . 因此,如果你使用Leapfrog时间方案加上中心差异空间方案,最后你应该有类似的东西请注意,LHS上的
u
用于计算时间n+1
,u_prev
在时间n-1
,而dudx
在当前时间n
使用u
. 此外,您可以使用计算dudx