如何在python中使用matplotlib绘制函数结果

时间:2017-02-22 09:47:46

标签: python matplotlib

我已经创建了一个函数,它根据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()

非常感谢帮助!

2 个答案:

答案 0 :(得分:1)

您获得的错误与绘图无关,但在您致电int_force_y时会出现。参数z_posnp.ndarray。如果你现在将它与例如比较。函数中Lf1然后这会给你一个布尔数组,其中每个元素指示z_pos的相应元素是否小于或等于Lf1,如果你的第一个if语句。由于某些元素较小或相等而某些元素不是,因此无法决定是将其视为True还是False,并要求您使用.any()表示它应为True 1}}如果任何元素为True.all(),则表示如果所有元素均为True,则该元素应为True

但是这两种情况都不符合你的要求。您需要单独决定每个元素,然后相应地在int_fc_y中设置相应的值。您可以使用boolean indexingnp.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语句也是如此。