18  Tour Penchée — Analyse théorique

Équilibre d’un parallélogramme incliné sous poids propre avec contact unilatéral à la base. Une tour de largeur L et hauteur H, inclinée d’un angle α par rapport à la verticale, est posée sur un sol rigide. Sous l’effet de son poids propre, la tour se comprime verticalement et subit un moment de flexion dû à la composante horizontale du poids. Lorsque la contrainte normale à la base devient positive, le contact est perdu (décollement). Au-delà d’un angle critique, la résultante du poids tombe en dehors de la base et la tour bascule.

18.1 Paramètres

Grandeur Symbole Valeur Unité
Largeur L 20 m
Hauteur H 55 m
Module d’Young E 30 GPa
Coefficient de Poisson ν 0.25 —
Masse volumique ρ 2000 kg/m³
Gravité g 9.81 m/s²
Angle d’inclinaison α 0–25 deg

18.2 Solution analytique

Contrainte verticale à la base par superposition compression + flexion : \[\sigma_{yy}(x) = -\rho g H \cos\alpha + \frac{6 \rho g H^2 \sin\alpha}{L^2}\left(\frac{L}{2} - x\right)\] Décollement quand \(\sigma_{yy}(0)=0\) → \(\tan\alpha = L/(3H)\) Perte d’équilibre quand la résultante sort de la base → \(\tan\alpha = L/H\)

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('dark_background')
bg=(40/255,43/255,48/255,1.0)
fg='grey'
class TourParams:
    L=20.; H=55.; E=30e9; nu=0.25; rho=2000.; g=9.81
    @staticmethod
    def sigma_yy_base(x,alpha_deg):
        a=np.radians(alpha_deg); L=TourParams.L; H=TourParams.H
        rho=TourParams.rho; g=TourParams.g
        ax=-rho*g*H*np.cos(a)
        bend=6*rho*g*H**2*np.sin(a)/L**2
        return ax+bend*(L/2-x)
    @staticmethod
    def alpha_liftoff():
        return np.degrees(np.arctan(TourParams.L/(3*TourParams.H)))
    @staticmethod
    def alpha_overturn():
        return np.degrees(np.arctan(TourParams.L/TourParams.H))
L=TourParams.L; H=TourParams.H
rho=TourParams.rho; g=TourParams.g; E=TourParams.E; nu=TourParams.nu
alf_liftoff=TourParams.alpha_liftoff()
alf_overturn=TourParams.alpha_overturn()
print('OK')
OK
fig,ax=plt.subplots(figsize=(8,6))
from matplotlib.patches import Polygon, Arc
ax.set_facecolor(bg); fig.patch.set_facecolor(bg)
a=np.radians(10.); d=H*np.tan(a); s=0.15
pts=np.array([[0,0],[L,0],[L+d,H],[d,H]])*s
ax.add_patch(Polygon(pts,facecolor='steelblue',edgecolor='lightblue',linewidth=2,alpha=0.7))
ax.axhline(0,color='green',linewidth=3)
# Portee L (sous la tour)
ax.annotate('',xy=(0,-2),xytext=(L*s,-2),arrowprops=dict(arrowstyle='<->',color='yellow'))
ax.text(L*s/2,-3,'L = 20 m',color='yellow',ha='center',fontsize=12)
# Hauteur H (a gauche, degenage de la fleche)
ax.annotate('',xy=(-3,0),xytext=(-3,H*s),arrowprops=dict(arrowstyle='<->',color='yellow'))
ax.text(-4.6,H*s/2,'H = 55 m',color='yellow',ha='center',fontsize=12,rotation=90,va='center')
# Angle alpha (hors de la tour, au-dessus de l'arc)


ax.plot([0,0],[0,3],color='red',linewidth=2)
ax.add_patch(Arc((0,0),6,6,angle=0,theta1=80,theta2=90,color='red',linewidth=2))
ax.text(0.1,3.4,r'$\alpha$',color='red',fontsize=14,ha='center')

# Poids propre (a droite de la tour)
wx=(L+d)*s+1.5
ax.annotate('',xy=(wx,H*s/2-3),xytext=(wx,H*s/2),arrowprops=dict(arrowstyle='->',color='red',lw=2))
ax.text(wx+0.5,H*s/2-1.5,'poids propre',color='red',fontsize=10,va='center')
ax.set_xlim(-6,L*s+6); ax.set_ylim(-5,H*s+2)
ax.set_aspect('equal'); ax.axis('off')
plt.tight_layout()
plt.savefig('c0.png',dpi=150,facecolor=bg)
plt.show()

fig,ax=plt.subplots(figsize=(10,5))
ax.set_facecolor(bg); fig.patch.set_facecolor(bg)
x=np.linspace(0,L,1000)
for a_deg in [0,5,10,15,20]:
    sy=TourParams.sigma_yy_base(x,a_deg)
    ax.plot(x,sy/1e6,label=str(a_deg)+' deg',linewidth=2)
ax.axhline(0,color='white',ls='--',linewidth=1)
ax.set_xlabel('x (m)',color=fg,fontsize=13)
ax.set_ylabel('sigma_yy (MPa)',color=fg,fontsize=13)
ax.tick_params(colors=fg)
for spine in ax.spines.values(): spine.set_color(fg)
ax.legend()
ax.grid(True,alpha=0.3)
plt.title('Contrainte verticale a la base',color=fg,fontsize=14)
plt.tight_layout()
plt.savefig('c1.png',dpi=150,facecolor=bg)
plt.show()

fig,ax=plt.subplots(figsize=(10,5))
ax.set_facecolor(bg); fig.patch.set_facecolor(bg)
alphas=np.linspace(0,25,100)
s_min=[TourParams.sigma_yy_base(np.linspace(0,L,1001),a).min() for a in alphas]
s_max=[TourParams.sigma_yy_base(np.linspace(0,L,1001),a).max() for a in alphas]
ax.plot(alphas,np.array(s_min)/1e6,'--',label='min (gauche)',color='red')
ax.plot(alphas,np.array(s_max)/1e6,'--',label='max (droite)',color='blue')
ax.axhline(0,color='white',ls=':',linewidth=1)
ax.axvline(6.911227119024681,color='green',ls='-',linewidth=2,label=f'decol 6.91 deg')
ax.axvline(19.98310652189998,color='orange',ls='-',linewidth=2,label=f'critique 19.98 deg')
ax.set_xlabel('alpha (deg)',color=fg,fontsize=13)
ax.set_ylabel('sigma_yy (MPa)',color=fg,fontsize=13)
ax.tick_params(colors=fg)
for spine in ax.spines.values(): spine.set_color(fg)
ax.legend()
ax.grid(True,alpha=0.3)
plt.title('Contrainte a la base en fonction de alpha',color=fg,fontsize=14)
plt.tight_layout()
plt.savefig('c2.png',dpi=150,facecolor=bg)
plt.show()

fig,ax=plt.subplots(figsize=(10,5))
ax.set_facecolor(bg); fig.patch.set_facecolor(bg)
y=np.linspace(0,H,500)
Eps=E*(1-nu)/((1+nu)*(1-2*nu))
u_y=-rho*g/(Eps)*(H*y-y**2/2)
ax.plot(u_y*1000,y,color='cyan',linewidth=2)
ax.set_xlabel('Deplacement vertical (mm)',color=fg,fontsize=13)
ax.set_ylabel('Hauteur y (m)',color=fg,fontsize=13)
ax.tick_params(colors=fg)
for spine in ax.spines.values(): spine.set_color(fg)
ax.grid(True,alpha=0.3)
plt.title('Deplacement vertical sous poids propre',color=fg,fontsize=14)
plt.tight_layout()
plt.savefig('c3.png',dpi=150,facecolor=bg)
plt.show()
print(f'Deplacement max au sommet: -0.824 mm')

Deplacement max au sommet: -0.824 mm

18.3 Synthèse

Grandeur Valeur Unité
Contrainte verticale max à la base 1.08 MPa
Déplacement vertical au sommet -0.824 mm
Angle de décollement de la base 6.91 deg
Angle critique de perte d’équilibre 19.98 deg

Trois phases : 1. \(\alpha < 6.9^\circ\) : contact complet (compression partout) 2. \(6.9^\circ < \alpha < 20.0^\circ\) : décollement partiel (stable) 3. \(\alpha > 20.0^\circ\) : perte d’équilibre (basculement)