Macaulays methode#

Macaulays methode is een methode waarmee de verplaatsingsfunctie van een ligger van meerdere segmenten kan worden bepaald in één functie (Macaulay, 1919). Daarbij is het niet nodig om een balk onder te verdelen in segmenten met randvoorwaarden (afhankelijk van verdeelde belastingen, puntlasten, opleggingen, etc.) en blijft de notatie direct herkenbaar bij integratie/differentiatie (in tegenstelling tot de Dirac delta / Heaviside functies). Er bestaat een implementatie voor deze methode voor balken, maar een uitbreiding naar 2d-constructies zoals portalen ontbreekt.

Voorbeeld Macaulays methode zonder uitbreidingen#

Laten we de volgende constructie bekijken:

_images/Example_figure.svg

Fig. 1 Voorbeeld constructie#

Definieer belasting#

Deze belasting (inclusief oplegreacties) kan als volgt worden beschreven volgens Macaulay:

\[q\left( x \right)=\underbrace{{{A}_{v}}{{\left\langle x \right\rangle }^{-1}}+{{B}_{v}}{{\left\langle x-15 \right\rangle }^{-1}}}_{\text{oplegreacties}}\underbrace{+10{{\left\langle x \right\rangle }^{0}}-10{{\left\langle x-4 \right\rangle }^{0}}}_{\text{verdeelde belasting}}\underbrace{+35{{\left\langle x-9 \right\rangle }^{-1}}}_{\text{puntlast}}\]

Dit kan in sympy worden genoteerd als:

import sympy as sym
sym.init_printing()
x = sym.symbols('x')
EI = sym.symbols('EI')
C_1, C_2, C_3, C_4 = sym.symbols('C_1 C_2 C_3 C_4') 
A_v, B_v = sym.symbols('A_v B_v')

Q = 10
L = 15
a = 4
b = 5
F = 35

q =  A_v * sym.SingularityFunction(x,0,-1) + Q * sym.SingularityFunction(x,0,0) - Q * sym.SingularityFunction(x,a,0) + F * sym.SingularityFunction(x, a+b, -1) + B_v * sym.SingularityFunction(x,L,-1)
display(q)
_images/ac90efd96c655261b0a7330e39e29e73531fb5cb79ee8aee728fe818d144b2dd.png

Definieer randvoorwaarden#

Voor dit probleem gelden de volgende randvoorwaarden:

\[\begin{split}\begin{align} & w\left( 0 \right)=0 \\ & w\left( 15 \right)=0 \\ & M\left( 0 \right)=0 \\ & M\left( 15 \right)=0 \\ & V\left( {{0}^{-}} \right)=0 \\ & V\left( {{15}^{+}} \right)=0 \\ \end{align}\end{split}\]

Dit kan in sympy als volgt worden gedefinieerd:

V = -sym.integrate(q, x) + C_1
M = sym.integrate(V, x) + C_2
kappa = M / EI
phi = sym.integrate(kappa, x) + C_3
w = -sym.integrate(phi, x) + C_4
display(w)
_images/a801b81538da6ce54190772da033b33a52bf48f8e588a76fcad1c499b463b513.png

De dwarskracht net links van \(0\) en net rechts van \(15\) wordt gemodelleerd met een ‘dummy’-variabele van \(\cfrac{1}{\infty}\).

oo = sym.Dummy('oo', prime=True)
very_small = 1/oo

Nu kunnen in SymPy de vergelijkingen voor de randvoorwaarden worden opgesteld:

Eq1 = sym.Eq(w.subs(x,0),0)
Eq2 = sym.Eq(w.subs(x,L),0)
Eq3 = sym.Eq(M.subs(x,0),0)
Eq4 = sym.Eq(M.subs(x,L),0)
Eq5 = sym.Eq(V.subs(x,0-very_small),0).subs(oo,sym.oo)
Eq6 = sym.Eq(V.subs(x,L+very_small),0).subs(oo,sym.oo)
display(Eq1, Eq2, Eq3, Eq4, Eq5, Eq6)
_images/2605644dd0442082aa736c92648e2fa6460472fbc83f912f7feae52821e31f2a.png _images/88bb25c90cb6f4274b5b439c4b9340c9d8f94117414ec44fbe5e430641ee03e4.png _images/87be6dd8ffd197124097f41a2b9958256ebabd966d07a7c6d20869447760d644.png _images/83850d4998001178ae83b139d8ec40d71fc31e72e422589e777c45bf67325ab2.png _images/ae570b63a9bd92043e309b17c7ea9af7fc4bf8516769a190505b12fc3423530f.png _images/2cf5e02d2b305f0e34f5ee0ad3c8d8862161ceeb87826349c429d3a346adc57d.png

Los op voor randvoorwaarden#

Oplossen naar de randvoorwaarden geeft:

\[w\left( x \right)=\frac{26692x\underbrace{-292{{\left\langle x \right\rangle }^{3}}-158{{\left\langle x-15 \right\rangle }^{3}}}_{\text{oplegreacties}}\underbrace{+15{{\left\langle x \right\rangle }^{4}}-15{{\left\langle x-4 \right\rangle }^{4}}}_{\text{verdeelde belasting}}\underbrace{+210{{\left\langle x-9 \right\rangle }^{3}}}_{\text{puntlast}}}{36EI}\]

welke oplossing ook met code kan worden gevonden:

sol = sym.solve((Eq1,Eq2,Eq3,Eq4,Eq5,Eq6),(C_1,C_2,C_3,C_4,A_v,B_v))
display(sol)

display(w.subs(sol).factor(EI))
_images/8872ac7f0f4e2b0abe20dba0906b7fd5db2e0aa7434367bbe270d9e0c53fb9ee.png _images/2310ac5d6a1b0d06d683acdf875b8f83b420c23be0eaeddefe20145f116254d2.png

Dit kan ook worden omgeschreven naar een functie per domein:

\(\displaystyle \begin{cases} \frac{79 x^{3} - 3555 x^{2} + 40781 x - 78465}{18 EI} & \text{for}\: x > 9 \\\frac{- 13 x^{3} - 360 x^{2} + 7633 x - 960}{9 EI} & \text{for}\: x > 4 \\\frac{x \left(15 x^{3} - 292 x^{2} + 26692\right)}{36 EI} & \text{for}\: x > 0\end{cases}\)

wat met de volgende code kan worden gevonden:

display(sym.simplify(w.subs(sol).rewrite(sym.Piecewise)))
_images/d5ea44dfabd5891733f8389124facdb20a685f8c13db782ce968fe34d5a6ef12.png

Dit resultaat kan ook worden geplot voor een \(EI\) van \(10000\):

import numpy as np
import matplotlib.pyplot as plt

%config InlineBackend.figure_formats = ['svg']
w_numpy = sym.lambdify(x, w.subs(sol).subs(EI,10000).rewrite(sym.Piecewise))
x_numpy = np.linspace(0,15,100)
plt.figure()
plt.plot(x_numpy,w_numpy(x_numpy))
plt.xlabel('$x$')
plt.ylabel('$w$');
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['left'].set_position('zero')
ax.invert_yaxis()
_images/a7bb91eff7ee05348cadba563c9e260665f5d1c5e709deebff9a4c22f4a80955.svg

The dwarskrachtverdeling kan ook worden gevonden:

\[V\left( x \right)=\underbrace{\frac{146{{\left\langle x \right\rangle }^{0}}}{3}+\frac{79{{\left\langle x-15 \right\rangle }^{0}}}{3}}_{\text{oplegreacties}}\underbrace{-10{{\left\langle x \right\rangle }^{1}}+10{{\left\langle x-4 \right\rangle }^{1}}}_{\text{verdeelde belasting}}\underbrace{-35{{\left\langle x-9 \right\rangle }^{0}}}_{\text{puntlast}}\]

met de volgende code:

display(V.subs(sol))
_images/a8fdf23c42cfbb6c52f7b87318337cd690afcdfb140fda540ea3f142bf84038e.png

En ook deze formule kan worden omgeschreven naar een formule per domein:

\[\begin{split}\displaystyle \begin{cases} - \frac{79}{3} & \text{for}\: x > 9 \\\frac{26}{3} & \text{for}\: x > 4 \\\frac{146}{3} - 10 x & \text{for}\: x > 0 \end{cases}\end{split}\]
display(sym.simplify(V.subs(sol).rewrite(sym.Piecewise)))
_images/ba19b3ef9b27ec8983309f8ff048aeff38faa0eea1a62911508cbe8c5dbd4c7b.png

en kan ook worden geplot:

V_numpy = sym.lambdify(x, V.subs(sol).rewrite(sym.Piecewise))
x_numpy = np.linspace(0,15.01,10000)
plt.figure()
plt.plot(x_numpy,V_numpy(x_numpy))
plt.xlabel('$x$')
plt.ylabel('$V$');
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['left'].set_position('zero')
ax.invert_yaxis()
_images/2c928dcfb1afa855a606c14cd2b474e3dcb4cc9415dd0fb2b73cd36ef232b9b4.svg

Voorbeeld Macaulays methode in SymPy#

De methode van Macaulay is ook geïmplementeerd in SymPy en kan daar worden toegepast zonder vergelijkingen op te moeten stellen.

Let op: het assenstelsel is in SymPy gedefinieerd met de verticale as positief naar boven.

import sympy as sym
from sympy.physics.continuum_mechanics.beam import Beam
sym.init_printing()
E, I = sym.symbols('E, I')
b = Beam(15, E, I)
A_v = b.apply_support(0,type='pin')
B_v = b.apply_support(15,type='roller')
b.apply_load(-10, 0, 0, 4)
b.apply_load(-35, 9, -1)
b.solve_for_reaction_loads(A_v, B_v)
b.deflection().simplify()
_images/343840220a882dcc16f87177148ddee3464e98306965ce008820cf79319580ae.png
b.plot_deflection({E : 10000, I : 1});
_images/e2a8b41673bd7777a63d624d30cd621a0ab17f903ec23c1795a359de241ed1d5.png
b.plot_shear_force();
_images/97fef3f287d82557fc205fa2767ecb7a666cd6598783e85d28ac4a97f9628d45.png