In [1]:
from scipy.optimize import bisect
%config InlineBackend.figure_format = 'svg'
from IPython.core.display import Image

DYNAMICAL TESTING


In [2]:
image01 = Image(filename="figures/01.png")
display(image01)


A simple structure, which can be modeled as a single degree of freedom system, consists of a uniform cantilever beam of lenght $L={}$10 m that supports a body of negligible dimensions, whose mass $m={}$10000 kg is much larger than the beam mass.

The body is at rest when it is subjected to an impulsive loading

$p(t) = p_0\begin{cases} \sin(\pi t/t_0)&0\le t \le t_0\\\\ 0&\text{otherwise}\end{cases}$

with $p_0={}$3 kN and $t_0 = {}$0.20s.

The maximum tip deflection, that occurs after the end of the loading (i.e., in the free vibration phase of the response) is $\delta_\text{max}={}$7.50 mm.

The problem data


In [3]:
L   =    10.0000 # metre
m   = 10000.0000 # kilogram
p_0 =  3000.0000 # Newton
t_0 =     0.2000 # second
d_m =     0.0075 # metre

The natural frequency of the SDOF system is $\omega_n^2 = \displaystyle\frac km$.

Considering the direct flexibility of a cantilever loaded at the tip, we can deduce that in our problem $k=\displaystyle\frac{3EJ}{L^3}$ so that we have that $\omega_n^2 = \displaystyle\frac{3EJ}{mL^3}$.

In our problem $L$ and $m$ are assigned, so we define wn as a function of EJ:


In [4]:
def wn(EJ):
    return sqrt(3*EJ/L/L/L/m)

The natural period of vibration of the SDOF system is $T_n = \displaystyle\frac{2\pi}{\omega_n}$, and we can define Tn as a function of EJ:


In [5]:
def Tn(EJ):
    return 2*pi/wn(EJ)

The system parameter $\beta$, frequency ratio, can be expressed in terms of $T_n$ and the impulse duration $t_0$, $\beta = \displaystyle\frac{T_n}{2t_0}$ and, again, we can define beta as a function of EJ:


In [6]:
def beta(EJ):
    return Tn(EJ)/2.0/t_0

Finally, we have the expression for the maximum deflection, valid when the maximum occurs in the free response phase,

$\displaystyle \delta_\text{max} = \frac{p_0 L^3}{3EJ}\,\frac{2\beta}{\beta^2-1}\,\cos\left(\frac{\pi}{2\beta}\right)$.

$\delta_\text{max}$ is a function of $\beta$ and $EJ$, but $\beta=\beta(EJ)$, hence we can define dmax as a function of EJ only:


In [7]:
def dmax(EJ):
    b = beta(EJ)
    return p_0*L*L*L*2*b*cos(pi/2/b)/3/EJ/(b*b-1)

The interval in which the above expression is valid (i.e., the max response is in the free vibration phase) is $\beta\ge1$, so preliminarily we plot $\beta$ against $EJ$ to have an idea of the interval of EJ values for which dmax results are correct.


In [8]:
ej = logspace(3,12,91)
loglog(ej,beta(ej), (1000,10**12), (1,1))
xlabel("EJ", size='x-large')
ylabel("$\\beta$", size='x-large')
grid()


It looks like the max value of EJ for which dmax is correct is approximately $10^9$, but it's easy to be more correct,


In [9]:
EJ_max = bisect(lambda x: beta(x)-1, 10**8,10**10)
print EJ_max, log10(EJ_max)


822467033.424 8.91511849934

We have that $\beta\ge1$ when $EJ<10^{8.915}$, so we can plot dmax and its measured values as follows


In [10]:
ej = logspace(3,8.9,58)
loglog(ej,dmax(ej), (1000,1000000000),(0.0075, 0.0075))
xlabel("$EJ$")
ylabel(r'$\delta_{max}$')
grid()


Looks like EJ should be close to $10^8$... we can zoom in


In [11]:
ej = logspace(7,8.9,191)
loglog(ej,dmax(ej),(10**7, 10**9),(0.0075, 0.0075))
xlabel("$EJ$") ; ylabel(r'$\delta_{max}$')
grid(which='both', axis='x') ; grid(axis='y')


I admit that the last graph is almost superfluous, but we can start the root finding procedure using a smaller interval...


In [12]:
EJ = bisect(lambda x: dmax(x)-0.00750, 7*10**7, 9*10**7)

Finally we can print the required value of EJ, as well as the natural period of vibration and the frequency ratio.


In [13]:
print "EJ   = %6.3f MN × m^2" % (EJ/10**6,)
print "T_n  = %6.3f s" % (Tn(EJ),)
print "beta = %6.3f" % (beta(EJ),)


EJ   = 82.489 MN × m^2
T_n  =  1.263 s
beta =  3.158

In [13]: