2017-02-22 47 views
0

我做了一个函数,它根据z位置(z_pos)返回一个力的值。我想绘制这些结果(这里是工程师的剪切图),但是我得到以下错误:如何在python中用matplotlib绘制函数结果

ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

我曾与人气指数和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() 

帮助非常感谢!

回答

1

您收到的错误与绘图无关,但在您致电int_force_y时出现。论据z_posnp.ndarray。如果你现在比较这个例如。 Lf1然后这给你一个布尔数组,其中每个元素指示z_pos的相应元素是否小于或等于Lf1如果您的第一个if语句。由于某些元素较小或相等,有些元素较小或者相等,因此他无法决定他是否应将此视为TrueFalse,并要求您使用.any()来指示它应该是True,如果有任何元素是True.all()以指示它应该是如果所有元素都是True,则为True

但是这两种或这些情况都不会做你想让他们做的事情。您需要单独决定每个元素,然后相应地在int_fc_y中设置相应的值。您可以通过for循环或更优雅地使用boolean indexingnp.logical_and来完成此操作。只要使用此功能来产生你的结果阵列,而不是您的版本:

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 
0

的问题发生,因为你是问蟒蛇是否如果数组大于一定值更大或更小:

if z_pos <= Lf1: 

这可能对某些价值观是真实的,对某些人是虚假的,留下的是这个陈述是真是假的含糊不清的问题。

您可以尝试:这取决于你想要什么

if np.array(z_pos <= Lf1).any(): 

if np.array(z_pos <= Lf1).all(): 

。 以下if语句相同。

+0

这不会给他想要的结果,因为那么函数将只返回一个值而不是所有结果值的数组。 – jotasi

相关问题