在下面提供的代码中,我尝试遍历2D numpy数组[i] [k] 最初,它是用Fortran 77编写的代码,它比我的祖父还要老。我正在尝试使其适应python。 (对于感兴趣的下落:这是一个简单的液压瞬态事件求解器) 请记住,所有变量都是在我的代码中引入的,因此我不会在此处粘贴。
H = np.zeros((NS,50))
Q = np.zeros((NS,50))
我在这里分配第一行值:
for i in range(NS):
H[0][i] = HR-i*R*Q0**2
Q[0][i] = Q0
CVP = .5*Q0**2/H[N]
T = 0
k = 0
TAU = 1
#Interior points:
HP = np.zeros((NS,50))
QP = np.zeros((NS,50))
while T<=Tmax:
T += dt
k += 1
for i in range(1,N):
CP = H[k][i-1]+Q[k][i-1]*(B-R*abs(Q[k][i-1]))
CM = H[k][i+1]-Q[k][i+1]*(B-R*abs(Q[k][i+1]))
HP[k][i-1] = 0.5*(CP+CM)
QP[k][i-1] = (HP[k][i-1]-CM)/B
#Boundary Conditions:
HP[k][0] = HR
QP[k][0] = Q[k][1]+(HP[k][0]-H[k][1]-R*Q[k][1]*abs(Q[k][1]))/B
if T == Tc:
TAU = 0
CV = 0
else:
TAU = (1.-T/Tc)**Em
CV = CVP*TAU**2
CP = H[k][N-1]+Q[k][N-1]*(B-R*abs(Q[k][N-1]))
QP[k][N] = -CV*B+np.sqrt(CV**2*(B**2)+2*CV*CP)
HP[k][N] = CP-B*QP[k][N]
for i in range(NS):
H[k][i] = HP[k][i]
Q[k][i] = QP[k][i]
记住i
用于行,k
用于列
我期望的是,对于所有k个列,应该计算值,直到满足T <= Tmax条件为止。我无法弄清楚我的错误是什么,我遇到了以下错误:
RuntimeWarning: divide by zero encountered in true_divide
CVP = .5*Q0**2/H[N]
RuntimeWarning: invalid value encountered in multiply
QP[N][k] = -CV*B+np.sqrt(CV**2*(B**2)+2*CV*CP)
QP[N][k] = -CV*B+np.sqrt(CV**2*(B**2)+2*CV*CP)
ValueError: setting an array element with a sequence.
答案 0 :(得分:1)
看着你的第一次迭代:
H = np.zeros((NS,50))
Q = np.zeros((NS,50))
for i in range(NS):
H[0][i] = HR-i*R*Q0**2
Q[0][i] = Q0
H
的形状为(NS,50)
,但是当您遍历range(NS)
时,会将那个索引应用于第二维。为什么?它不适用于尺寸为NS
的尺寸吗?
在numpy
中,数组默认为'C'顺序。最后一个维度是最内在的。他们可以有一个F
(fortran)订单,但是我们不要去那里。将2d数组视为表格,尽管numpy
中没有正式的定义,但我们通常谈论的是行和列。
假设您想将第一列设置为以下值:
for i in range(NS):
H[i, 0] = HR - i*R*Q0**2
Q[i, 0] = Q0
但是我们可以一次分配整行或整列。我相信Fortran的新版本也具有这些“整个阵列”功能。
Q[:, 0] = Q0
H[:, 0] = HR - np.arange(NS) * R * Q0**2
翻译为Python
时要注意的一点。索引从0开始;范围和np.arange(...)
也是如此。
H[0][i]
在功能上与H[0,i]
相同。但是,使用切片时,您必须使用H[:,i]
格式。
我怀疑您的其他迭代也有类似的问题,但我现在将在此处停止。
答案 1 :(得分:0)
关于错误:
RuntimeWarning: divide by zero encountered in true_divide
CVP = .5*Q0**2/H[N]
您将H初始化为零,因此它抱怨被零除是正常的。也许您应该添加一个条件。
QP[N][k] = -CV*B+np.sqrt(CV**2*(B**2)+2*CV*CP)
ValueError: setting an array element with a sequence.
您先定义CVP = .5*Q0**2/H[N]
,然后再定义CV = CVP*TAU**2
,这是一个序列。然后,您尝试将其派生形式分配给作为元素的QP[N][K]
。您正在尝试将一个数组插入一个值。
希望这有所帮助。