0
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
    '''

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:

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

This is the section of code I am getting the error for:

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
    slope = self.getSlope
    moment = self.getMoment    
    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()

An example input would be:

>>> 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)

The error I am receiving is:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:/Users/Dag/Downloads/beamModel.py", line 97, in plotBeamData
matplotlib.pyplot.plot(xs, deflection, 'b', label = "deflection (mm)")
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\pyplot.py", line 3099, in plot
ret = ax.plot(*args, **kwargs)
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\axes\_axes.py", line 1373, in plot
for line in self._get_lines(*args, **kwargs):
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\axes\_base.py", line 304, in _grab_next_args
for seg in self._plot_args(remaining, kwargs):
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\axes\_base.py", line 282, in _plot_args
    x, y = self._xy_from_xy(x, y)
  File "C:\Users\Dag\Anaconda2\lib\site-packages\matplotlib\axes\_base.py", line 223, in _xy_from_xy
raise ValueError("x and y must have same first dimension")
ValueError: x and y must have same first dimension

Grateful for any help, really stuck. Thanks.

1 Answer 1

1

You forgot to actually call your methods to calculate the results. Here is a modified version of your plotting function:

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()
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for the quick response. Now it's giving me the following error though. if x > distanceA: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Perhaps that's an issue that should be addressed in a separate question @Student1001.
The error I am currently receiving is as a result of the change I made thanks to the kind gentleman's help. Thus, I believe it is related to the subject at hand. Thank you for your kind concern, however.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.