我运行下面的代码为每个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。例如,如果我插入代码
^{pr2}$那么len(z)=501。但是我想知道,为什么最初的代码,正如所写的那样,不能产生长度为501的数组z?在
(我使用的是python2.7。)
这是一个舍入的问题。如果您尝试从intervalz中减去501,您会发现一个非常小的负数-5.68e-14;linspace只取它的整数部分,即500,并提供一个500长的列表。在
注意您的代码还有两个问题:
dt
没有提供正确的间距,因为您没有删除首字母t
(与dz
相同)Ngridt
和{我认为您的代码可以通过编写来简化(注意,}被初始化为501)
Ngridt
和{这与浮点运算不准确有关。恰好
intervalz
的公式得到500.99999999999994
。这只是浮动精度的问题,你可以找到所有的。然后,np.linspace
命令将这个数字取为500,而不是501。在由于
linspace
需要一个int
,所以最好确保给它一个。在顺便说一句:从数学上讲,我不明白你为什么不设定
自从
intervalz = zmax/dz + 1 = zmax/(zmax/Ngridz) + 1 = Ngridz + 1
相关问题 更多 >
编程相关推荐