Python 错误:使用 matplotlib:具有多个元素的数组的真值不明确.使用a.any()或a.all() [英] Python Error: Using matplotlib: Truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

查看:127
本文介绍了Python 错误:使用 matplotlib:具有多个元素的数组的真值不明确.使用a.any()或a.all()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我尝试使用matplotlib模块在一个图形上绘制梁的3个函数的图形,并且在尝试这样做时会出现值错误.主要代码是:

So I am trying to plot a graph of 3 of my functions for a beam on one graph using the matplotlib module and am getting value errors when attempting to do so. The main bulk of code is:

class beam(object):
    '''This class is models the deflection of a simply supported beam under
    multiple point loads, following Euler-Bernoulli theory and the principle      
    of superposition
    '''


    def __init__(self, E, I, L):
        '''The class costructor
        '''
        self.E = E  # Young's modulus of the beam in N/m^2
        self.I = I  # Second moment of area of the beam in m^4
        self.L = L  # Length of the beam in m
        self.Loads = [(0.0, 0.0)]  # the list of loads applied to the beam

    def setLoads(self, Loads):
        '''This function allows multiple point loads to be applied to the beam
        using a list of tuples of the form (load, position)
        '''
        self.Loads = Loads

    def beamDeflection(self, Load, x):
        """Calculate the deflection at point x due to application of single
        load
        """
        Force, distanceA = Load  #P1 = Force , a = distanceA
        E = self.E
        I = self.I
        L = self.L
        distanceB = L - distanceA
        i = (Force*distanceB)/(6*L*E*I)
        j = ((L/distanceB)*(x-distanceA)**3 - x**3 + (L**2 - distanceB**2)*x)
        k = (Force*distanceB*x)/(6*L*E*I)        
        l = (L**2 - x**2 - distanceB**2)
        if x > distanceA:
            return i*j
        else:
            return k*l


    def getTotalDeflection(self, x):
        """Calculate total deflection of beam due to multiple loads
        """
        #return sum(self.beamDeflection(loadall, x) for loadall in self.Loads)
        return sum(self.beamDeflection(load, x) for load in self.Loads)


    def getSlope(self, x):
        """Calculate gradient at a point x on beam due to deflection
        """
        V = lambda x: self.getTotalDeflection(x)
        return scipy.misc.derivative(V, x, dx = 10**-6)


    def getMoment(self, x):
        """Calculate bending moment at a point x on beam
        """
        E = self.E
        I = self.I
        W1 = lambda x: self.getSlope(x)
        W2 = scipy.misc.derivative(W1, x, dx = 10**-6)
        return (-1*E*I)*W2


    def plotBeamData(self, xs):
        """Plot deflection, slope and bending moment against position x for a
        list of floats or numpy.array xs describing positions along beam
        """
        deflection = self.getTotalDeflection(xs)
        slope = self.getSlope(xs)
        moment = self.getMoment(xs)    
        matplotlib.pyplot.plot(xs, deflection, 'b', label = "deflection (mm)")
        matplotlib.pyplot.plot(xs, slope, 'g', label = "slope (mm/m)")
        matplotlib.pyplot.plot(xs, moment, 'r', label = "moment (kNm)")
        matplotlib.pyplot.xlabel("Distance along beam (m)")
        matplotlib.pyplot.ylabel("Value in units")
        matplotlib.pyplot.show()

这是上面显示的类的代码部分,我在尝试运行时遇到错误:

This is the section of code from the class shown above, I am getting an error when trying to run:

def plotBeamData(self, xs):
   ...

一个示例输入是:

>>> b = beam(8.0E9, 1.333E-4, 5.0)
>>> b.setLoads([(900, 3.1), (700, 3.8), (1000, 4.2)])
>>> xs = numpy.linspace(0,5,500)
>>> b.plotBeamData(xs)

我收到的错误是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:/Users/Dag/Downloads/beamModel.py", line 93, in plotBeamData
deflection = self.getTotalDeflection(xs)
  File "C:/Users/Dag/Downloads/beamModel.py", line 60, in getTotalDeflection
return sum(self.beamDeflection(load, x) for load in self.Loads)
  File "C:/Users/Dag/Downloads/beamModel.py", line 60, in <genexpr>
return sum(self.beamDeflection(load, x) for load in self.Loads)
  File "C:/Users/Dag/Downloads/beamModel.py", line 50, in beamDeflection
if x > distanceA:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我以前刚刚更改过代码,将其从 deflection = self.getTotalDeflection 更改为 deflection =self.getTotalDeflection(xs) 现在给我一个新的错误.感谢任何帮助,真的卡住了.谢谢.

I had previously just changed the code changing it from deflection = self.getTotalDeflection, which was giving me a value error about x and y must be in the same dimension, to deflection = self.getTotalDeflection(xs) which is now giving me a new error. Grateful for any help, really stuck. Thanks.

推荐答案

beamDeflection 适用于单个 x:

def beamDeflection(self, Load, x):
    """Calculate the deflection at point x due to application of single
    load"""

但是您提供了 xs 的数组:

def plotBeamData(self, xs):
    """Plot deflection, slope and bending moment against position x for a
    list of floats or numpy.array xs describing positions along beam
    """
    deflection = self.getTotalDeflection(xs)
    slope = self.getSlope(xs)
    moment = self.getMoment(xs)  

更改为:

def plotBeamData(self, xs):
    """Plot deflection, slope and bending moment against position x for a
    list of floats or numpy.array xs describing positions along beam
    """
    deflection = [self.getTotalDeflection(x) for x in xs]
    slope = [self.getSlope(x) for x in xs]
    moment = [self.getMoment(x) for x in xs]

它有效:

这篇关于Python 错误:使用 matplotlib:具有多个元素的数组的真值不明确.使用a.any()或a.all()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆