滚动“移位函数”成环的等价码及经典方法

2024-05-16 11:52:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但是这个“等价代码”不会产生与第一个版本相同的结果(使用rollpython函数)。你知道吗

我想在我上面的任务中得到关于什么是错误的帮助。这似乎是一个覆盖值或边界更新错误的问题。你知道吗

更新1:

@B.M.给出的解决方案非常有效,而且很清楚。谢谢大家。你知道吗


Tags: 函数代码infor错误时间range数组
1条回答
网友
1楼 · 发布于 2024-05-16 11:52:56

两个等效函数:

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类型错误:必须是float。你知道吗

跑步:

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

相关问题 更多 >