Macaulays methode#

Macaulays methode is een methode waarmee de verplaatsingsfunctie van een ligger van meerdere segmenten kan worden bepaald in één functie [Mac19]. 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