我正在尝试将分析解决方案编码为矩形通道中的溃坝。我们的想法是在大坝的一侧有4米的水,在大坝的下游侧没有水,然后拆除大坝,看看水是如何随时间演变的。我有以下代码,但我在"对于范围(x)中的i有问题:"线。我将粘贴我的代码和我得到的错误。谁能解释为什么我会得到这个错误和任何可能的解决方案?谢谢
__author__="A.H"
__date__ ="$04-Aug-2014 13:46:59$"
import numpy as np
import matplotlib.pyplot as plt
import math
import sys
from math import sqrt
import decimal
nx, ny = (69,69)
x5 = np.linspace(0,20.1,nx)
y5 = np.linspace(0,20.1,ny)
xv,yv = np.meshgrid(x5,y5)
x = np.arange(0,20.3956,0.2956)
y = np.arange(0,20.3956,0.2956)
t59=np.arange (1,4761,1)
h0=4.0
g=9.81
t=1
xa=10.5-(t*math.sqrt(g*h0))
xb=10.5+(2*t*math.sqrt(g*h0))
h=np.zeros(len(x))
for i in range(x):
if x[i]<=xa:
h=h0
elif xa<=x[i]<=xb:
h=(4.0/(9.0*g))*(((math.sqrt(g*h0))-(x[i]/(2.0*t)))**2.0)
else:
h=0
f = open(r'C:\opentelemac\bluetang\examples\telemac2d\dambreak\D1.i3s', 'r')
while True:
line = f.readline()
if line[0] not in [':','#']: break
ran = int(line.split()[0])
length = np.zeros(ran)
wse = np.zeros(ran)
for i in range (ran):
fields = f.readline().split()
length[i] = float(fields[0])
wse[i] = float(fields[2])
all =[length[i],wse[i]]
plt.figure(2)
plt.plot(length,h)
plt.plot(length,wse)
plt.legend(['Analytical solution','Model'], loc='upper right')
plt.show()
当我运行此代码时,我收到错误: Traceback(最近一次调用最后一次): 文件&#34; D:\ Work \ NetBeansProjects \ Ritter_test_2 \ src \ ritter_test_2.py&#34;,第29行,在 对于范围(x)中的i: TypeError:只能将length-1数组转换为Python标量
当我读取文本文件时,代码的后半部分工作正常。我相信它只是for循环和if语句有问题,但我可能是错的。谢谢你的帮助。
答案 0 :(得分:0)
其他人指出你最有可能是range(len(x))
。
只需迭代数组x
中的项目,即可完成更简单的操作:
for value in x:
if value <= xa:
h = h0
elif xa <= value <= xb:
h = (4.0/(9.0*g))*(((math.sqrt(g*h0))-(value/(2.0*t)))**2.0)
else:
h = 0
elif
中的条件也存在一个小问题 - 此处xa
不能等于value
,因为如果它已经满足了之前的if value <= xa
{{1}}中的条件。只是想我会指出它,以防万一它真的很重要。