Inhaltsverzeichnis

std.astro.launch — Raketengleichung, Stufung, Startazimut

import std.astro.launch;

Vom Triebwerk bis zum Startplatz: Ziolkowski, Stufung, Schub-Gewicht-Verhältnis, Verluste beim Aufstieg und der Zusammenhang zwischen Startbreite, Azimut und erreichbarer Inklination.

std.astro (Übersicht) · std.astro.orbit · Startplätze (Referenzwerte) · Trägerraketen (Referenzsysteme) · Orbit-Matrix


1. Raketengleichung

Funktion Rückgabe Bedeutung
AStandardGravity() f64 9.80665 m/s² — die Normfallbeschleunigung, nicht die örtliche Schwere. Der spezifische Impuls ist über sie festgelegt, weltweit gleich
AExhaustSpeed(isp) f64 [m/s] v_e = Isp·g₀
ADvTsiolkovsky(isp, mWet, mDry) f64 [m/s] Isp·g₀·ln(m_voll/m_leer); NaN, wenn mDry > mWet
AMassRatio(isp, dv) f64 Umkehrung: e^(dv/v_e)
APropellantMass(isp, dv, mDry) f64 [kg] Treibstoff für ein gefordertes dv
ABurnTime(mProp, massFlow) f64 [s] bei konstantem Massenstrom
AMassFlow(thrust, isp) f64 [kg/s] F/(Isp·g₀)

Die Formel sagt zwei Dinge, die beim Auslegen immer wieder gebraucht werden: dv wächst nur logarithmisch mit dem Massenverhältnis (doppelt so viel Treibstoff bringt nicht doppelt so viel), aber linear mit Isp — ein besseres Triebwerk lohnt mehr als ein größerer Tank.

2. Stufung

Funktion Rückgabe Bedeutung
ADvStage(isp, mStructure, mProp, mPayload) f64 dv einer Stufe, die eine Nutzlast mitschleppt
AStructuralRatio(mStructure, mProp) f64 m_struktur/(m_struktur+m_treib); heute 0.05…0.12
ADvStageLimit(isp, structuralRatio) f64 Isp·g₀·ln(1/σ) — dv ohne jede Nutzlast
ADvTwoStages(isp1, mStruct1, mProp1, isp2, mStruct2, mProp2, mPayload) f64 zwei Stufen; die erste trägt die zweite mit Nutzlast
 
ADvStageLimit ist die Zahl, an der jede Einstufigkeit scheitert. Liegt der Bedarf darüber, hilft kein größerer Tank mehr — nur eine weitere Stufe oder ein besseres Triebwerk. Der Grund für Stufung überhaupt: die Nutzlast steht in beiden Massen und verkleinert das wirksame Verhältnis; eine leere Stufe weiterzutragen kostet dv, das keiner Nutzlast zugutekommt.

3. Schub und Beschleunigung

Funktion Rückgabe Bedeutung
AThrustToWeight(thrust, mass, gLocal) f64 Schub-Gewicht-Verhältnis am Startort
ALiftsOff(thrust, mass, gLocal) bool über 1? Unter 1 hebt die Rakete nicht ab — das ist keine Ungenauigkeit, sondern die Bedingung
ALiftoffAccel(thrust, mass, gLocal) f64 [m/s²] was tatsächlich ankommt: Schub minus Gewicht

4. Verluste und Drehgewinn

Funktion Rückgabe Bedeutung
AGravityLoss(gLocal, gamma, duration) f64 [m/s] g·sin γ·t
AEarthRotation() f64 7.292115e−5 rad/s (siderisch)
ARotationGain(omega, R, latitude, azimuth) f64 [m/s] ω·R·cos(breite)·sin(azimut)
ADvAscent(mu, rOrbit, losses, rotationGain) f64 [m/s] v_kreis + verluste − drehgewinn

Der Gravitationsverlust ist der Grund für die Neigeprogramme: senkrecht steigen kostet die volle Schwere, waagerecht fliegen nichts. Der Drehgewinn ist nach Osten am größten — am Äquator 465 m/s, in Kourou (5.2° N) noch 463 m/s. Nach Westen kostet er zusätzlich; das Vorzeichen ist Teil der Aussage und wird nicht weggerechnet.

Für die Erde und einen niedrigen Orbit ergibt die Bilanz rund 9.3…9.5 km/s bei 7.8 km/s Bahngeschwindigkeit — die Differenz sind die Verluste, und genau deshalb stehen sie als eigenes Argument statt als eingebauter Zuschlag.

5. Startazimut und Inklination

cos(i) = cos(breite) · sin(azimut)
Funktion Rückgabe Bedeutung
AInclinationFromAzimuth(latitude, azimuth) f64 [rad] erreichbare Inklination
ALaunchAzimuth(latitude, inclination) f64 [rad] Azimut von Nord über Ost; NaN, wenn die Inklination von dieser Breite aus nicht erreichbar ist
AInclinationReachable(latitude, inclination) bool dieselbe Frage als Ja/Nein
AMinInclination(latitude) f64 [rad] die Breite selbst (Azimut 90°, nach Osten)
AAzimuthPenalty(v, latitude, inclination) f64 [m/s] was die spätere Ebenenänderung kostet, wenn der Startort die Zielinklination nicht hergibt; 0 wenn erreichbar

Startplätze im Vergleich, gerechnet mit AMinInclination, ARotationGain, ALaunchAzimuth und AAzimuthPenalty. Die vollständige Rampen-Referenz mit Koordinaten, Quellen und einem übernehmbaren Konstantenblock steht auf einer eigenen Seite: Startplätze. Zielbahn 51.6 Grad wie die ISS; die Strafe bezieht sich auf eine 28.5-Grad-Bahn bei 7725.8 m/s. Die Koordinaten stammen aus Wikipedia/Wikidata, die Zahlen aus dem Programm in Abschnitt 9.

Startplatz Betreiber / Träger Breite min. Inklination Drehgewinn nach Ost Azimut für 51.6° Strafe für 28.5°
Starbase (Boca Chica, TX) SpaceX, Starship 25.997° N 26.00° 418.0 m/s 43.72° 0 m/s
SLC-40 (Cape Canaveral SFS) SpaceX, Falcon 9 28.5619° N 28.56° 408.5 m/s 45.01° 8.3 m/s
LC-39A (Kennedy Space Center) SpaceX, Falcon 9 / Falcon Heavy 28.6083° N 28.61° 408.3 m/s 45.03° 14.6 m/s
SLC-4E (Vandenberg SFB) SpaceX, Falcon 9 34.633° N 34.63° 382.7 m/s 49.02° 826.6 m/s
Kourou (CSG) Arianespace 5.2° N 5.2° 463.2 m/s 38.59° 0 m/s
Baikonur Roskosmos 45.6° N 45.6° 324.9 m/s 62.60° 2363.9 m/s

Daran lässt sich die Arbeitsteilung der drei SpaceX-Rampen ablesen:

Zum Vergleich: Kourou liefert nochmals 45 m/s mehr als Starbase und erreicht als einziger Platz eine äquatornahe Bahn direkt. Baikonur zahlt für jede niedrige Inklination — 2364 m/s für eine 28.5-Grad-Bahn, mehr als der halbe Weg vom Erdorbit zum Mond.

 
Die härteste Einschränkung eines Startorts überhaupt: eine Inklination unterhalb der Startbreite ist direkt nicht erreichbar. Von Baikonur (45.6° N) führt kein Azimut in eine 28-Grad-Bahn. Das kostet später eine Ebenenänderung — bei 7.8 km/s rund 134 m/s je Grad. Genau deshalb liegen Startplätze möglichst äquatornah.
 
Zwei Äste, zwei Funktionen (#1909, nachgemessen mit lyxc 1.2.2B). Die Gleichung cos(i) = cos(breite)·sin(azimut) hat für jede erreichbare Inklination zwei Lösungen: den nördlichen Ast und den südlichen 180° − β. Beide führen in dieselbe Bahnneigung; die Wahl entscheiden Überflugkorridore und Bergungsschiffe.

ALaunchAzimuth liefert den nördlichen Ast, ALaunchAzimuthSouth den südlichen — und beide als Kompassrichtung in [0°, 360°). Frühere Fassungen gaben den rohen asin-Wert zurück: eine sonnensynchrone Bahn ab Vandenberg ergab −9.13 Grad. Heute kommt dort 351.6 Grad heraus, und der Südast liefert die tatsächlich geflogene Richtung.

Was bleibt: die Formel vernachlässigt die Erddrehung, die den tatsächlichen Azimut um einige Grad verschiebt (real fliegt Vandenberg SSO bei etwa 196 statt 189 Grad). Für die Auslegung ist das in Ordnung — als Steuergröße nicht.

6. Die Parameter im Einzelnen

Name Bedeutung Einheit Typische Werte
isp spezifischer Impuls des Triebwerks Sekunden 250…290 Feststoff, 300…340 Kerosin/LOX, 440…465 Wasserstoff/LOX (Vakuum)
mWet / mDry Masse mit und ohne Treibstoff kg mDry > mWet ⇒ NaN
mStructure Leermasse einer Stufe ohne Nutzlast: Tanks, Triebwerke, Struktur kg
mProp Treibstoffmasse dieser Stufe kg
mPayload Nutzlast, die die Stufe mitschleppt — bei der Unterstufe gehört die ganze Oberstufe dazu kg
structuralRatio Strukturanteil σ = m_struktur/(m_struktur+m_treib) dimensionslos 0.05…0.12; muss zwischen 0 und 1 liegen
thrust Schub Newton (nicht kN) Falcon-9-Erststufe ≈ 7.6e6 N
gLocal örtliche Schwerebeschleunigung am Startort m/s² 9.81 Erde, 3.71 Mars, 1.62 Mond — nicht zu verwechseln mit AStandardGravity()
gamma Bahnwinkel gegen die Horizontale beim Aufstieg Radiant 90 Grad senkrecht, gegen 0 beim Einschwenken
duration Dauer, über die der Gravitationsverlust wirkt s
omega Drehrate des Startkörpers rad/s AEarthRotation() = 7.292115e−5
latitude geografische Breite des Startplatzes Radiant Kourou 5.2°, Cape 28.5°, Baikonur 45.6°
azimuth Startrichtung, von Nord über Ost gemessen Radiant 90 Grad = genau Ost
inclination Zielinklination Radiant
losses Summe aller Aufstiegsverluste m/s 1300…2000 für die Erde
 
AStandardGravity() ist nicht die örtliche Schwere. Die 9.80665 m/s² sind eine Festlegung, über die der spezifische Impuls definiert ist — weltweit gleich, auch für einen Marsstart. Wo die tatsächliche Schwere gebraucht wird (Schub-Gewicht-Verhältnis, Gravitationsverlust), steht gLocal als eigenes Argument. Ein Marsstart rechnet also mit Isp·9.80665 für die Ausströmgeschwindigkeit und mit 3.71 für das Abheben.

Isp steht in Sekunden, nicht in m/s — die Ausströmgeschwindigkeit liefert AExhaustSpeed. Wer versehentlich 3138 statt 320 einsetzt, bekommt ein zehnfach zu großes dv, das durchaus plausibel aussieht.

7. Beispiel: Triebwerk und Startplatz

import std.astro.orbit;
import std.astro.launch;
import std.math;
import std.io;

fn zeig(n: pchar, v: f64, d: int64): void { Print(n); PrintLn(FloatToStr(v, d)); }
fn BI(b: bool): int64 { if (b) { return 1; } return 0; }

fn main(): int64 {
    var muE:  f64 := AMuEarth();
    var r400: f64 := ARadiusEarth() + 400000.0;
    var rad:  f64 := Pi() / 180.0;

    zeig("v_e bei Isp 320    : ", AExhaustSpeed(320.0), 1);
    zeig("dv 1000 auf 400 kg : ", ADvTsiolkovsky(320.0, 1000.0, 400.0), 1);
    zeig("Massenverh. 3 km/s : ", AMassRatio(320.0, 3000.0), 4);
    zeig("Drehgewinn Kourou  : ", ARotationGain(AEarthRotation(), ARadiusEarth(), 5.2 * rad, Pi() / 2.0), 1);
    zeig("min Inkl Baikonur  : ", AMinInclination(45.6 * rad) / rad, 2);
    Print("28 Grad erreichbar?: ");
    PrintLn(IntToStr(BI(AInclinationReachable(45.6 * rad, 28.0 * rad))));
    zeig("Azimut fuer 51.6   : ", ALaunchAzimuth(45.6 * rad, 51.6 * rad) / rad, 2);
    zeig("dv Aufstieg LEO    : ", ADvAscent(muE, r400, 1500.0, 400.0), 1);
    return 0;
}

v_e bei Isp 320    : 3138.1
dv 1000 auf 400 kg : 2875.4
Massenverh. 3 km/s : 2.6012
Drehgewinn Kourou  : 463.2
min Inkl Baikonur  : 45.60
28 Grad erreichbar?: 0
Azimut fuer 51.6   : 62.60
dv Aufstieg LEO    : 8768.6

8. Beispiel: Auslegung einer zweistufigen Rakete

Die Frage, die am Anfang jeder Auslegung steht: reicht eine Stufe? Und wenn nicht — was leisten zwei?

import std.astro.orbit;
import std.astro.launch;
import std.math;
import std.io;

fn zeig(n: pchar, v: f64, d: int64): void { Print(n); PrintLn(FloatToStr(v, d)); }
fn BI(b: bool): int64 { if (b) { return 1; } return 0; }

fn main(): int64 {
    var rad: f64 := Pi() / 180.0;

    // dv einer Stufe OHNE jede Nutzlast — die harte Schranke
    zeig("Grenze Isp 320 s=0.08: ", ADvStageLimit(320.0, 0.08), 1);
    zeig("Grenze Isp 450 s=0.08: ", ADvStageLimit(450.0, 0.08), 1);
    zeig("Grenze Isp 450 s=0.05: ", ADvStageLimit(450.0, 0.05), 1);

    // Zwei Stufen: Kerosin unten, Wasserstoff oben, 5 t Nutzlast
    var dv: f64 := ADvTwoStages(311.0, 20000.0, 380000.0,
                                451.0,  4000.0,  80000.0, 5000.0);
    zeig("dv zweistufig        : ", dv, 1);
    zeig("Strukturanteil St.1  : ", AStructuralRatio(20000.0, 380000.0), 4);

    var m0: f64 := 20000.0 + 380000.0 + 4000.0 + 80000.0 + 5000.0;
    zeig("Startmasse t         : ", m0 / 1000.0, 1);
    zeig("Schub-Gewicht 6 MN   : ", AThrustToWeight(6000000.0, m0, 9.80665), 3);
    Print("hebt ab?             : "); PrintLn(IntToStr(BI(ALiftsOff(6000000.0, m0, 9.80665))));
    zeig("Startbeschleunigung  : ", ALiftoffAccel(6000000.0, m0, 9.80665), 2);
    zeig("Brenndauer St.1 s    : ", ABurnTime(380000.0, AMassFlow(6000000.0, 311.0)), 1);
    zeig("Gravverlust 150 s 45 : ", AGravityLoss(9.80665, 45.0 * rad, 150.0), 1);
    return 0;
}

Grenze Isp 320 s=0.08: 7926.1
Grenze Isp 450 s=0.08: 11146.0
Grenze Isp 450 s=0.05: 13220.1
dv zweistufig        : 14712.4
Strukturanteil St.1  : 0.0500
Startmasse t         : 489.0
Schub-Gewicht 6 MN   : 1.251
hebt ab?             : 1
Startbeschleunigung  : 2.46
Brenndauer St.1 s    : 193.2
Gravverlust 150 s 45 : 1040.2

Die ersten drei Zeilen beantworten die Einstufigkeits-Frage. Der Bedarf in den Erdorbit liegt bei rund 9.4 km/s einschließlich Verluste:

Die zweistufige Auslegung liefert 14.7 km/s — reichlich über dem Bedarf, weil die 5 t Nutzlast nur die Oberstufe belasten. Das Schub-Gewicht-Verhältnis von 1.25 ist typisch: darunter wird der Gravitationsverlust unbezahlbar, viel darüber kostet unnötig Struktur. Die verbleibende Startbeschleunigung von 2.46 m/s² zeigt, wie knapp der Anfang ist — eine Viertel-g.

Der Gravitationsverlust ist die Zahl, die den Rest erklärt: 150 Sekunden bei 45 Grad Bahnwinkel kosten 1040 m/s. Deshalb kippt jede Rakete so früh wie möglich — und so spät wie nötig, um die dichte Luft schnell hinter sich zu lassen.

9. Beispiel: Startplätze durchrechnen

Die Tabelle in Abschnitt 5 stammt aus diesem Programm — die Breiten sind belegte Koordinaten, alles andere ist gerechnet:

import std.astro.orbit;
import std.astro.launch;
import std.math;
import std.io;

fn f(v: f64, d: int64): pchar { return FloatToStr(v, d); }

fn zeile(name: pchar, breiteGrad: f64, zielGrad: f64, vergleichGrad: f64): void {
    var rad: f64 := Pi() / 180.0;
    var b: f64 := breiteGrad * rad;
    Print(name);
    Print("  min i "); Print(f(AMinInclination(b) / rad, 2));
    Print("  Drehgewinn Ost ");
    Print(f(ARotationGain(AEarthRotation(), ARadiusEarth(), b, Pi() / 2.0), 1));
    var az: f64 := ALaunchAzimuth(b, zielGrad * rad);
    Print("  Azimut ");
    if (AIsError(az)) { Print("nicht erreichbar"); } else { Print(f(az / rad, 2)); }
    Print("  Strafe "); PrintLn(f(AAzimuthPenalty(7725.8, b, vergleichGrad * rad), 1));
}

fn main(): int64 {
    PrintLn("Zielbahn 51.6 Grad, Vergleichsstrafe fuer 28.5 Grad:");
    zeile("SLC-40   28.5619 N ", 28.5619, 51.6, 28.5);
    zeile("LC-39A   28.6083 N ", 28.6083, 51.6, 28.5);
    zeile("SLC-4E   34.633  N ", 34.633,  51.6, 28.5);
    zeile("Starbase 25.997  N ", 25.997,  51.6, 28.5);

    PrintLn("");
    PrintLn("Sonnensynchron (97.5 Grad) - erreichbar?");
    var rad: f64 := Pi() / 180.0;
    var orte: [4]f64 := [28.5619, 28.6083, 34.633, 25.997];
    var i: int64 := 0;
    while (i < 4) {
        var az: f64 := ALaunchAzimuth(orte[i] * rad, 97.5 * rad);
        Print("  Breite "); Print(f(orte[i], 4)); Print(" -> Azimut ");
        PrintLn(f(az / rad, 2));
        i := i + 1;
    }
    return 0;
}

Zielbahn 51.6 Grad, Vergleichsstrafe fuer 28.5 Grad:
SLC-40   28.5619 N   min i 28.56  Drehgewinn Ost 408.5  Azimut 45.01  Strafe 8.3
LC-39A   28.6083 N   min i 28.61  Drehgewinn Ost 408.3  Azimut 45.03  Strafe 14.6
SLC-4E   34.633  N   min i 34.63  Drehgewinn Ost 382.7  Azimut 49.02  Strafe 826.6
Starbase 25.997  N   min i 26.00  Drehgewinn Ost 418.0  Azimut 43.72  Strafe 0.0

Sonnensynchron (97.5 Grad) - erreichbar?
  Breite 28.5619 -> Azimut -8.55
  Breite 28.6083 -> Azimut -8.55
  Breite 34.6330 -> Azimut -9.13
  Breite 25.9970 -> Azimut -8.35

Der Azimut von 45.01 Grad für SLC-40 auf die ISS-Bahn deckt sich mit dem, was Falcon 9 dort tatsächlich fliegt (rund 44…45 Grad) — eine brauchbare Probe für die Formel.

Der zweite Block zeigt die Grenze aus dem Kasten oben: eine sonnensynchrone Bahn ist von jedem dieser Plätze erreichbar (kein NaN, denn 97.5° liegt über jeder der Breiten), aber der gemeldete Azimut ist der nördliche Ast. Als Startrichtung gilt der südliche: rund 189 Grad.


Letzte Aktualisierung: 2026-09-05 (#1909, nachgemessen mit lyxc 1.2.2B) — Kasten gezogen: ALaunchAzimuth liefert den Nordast als Kompassrichtung, ALaunchAzimuthSouth den Südast; der negative Rohwert ist Geschichte.

Vorherige letzte Aktualisierung: 2026-08-31 — Startplatz-Tabelle um die drei SpaceX-Rampen (SLC-40, LC-39A, SLC-4E) und Starbase erweitert, Werte aus einem eigenen Programm gerechnet (Abschnitt 9); dabei gefunden und als Kasten vermerkt: ALaunchAzimuth liefert nur den nördlichen Ast (#1909). Zuvor: Parametertabelle und zweistufige Auslegung ergänzt. Alle Beispiele mit lyxc 1.1.15B gebaut und ausgeführt.

Zuvor 2026-08-31 — Seite neu angelegt aus std/astro/launch.lyx (PR #1890).