Numpy linspace意外输出

2024-09-30 14:18:58 发布

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

我运行下面的代码为每个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。)


Tags: 代码lennpnn数组tretatsp
2条回答

这是一个舍入的问题。如果您尝试从intervalz中减去501,您会发现一个非常小的负数-5.68e-14;linspace只取它的整数部分,即500,并提供一个500长的列表。在

注意您的代码还有两个问题:

  1. dt没有提供正确的间距,因为您没有删除首字母t(与dz相同)
  2. Ngridt和{}在概念上是整数,而将它们初始化为浮点。只需去掉末尾的点。在

我认为您的代码可以通过编写来简化(注意,Ngridt和{}被初始化为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) 

这与浮点运算不准确有关。恰好intervalz的公式得到500.99999999999994。这只是浮动精度的问题,你可以找到所有的。然后,np.linspace命令将这个数字取为500,而不是501。在

由于linspace需要一个int,所以最好确保给它一个。在

顺便说一句:从数学上讲,我不明白你为什么不设定

intervalz = Ngridz + 1

自从intervalz = zmax/dz + 1 = zmax/(zmax/Ngridz) + 1 = Ngridz + 1

相关问题 更多 >