将“移位功能”滚动到循环中的等效代码和经典方法

时间:2018-12-04 14:00:01

标签: python arrays numpy

我有一个基本的循环(实际上是更新数组值的时间循环):

for i in range(1,nt):
    #Using roll
    u = u - cfl/2*(roll(u,-1)- roll(u,1))
    # Update time
    t = t+dt

有了此循环和roll函数,模拟工作正常。

我明确规定我必须具有周期性边界条件(x[0] = x[n-1]


现在,我正拼命地尝试获取相同的等效代码,但采用经典方法,我的意思是写出roll移位函数的作用的显式代码。

在另一个论坛上的上一篇文章中,有人建议这样做:

for i in range(1,nt):
   utemp1 = u[0] - cfl/2*(u[nx-1] - u[1])
   utemp2 = u[nx-1] - cfl/2*(u[nx-2] - u[0])
   u[1:nx-2] = u[1:nx-2] - cfl/2*(u[0:nx-3] - u[2:nx-1])
   u[0] = utemp1
   u[nx-1] = utemp2

但是,此“ 等效代码”所产生的结果与第一版(使用roll python函数)所产生的结果不同。

我想获得有关我的作业中有什么问题的帮助。这似乎是覆盖值或边界更新不正确的问题。

更新1:

@B提供的解决方案。 M.工作完美且清晰。谢谢大家。

1 个答案:

答案 0 :(得分:0)

两个等效功能:

nt=7
nx=10
cfl=1.1
def old(u0,cfl=-cfl):
    u=u0.copy()
    for i in range(1,nt):
        utemp1=u[0] - cfl/2*(u[nx-1] - u[1])
        utemp2=u[nx-1] - cfl/2*(u[nx-2] - u[0])
        u[1:nx-1] = u[1:nx-1] - cfl/2*(u[0:nx-2] - u[2:nx])
        u[0] = utemp1
        u[nx-1] = utemp2
    return u


def new(u0):
    u=u0.copy().astype(float)        
    for i in range(1,nt):
        u -=  cfl/2*(roll(u,-1)- roll(u,+1))
    return u

索引中的错误,滚动符号和v的类型:必须是浮动的。

运行:

In [521]: u0
Out[521]: array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])

In [522]: old(u0)
Out[522]: 
array([-15.06651094,  22.56142656,  28.93808047,  11.76161172,
         0.41970625,   1.41970625,  -9.92219922,   9.25426953,
        15.63092344, -19.99701406])

In [523]: new(u0)
Out[523]: 
array([-15.06651094,  22.56142656,  28.93808047,  11.76161172,
         0.41970625,   1.41970625,  -9.92219922,   9.25426953,
        15.63092344, -19.99701406])