我正在运行下面的代码,为每个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?
(我正在使用Python2.7。)
发布于 2016-07-12 15:42:08
这是一个四舍五入问题。如果您尝试从intervalz中减去501,您会发现一个非常小的负数,-5.68e-14;行空间只取其中的整数部分,即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) 发布于 2016-07-12 15:32:41
这与浮点数不准确有关。恰好,intervalz的公式产生了500.99999999999994。这只是浮动精度的问题,你可以找到到处都这样。然后,np.linspace命令将这个数字取为500,而不是501。
因为linspace期望有一个int,所以最好确保给它一个。
顺便说一句:从数学上讲,我不明白你为什么不
intervalz = Ngridz + 1自intervalz = zmax/dz + 1 = zmax/(zmax/Ngridz) + 1 = Ngridz + 1以来
https://stackoverflow.com/questions/38332917
复制相似问题