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 |
ADvStageLimitist 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:
- SLC-40 und LC-39A liegen 5 km auseinander — 28.56° gegen 28.61° Breite. Der Unterschied ist für die Bahnmechanik bedeutungslos (0.2 m/s Drehgewinn, 0.02° Azimut); die beiden Rampen unterscheiden sich durch Infrastruktur, nicht durch Physik. LC-39A ist die Rampe für Falcon Heavy und bemannte Starts, SLC-40 die für den Standardbetrieb.
- SLC-4E ist die Westküsten-Rampe und mit 34.63° die nördlichste. Für die ISS-Bahn wäre sie um 827 m/s teurer als Florida — dafür ist sie für rückläufige und sonnensynchrone Bahnen der richtige Ort: über den Pazifik nach Süden liegt kein bewohntes Gebiet im Korridor.
- Starbase liegt am weitesten südlich (26.0°) und hat mit 418 m/s den größten Drehgewinn der vier — ein Vorteil von rund 10 m/s gegenüber Florida.
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 Gleichungcos(i) = cos(breite)·sin(azimut)hat für jede erreichbare Inklination zwei Lösungen: den nördlichen Ast und den südlichen180° − β. Beide führen in dieselbe Bahnneigung; die Wahl entscheiden Überflugkorridore und Bergungsschiffe.
ALaunchAzimuthliefert den nördlichen Ast,ALaunchAzimuthSouthden südlichen — und beide als Kompassrichtung in [0°, 360°). Frühere Fassungen gaben den rohenasin-Wert zurück: eine sonnensynchrone Bahn ab Vandenberg ergab−9.13Grad. Heute kommt dort351.6Grad 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), stehtgLocalals eigenes Argument. Ein Marsstart rechnet also mitIsp·9.80665für die Ausströmgeschwindigkeit und mit3.71für das Abheben.
Isp steht in Sekunden, nicht in m/s — die Ausströmgeschwindigkeit liefertAExhaustSpeed. 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:
- Mit Kerosin (Isp 320) und heutigem Leichtbau (σ = 0.08) sind 7926 m/s möglich — und das ohne jede Nutzlast. Einstufig unmöglich.
- Mit Wasserstoff (Isp 450) werden es 11 146 m/s — rechnerisch machbar, aber die Nutzlast frisst den Abstand sofort auf.
- Erst σ = 0.05 bei Isp 450 gibt Luft (13 220 m/s). Genau hier lagen die Einstufen-Entwürfe, und genau daran sind sie gescheitert: 5 % Strukturanteil bei einem Wasserstofftank ist sehr wenig.
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).
