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.
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:
\(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.
| Ruota | Rigidezza k | Smorzamento c | Note |
|---|
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)$$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.
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.
- Calcola \(\omega_n\) e il passo massimo stabile per una ruota principale del Cessna (\(k=60\,000\) N/m) che porta 400 kg.
- Calcola \(\zeta\) della stessa ruota con \(c=6000\) N·s/m. Rimbalza?
- 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
- \(\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.
- \(\zeta=6000/(2\sqrt{60\,000\cdot400})=0{,}61\): rimbalza appena, e si ferma in meno di un'oscillazione.
- Ruotino \(1962/40\,000=4{,}9\) cm; principali \(3924/60\,000=6{,}5\) cm.