首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储2以前的数组来实现跳格数值格式

存储2以前的数组来实现跳格数值格式
EN

Stack Overflow用户
提问于 2018-11-27 02:59:22
回答 1查看 130关注 0票数 0

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

如您所见,我需要(j-1)和前一个(j)值的第二个前一个时间值来计算(j+1)时间值。

我不知道如何实现这个重复公式。下面是我在Python中的尝试,其中u表示每个迭代的值T数组:

代码语言:javascript
复制
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数组。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-28 09:58:30

我在您的代码中看到了几个问题。首先是符号。从您发布的数值方案来看,您使用j来离散时间,使用i使用空间,这两个方面都使用了中心差异。但是在您的代码中,时间循环似乎是用i编写的,这是令人困惑的。我将在这里使用j作为空间,n作为时间。

第二,这条线

代码语言:javascript
复制
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 )中保留上一个时间步骤的副本来实现的。因此,如果您使用跳蛙时间方案加上中心差分空间方案,最后您应该有如下所示

代码语言:javascript
复制
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在time n-1dudx在当前时间使用u n。此外,您还可以用

代码语言:javascript
复制
for j in space...:
    dudx[j] = u[j+1]-u[j-1]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53492094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档