====== Standardatmosphäre, Höhen und Geschwindigkeiten ====== Wer für die Luftfahrt rechnet, stolpert zuerst über die Begriffe: es gibt **fünf verschiedene Höhen** und **vier verschiedene Geschwindigkeiten**, und sie heißen alle ähnlich. Dieser Guide sortiert sie, zeigt für jede den Aufruf aus [[lyx_-_programmiersprache:units:aero:atmos|std.aero.atmos]] und benennt die Verwechslungen, die in der Luftfahrt schon Zwischenfälle verursacht haben. → [[lyx_-_programmiersprache:guides|Guides]] · [[lyx_-_programmiersprache:units:aero|std.aero Übersicht]] · [[lyx_-_programmiersprache:guides:mcdu|Guide: Flugführungsrechner bauen]] · [[lyx_-_programmiersprache:units:aero:atmos|Unit-Referenz]] import std.aero.atmos; // alles auf dieser Seite ''std.aero'' ist neu (Compiler-Repo, 2026-09-04) und im ausgelieferten ''lyxc 1.1.18A'' **noch nicht enthalten**. Die Beispiele dieser Seite wurden gegen den Standardbibliotheks-Baum des Compiler-Repos übersetzt und ausgeführt. ---- ===== 1. Was die Standardatmosphäre ist ===== Die ICAO-Standardatmosphäre ist eine **Vereinbarung**, keine Messung: ein festgelegter Verlauf von Temperatur, Druck und Dichte über der Höhe. Sie beschreibt nicht das Wetter von heute — sie ist der gemeinsame Nullpunkt, auf den alle Angaben bezogen werden. Ein Höhenmesser, ein Flughandbuch und eine Flugfläche wären ohne sie nicht vergleichbar. ^ Schicht ^ Bereich ^ Temperatur ^ | Troposphäre | 0 bis 11 km | fällt um 6,5 K je 1000 m, ab 15 °C | | untere Stratosphäre | 11 bis 20 km | **konstant** 216,65 K (−56,5 °C) | Oberhalb der Tropopause gilt die Troposphärenformel **nicht** mehr. Wer den Temperaturgradienten weiterrechnet, bekommt oberhalb von rund 71 km negative absolute Temperaturen — und lange vorher schon falsche Drücke. ''std.aero.atmos'' trennt beide Schichten und liefert oberhalb von 20 km ''AvError()'', statt zu extrapolieren. unit main; import std.aero.atmos; import std.io; import std.string; fn zeile(fl: f64): void { var hFt: f64 := AvDruckhoeheFtAusFlugflaeche(fl); var hM: f64 := AvFtToM(hFt); var s: pchar := StrConcat("FL", IntToStr(fl as int64)); s := StrConcat(s, " T="); s := StrConcat(s, FloatToStr(AvKToC(AvIsaTemperaturK(hM)), 1)); s := StrConcat(s, " C p="); s := StrConcat(s, FloatToStr(AvPaToHpa(AvIsaDruckPa(hM)), 1)); s := StrConcat(s, " hPa rho="); s := StrConcat(s, FloatToStr(AvIsaDichte(hM), 3)); s := StrConcat(s, " kg/m3 a="); s := StrConcat(s, FloatToStr(AvSchallgeschwindigkeitKt(AvIsaTemperaturK(hM)), 0)); PrintLn(StrConcat(s, " kt")); } fn main(): int64 { zeile(0.0); zeile(100.0); zeile(200.0); zeile(350.0); zeile(400.0); return 0; } FL0 T=15.0 C p=1013.3 hPa rho=1.225 kg/m3 a=661 kt FL100 T=-4.8 C p=696.8 hPa rho=0.905 kg/m3 a=638 kt FL200 T=-24.6 C p=465.6 hPa rho=0.653 kg/m3 a=614 kt FL350 T=-54.3 C p=238.4 hPa rho=0.380 kg/m3 a=576 kt FL400 T=-56.5 C p=187.5 hPa rho=0.302 kg/m3 a=574 kt Zwischen FL350 und FL400 ändert sich die Temperatur kaum noch — das ist die Tropopause. Und die Schallgeschwindigkeit hängt **nur** an der Temperatur, nicht am Druck: deshalb fällt sie oben nicht weiter. ==== Geopotentiell oder geometrisch? ==== ISA ist über der **geopotentiellen** Höhe definiert — einer Höhe, die die abnehmende Schwerkraft schon eingerechnet hat. Ein Höhenmesser misst Druck und liefert damit ebenfalls eine geopotentielle Größe. Der Unterschied zur geometrischen Höhe ist klein (in 11 km rund 19 m), aber er ist da: var hPot: f64 := AvGeometrischZuGeopotentiell(11000.0); // geometrisch -> geopotentiell var hGeo: f64 := AvGeopotentiellZuGeometrisch(11000.0); // und zurück Für Flugführungsrechnungen ist die geopotentielle Höhe die richtige Größe; die geometrische braucht man beim Vergleich mit Geländedaten und Satellitenhöhen. ---- ===== 2. Die fünf Höhen ===== ^ Höhe ^ Was sie ist ^ Aufruf ^ | **Wahre Höhe** | tatsächlicher Abstand über Meer | ''AvWahreHoeheM'' | | **Angezeigte Höhe** | was der Höhenmesser bei eingestelltem QNH zeigt | Eingabe | | **Druckhöhe** | was er bei 1013,25 hPa zeigen würde | ''AvDruckhoeheFt'' | | **Dichtehöhe** | die Höhe, in der ISA die tatsächliche Dichte hat | ''AvDichtehoeheFt'' | | **Flugfläche** | Druckhöhe in Hundert Fuß | ''AvFlugflaecheAusDruckhoeheFt'' | unit main; import std.aero.atmos; import std.io; import std.string; fn zeig(name: pchar, wert: f64, einheit: pchar): void { PrintLn(StrConcat(StrConcat(name, FloatToStr(wert, 0)), einheit)); } fn main(): int64 { var platzFt: f64 := 1500.0; // Platzhöhe var qnh: f64 := 985.0; // Tiefdruck var oatC: f64 := 0.0 - 15.0; // kalt var dhFt: f64 := AvDruckhoeheFt(qnh, platzFt); zeig("Druckhoehe: ", dhFt, " ft"); zeig("Dichtehoehe: ", AvDichtehoeheFt(dhFt, oatC), " ft"); var isaAbw: f64 := AvIsaAbweichungK(AvFtToM(dhFt), oatC); zeig("ISA-Abweichung: ", isaAbw, " K"); var wahrM: f64 := AvWahreHoeheM(AvFtToM(3000.0), AvFtToM(platzFt), isaAbw); zeig("angezeigt 3000 ft -> ", AvMToFt(wahrM), " ft wahr"); zeig("Uebergangsflaeche: FL", AvUebergangsflaeche(5000.0, qnh, 1000.0), ""); return 0; } Druckhoehe: 2272 ft Dichtehoehe: -932 ft ISA-Abweichung: -25 K angezeigt 3000 ft -> 2866 ft wahr Uebergangsflaeche: FL70 Drei Dinge lassen sich daran ablesen: * **QNH 985 hebt die Druckhöhe** um rund 770 ft über die Platzhöhe. Deshalb liegt auch die Übergangsfläche höher als bei Normaldruck — sie wird gerechnet und nicht als Konstante geführt. * **Die Dichtehöhe ist negativ**, weil die Luft kalt und damit dicht ist. An einem heißen Tag ist es umgekehrt: das Flugzeug steht leistungsmäßig Tausende Fuß höher, als der Höhenmesser zeigt — das ist die Zahl, die über Startstrecke und Steigleistung entscheidet. * **Bei kalter Luft ist die wahre Höhe kleiner als die angezeigte.** 3000 angezeigte Fuß sind hier 2866 wahre — 134 ft fehlen. Das ist die gefährliche Richtung, und der Grund, warum es ''AvWahreHoeheM'' überhaupt gibt. **Eine Flugfläche ist keine Höhe.** FL350 heißt: der Höhenmesser steht auf 1013,25 hPa und zeigt 35000 ft. Bei ISA−30 liegt die geometrische Höhe deutlich tiefer — auf 10000 ft fehlen rund 1200 ft. Wer Flugflächen und Höhen gleichsetzt, fliegt im Winter tiefer, als er denkt. In den Bergen ist das der Unterschied zwischen Freigängigkeit und Aufschlag. Die Faustformel der Fliegerei lautet „4 % je 10 °C Abweichung". ''AvWahreHoeheM'' rechnet die Beziehung dahinter — die Faustformel liegt bei großen Abweichungen mehrere hundert Fuß daneben. ---- ===== 3. Die vier Geschwindigkeiten ===== ^ Kürzel ^ Name ^ Wofür sie steht ^ | **CAS** | calibrated airspeed | was das Instrument zeigt (um Einbaufehler bereinigt) — die Größe, nach der geflogen wird | | **EAS** | equivalent airspeed | dieselbe Staudruckwirkung auf Meereshöhe — daran hängen die **Strukturgrenzen** (VMO) | | **TAS** | true airspeed | tatsächliche Geschwindigkeit gegen die Luft — geht in Navigation und Flugzeit ein | | **Mach** | Machzahl | Verhältnis zur Schallgeschwindigkeit — daran hängt das **aerodynamische** Limit (MMO) | unit main; import std.aero.atmos; import std.io; import std.string; fn zeile(fl: f64, casKt: f64): void { var hM: f64 := AvFtToM(AvDruckhoeheFtAusFlugflaeche(fl)); var oatC: f64 := AvKToC(AvIsaTemperaturK(hM)); var s: pchar := StrConcat("FL", IntToStr(fl as int64)); s := StrConcat(s, " CAS="); s := StrConcat(s, FloatToStr(casKt, 0)); s := StrConcat(s, " EAS="); s := StrConcat(s, FloatToStr(AvEasKtAusTasKt(AvTasKtAusCasKt(casKt, hM, oatC), hM), 0)); s := StrConcat(s, " TAS="); s := StrConcat(s, FloatToStr(AvTasKtAusCasKt(casKt, hM, oatC), 0)); s := StrConcat(s, " M="); PrintLn(StrConcat(s, FloatToStr(AvMachAusCasKt(casKt, hM), 3))); } fn main(): int64 { zeile(0.0, 280.0); zeile(100.0, 280.0); zeile(200.0, 280.0); zeile(300.0, 280.0); zeile(390.0, 280.0); var xoverFt: f64 := AvUebergangshoeheFt(280.0, 0.78); PrintLn(StrConcat("Crossover 280 kt / M0.78: ", StrConcat(FloatToStr(xoverFt, 0), " ft"))); return 0; } FL0 CAS=280 EAS=280 TAS=280 M=0.423 FL100 CAS=280 EAS=277 TAS=323 M=0.506 FL200 CAS=280 EAS=273 TAS=375 M=0.610 FL300 CAS=280 EAS=268 TAS=437 M=0.742 FL390 CAS=280 EAS=260 TAS=511 M=0.891 Crossover 280 kt / M0.78: 32464 ft **Dieselbe angezeigte Geschwindigkeit ist oben fast doppelt so schnell.** Und die Machzahl wächst dabei von 0,42 auf 0,89 — deshalb kann ein Flugzeug nicht in jeder Höhe dieselbe CAS fliegen: irgendwann stößt es an MMO. **TAS ist nicht CAS·√(ρ0/ρ).** Diese einfache Wurzelformel liefert **EAS**. Der Unterschied ist die Kompressibilität und wächst mit der Geschwindigkeit — bei 300 kt in FL350 liegen zwischen beiden über zehn Knoten. ''std.aero.atmos'' rechnet durchgehend kompressibel; in der Tabelle oben ist der Abstand zwischen EAS und TAS genau dieser Effekt plus Dichte. ==== Die Übergangshöhe ==== Ein Verkehrsflugzeug steigt unten mit **fester CAS** und oben mit **fester Machzahl**. Genau in einer Höhe gehören beide zusammen — dort wird umgeschaltet: var xoverFt: f64 := AvUebergangshoeheFt(280.0, 0.78); // 32464 ft Die Höhe wird per Bisektion **gesucht**, nicht geschätzt: die Beziehung ist nicht geschlossen umkehrbar. Wer sie ignoriert und durchgehend mit CAS rechnet, bekommt oben eine zu kleine TAS und damit eine zu kurze Strecke — ein Fehler, der sich über einen Steigflug zu mehreren Meilen summiert. ---- ===== 4. Fehler behandeln ===== Jede Funktion liefert bei unsinniger Eingabe **NaN**, nicht 0: var tas: f64 := AvTasKtAusCasKt(casKt, hM, oatC); if (AvIsError(tas)) { PrintLn("ausserhalb des Gueltigkeitsbereichs"); return 1; } Der Grund: 0 und 1 sehen bei physikalischen Größen beide nach einem gültigen Ergebnis aus. Eine Steigrate von 0 ist eine Aussage; eine Steigrate von 0, weil die Eingabe unsinnig war, ist eine Lüge — und sie wandert unbemerkt in die nächste Rechnung. ''AvIsError'' prüft auf NaN, den einzigen Wert, der sich selbst ungleich ist. **Gültig sind** 0 bis 20 km geopotentielle Höhe und Unterschall bis Mach 1. ---- ===== 5. Merksätze ===== * Die **Einheit steht im Namen**: ''AvTasKtAusCasKt'' nimmt und liefert Knoten, ''AvIsaDruckPa'' Pascal. Ein Name ohne Einheit wäre in dieser Unit ein Fehler. * **Druckhöhe** für alles, was mit Flugflächen und Instrumenten zu tun hat. **Dichtehöhe** für alles, was mit Leistung zu tun hat. **Wahre Höhe** für alles, was mit Gelände zu tun hat. * Bei **kalter** Luft ist die wahre Höhe kleiner als die angezeigte — nie umgekehrt annehmen. * **CAS fliegt man, TAS navigiert man, EAS hält die Struktur, Mach hält die Aerodynamik.** * Oberhalb der Tropopause ändert sich die Temperatur nicht mehr — und damit auch die Schallgeschwindigkeit nicht. ---- Weiter: [[lyx_-_programmiersprache:guides:navigation|Navigation und Wegpunkte]] rechnet die waagerechte Seite (Kurse, Strecken, Wind), [[lyx_-_programmiersprache:guides:mcdu|Einen Flugführungsrechner bauen (MCDU/FMS)]] baut auf diesen Größen auf — Steig- und Sinkprofile, Sinkflugbeginn, Vorhersage über die Route und Warteschleifen. Letzte Aktualisierung: 2026-09-05 — Seite neu angelegt; alle Beispiele gegen lyxc 1.1.18A übersetzt und ausgeführt, die Ausgaben stammen aus dem Lauf. Prüflauf 2026-09-05 mit ''doku-pruefer.py'' über den gesamten Aero-Bereich (Repo-Compiler **lyxc 1.2.2A**): 13 Vollprogramme, 13 übersetzen, 0 echte Fehler; 193 Aufrufe gegen die ''pub fn''-Signaturen in ''aurum/std'' gehalten, 0 Abweichungen.