我正在运行下面的代码,为每个z和t构建一维数组。目前,我正在尝试使它们的大小相等,以使它们各自的长度为501.
import numpy as np
#constants & parameters
omega = 1.
eps = 1.
c = 3.*(10.**8.)
hbar = 1.
eta = 0.01
nn = 10.**7.
n = eta*nn
lambdaOH = c/(1612.*10.**(6.))
gamma = 1.282*(10.**(-11.))
Tsp = 1./gamma
TR = 604800.
L = (Tsp/TR)*(np.pi)/((3.*(lambdaOH**2.))*n)
#time
Ngridt = 500.
tmax = 1.
dt = tmax/Ngridt
intervalt = tmax/dt + 1
t = np.linspace(0.01,tmax,intervalt)
#z space
Ngridz = 500.
zmax = L
dz = zmax/Ngridz
intervalz = zmax/dz + 1
z = np.linspace(0.01,zmax,intervalz)
当运行代码时,intervalt和intervalz都等于501.0,但是当检查z和t的长度时,len(z)= 500而len(t)= 501.我已经玩了上面的代码来产生len(z)= 501通过修改某些部分。例如,如果我插入代码
zmax = int(zmax)
然后len(z)= 501.但我想知道为什么初始代码完全按照书面形式产生长度为501的数组z?
(我使用的是Python 2.7。)
答案 0 :(得分:0)
这与浮点算术不准确有关。碰巧intervalz
的公式会产生500.99999999999994
。这只是你可以在SO上找到的浮动精度问题。然后np.linspace
命令将此数字设为500而不是501.
由于linspace
需要int
,所以最好确保给它一个。
intervalz = Ngridz + 1
自intervalz = zmax/dz + 1 = zmax/(zmax/Ngridz) + 1 = Ngridz + 1
答案 1 :(得分:0)
这是一个四舍五入的问题。如果你试图从intervalz中减去501,你会发现一个非常小的负数,-5.68e-14; linspace只占用它的整数部分,即500,并提供一个500长的列表。
请注意代码的其他两个问题:
dt
未提供正确的间距,因为您没有删除初始t
(dz
相同)Ngridt
和Ngridz
在概念上是整数,而您将它们初始化为浮点数。只需删除末尾的点。我认为您的代码可以通过编写简化(请注意Ngridt
和Ngridz
已初始化为501)
#time
Ngridt = 501
tmax = 1.
t, dt = np.linspace(0.01,tmax,Ngridt,retstep=True)
#z space
Ngridz = 501
zmax = L
z, dz = np.linspace(0.01,zmax,Ngridz,retstep=True)