Python roll的等效码与经典方法;“换档功能”;循环

Python roll的等效码与经典方法;“换档功能”;循环,python,arrays,numpy,Python,Arrays,Numpy,我有一个基本循环(实际上是更新数组值的时间循环): 有了这个循环和roll功能,模拟工作正常 我必须具有周期性边界条件(x[0]=x[n-1]) 现在,我试着用经典的方法得到相同的等价代码,我的意思是编写rollshift函数的显式代码 在另一个论坛上的前一篇帖子中,有人建议: 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])

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

有了这个循环和
roll
功能,模拟工作正常

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


现在,我试着用经典的方法得到相同的等价代码,我的意思是编写
roll
shift函数的显式代码

在另一个论坛上的前一篇帖子中,有人建议:

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.给出的解决方案完美且清晰。谢谢大家。

两个等效功能:

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])

如果它是“相同的代码”,你应该进行单元测试来证明它的工作原理是相同的,不是吗?你能给我们一个示例(小)输入和你期望的输出吗?-@B.M.谢谢,你为什么要
cfl=-cfl
into
old(u0,cfl=-cfl):
?-@B.M.你能用python测试一下我在更新2中的代码吗?-@B.M.我不懂这行:
u[1:nx-1]=u[1:nx-1]-cfl/2*(u[0:nx-2]-u[2:nx])
,尤其是术语
u[2:nx]
,因为u只有
nx
元素,所以索引不能大于
nx-1
,不是吗?先学习语言。在python中,a:b是从a包含到b排除。-@b.M.,谢谢,我不知道,我现在更了解您的解决方案。
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])