我已经创建了一个函数,它根据z位置(z_pos)返回一个力的值。我想绘制这些结果(这里是工程师的剪切图),但是我得到以下错误:
ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()
我已尝试使用arange和linspace,请参阅此处的代码:
import matplotlib.pyplot as plt
import numpy as np
#values in kN and m
FyFL = 520
FyRL = 1246
L = 40.
Lf1 = 2.
Lf2 = 25.5
g = 9.81
W = 60000
q = (3*g*W/L)/1000 #kN/m
print q
def int_force_y(FyFL, FyRL, L, Lf1, Lf2, q, z_pos):
if z_pos <= Lf1:
int_fc_y = -q*z_pos
elif z_pos > Lf1 and z_pos < Lf1+Lf2:
int_fc_y = -q*Lf1 + FyFL-q*z_pos
elif z_pos >= Lf2 and z_pos <= 40.:
int_fc_y = -q*Lf1 + FyFL-q*(Lf1+Lf2)-q*z_pos
else:
return "No valid z_pos"
return int_fc_y
z_pos = np.arange(0,41,1)
y = int_force_y(FyFL, FyRL, L, Lf1, Lf2, q, z_pos)
plt.plot(z_pos,y)
plt.show()
非常感谢帮助!
答案 0 :(得分:1)
您获得的错误与绘图无关,但在您致电int_force_y
时会出现。参数z_pos
是np.ndarray
。如果你现在将它与例如比较。函数中Lf1
然后这会给你一个布尔数组,其中每个元素指示z_pos
的相应元素是否小于或等于Lf1
,如果你的第一个if
语句。由于某些元素较小或相等而某些元素不是,因此无法决定是将其视为True
还是False
,并要求您使用.any()
表示它应为True
1}}如果任何元素为True
或.all()
,则表示如果所有元素均为True
,则该元素应为True
。
但是这两种情况都不符合你的要求。您需要单独决定每个元素,然后相应地在int_fc_y
中设置相应的值。您可以使用boolean indexing和np.logical_and
通过for循环或更优雅地执行此操作。只需使用此函数来生成结果数组而不是您的版本:
def int_force_y(FyFL, FyRL, L, Lf1, Lf2, q, z_pos):
if (z_pos>40.).any():
return "No valid z_pos"
int_force_y = np.zeros_like(z_pos)
int_fc_y[z_pos<=Lf1] = -q*z_pos
int_fc_y[np.logical_and(z_pos > Lf1,
z_pos < Lf1+Lf2)] = -q*Lf1 + FyFL-q*z_pos
int_fc_y[np.logical_and(z_pos >= Lf2,
z_pos <= 40.)] = -q*Lf1 + FyFL-q*(Lf1+Lf2)-q*z_pos
return int_fc_y
答案 1 :(得分:0)
问题发生的原因是你问python一个数组是大于还是小于某个值:
if z_pos <= Lf1:
对于某些值而言,这可能是真理,而对于其他一些值则是假的,留下的问题是该语句是真还是假是模棱两可。
您可以尝试:
if np.array(z_pos <= Lf1).any():
或
if np.array(z_pos <= Lf1).all():
取决于你想要的。 以下if语句也是如此。