Integrazione numerica e carrello

Il computer non sa fare derivate e integrali "veri": avanza a piccoli passi. Quanto piccoli, e come, decide se la simulazione sta in piedi.

Dal continuo ai passi

Le equazioni del moto (capitolo 7) sono equazioni differenziali: dicono quanto cambia lo stato in un istante, \(\dot{\mathbf s}=f(\mathbf s,t)\). Per conoscere lo stato fra un secondo bisogna integrarle. Quasi mai si può farlo con carta e penna; il computer allora divide il tempo in passi \(\Delta t\) e approssima.

Tre metodi

Eulero esplicito (il più semplice): \(\;x_{n+1}=x_n+v_n\Delta t,\quad v_{n+1}=v_n+a_n\Delta t\)

Eulero semi-implicito (simplettico): prima la velocità, poi la posizione con la velocità nuova: \(\;v_{n+1}=v_n+a_n\Delta t,\quad x_{n+1}=x_n+v_{n+1}\Delta t\)

Runge-Kutta del 4° ordine (RK4): valuta l'accelerazione quattro volte per passo e fa una media pesata; l'errore cala come \(\Delta t^4\).

La differenza fra i primi due sembra un dettaglio, ma è enorme: con Eulero esplicito una molla senza attrito guadagna energia a ogni passo e oscilla sempre di più; con il semi-implicito l'energia resta limitata. Il simulatore usa il semi-implicito (vedi il riquadro del capitolo 7: prima vel, poi pos con la velocità aggiornata) e fa 240 passi al secondo, 4 per ogni fotogramma a 60 Hz.

La condizione di stabilità

Per un oscillatore di pulsazione \(\omega_n=\sqrt{k/m}\) il metodo semi-implicito è stabile solo se

$$\omega_n\,\Delta t<2\qquad\Longleftrightarrow\qquad \Delta t<\frac{2}{\omega_n}=2\sqrt{\frac mk}.$$

Le molle "rigide" hanno \(\omega_n\) alto e obbligano a passi piccoli. Per il carrello del Cessna (\(\omega_n\approx12{,}6\) rad/s) il limite è circa 1/6 di secondo: i 240 Hz del simulatore danno un margine di 40 volte. Il margine serve perché le forze del carrello cambiano bruscamente (in pochi millesimi una ruota passa da zero a migliaia di newton) e perché l'errore, anche quando il calcolo è stabile, cresce con il passo: con passi grandi il contatto si "sente" a scatti e l'atterraggio sembra più duro o più morbido del vero.

Il carrello: molla, smorzatore, attrito

Ogni ruota è un punto dell'aereo (in assi corpo). A ogni passo il programma calcola dove si trova rispetto al terreno; se è "sotto" di una profondità \(\delta\) (la compressione), nasce una forza verticale come quella di un ammortizzatore:

Forza normale della ruota (modello di Kelvin-Voigt)
$$N=\max\left(0,\;k\,\delta-c\,\dot z\right)$$

\(k\) rigidezza (N/m), \(c\) smorzamento (N·s/m), \(\dot z\) velocità verticale del punto della ruota (positiva verso l'alto). Il max(0, …) c'è perché il terreno può spingere ma non tirare.

Il rapporto di smorzamento \(\zeta=\dfrac{c}{2\sqrt{k\,m}}\) dice come si ferma l'oscillazione: \(\zeta<1\) rimbalza qualche volta, \(\zeta=1\) torna a riposo nel tempo più breve senza rimbalzi, \(\zeta>1\) torna piano.

RuotaRigidezza kSmorzamento cNote

Lungo il terreno la ruota ha attrito: di rotolamento in avanti (\(\mu=0{,}02\) su asfalto, 0,06 sull'erba, fino a +0,6 con i freni), molto più forte di traverso (la gomma non vuole scivolare di lato, \(\mu=0{,}75\)). L'attrito è "regolarizzato": invece di un salto fra fermo e in movimento cresce con la velocità di scivolamento fino al limite \(\mu N\), così il calcolo non vibra.

$$F_{avanti}=-\operatorname{clamp}\left(15\,000\cdot v_{avanti},\;-\mu N,\;\mu N\right)$$
Laboratorio — atterraggio su una molla
ωn·Δt ζ compressione massima

Massa di 1000 kg sulle tre ruote del Cessna (rigidezze sommate), che tocca la pista scendendo alla velocità scelta, con tutto il peso sulle ruote (la portanza è ormai calata): rimbalza e si assesta alla compressione statica. Curva blu: Eulero semi-implicito; rossa: Eulero esplicito; grigia: RK4 (quasi la soluzione esatta). Lo smorzamento è un fattore sul valore del simulatore.

Nel simulatore

Il ciclo delle ruote (js/fisica.js, righe 160–193), qui ridotto all'essenziale:

for(const w of ruote){
  rw.copy(w.p).applyQuaternion(st.q); pw.copy(st.pos).add(rw);  // ruota in assi terra
  const pen=terra.suolo(pw.x,pw.z)-pw.y;                         // compressione
  if(pen<=0) continue;                                           // in aria
  vp.crossVectors(wW,rw).add(st.vel);                            // velocità del punto: v + ω×r
  if(!w.contatto&&-vp.y>A.limiti.vsContatto) crash(...);         // troppo duro!
  const Nf=Math.max(0,w.rigidezza*pen-w.smorzamento*vp.y);
  const mu=w.pattino?0.45:(tipo==='erba'?0.06:0.02)+(w.freno?st.freno*0.6:0);
  const Ff=-clamp(vf*15000,-mu*Nf,mu*Nf);      // rotolamento e freni
  const Fs=-clamp(vs*20000,-0.75*Nf,0.75*Nf);  // aderenza laterale
  fc.set(0,Nf,0).addScaledVector(fdir,Ff).addScaledVector(sdir,Fs);
  Fw.add(fc); tmp.crossVectors(rw,fc); Tw.add(tmp);              // forza e momento r × F
}

Notare \(\vec v_{punto}=\vec v+\vec\omega\times\vec r\): la velocità di un punto di un corpo rigido che ruota. E il momento \(\vec r\times\vec F\) che la ruota esercita sull'aereo: è lui che abbassa il muso quando tocca il ruotino. Se una ruota tocca a più di 3,6 m/s (700 ft/min) il carrello si rompe.

Prova tu
  1. Calcola \(\omega_n\) e il passo massimo stabile per una ruota principale del Cessna (\(k=60\,000\) N/m) che porta 400 kg.
  2. Calcola \(\zeta\) della stessa ruota con \(c=6000\) N·s/m. Rimbalza?
  3. Con l'aereo fermo sulla pista, di quanto è compresso il carrello? (Usa le rigidezze della tabella e supponi il peso diviso 20% / 40% / 40%.)
Soluzioni
  1. \(\omega_n=\sqrt{60\,000/400}=12{,}2\) rad/s (circa 2 Hz); \(\Delta t<2/12{,}2=0{,}16\) s. Il passo del simulatore (1/240 = 0,004 s) è 40 volte più piccolo: stabile e preciso.
  2. \(\zeta=6000/(2\sqrt{60\,000\cdot400})=0{,}61\): rimbalza appena, e si ferma in meno di un'oscillazione.
  3. Ruotino \(1962/40\,000=4{,}9\) cm; principali \(3924/60\,000=6{,}5\) cm.