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