Programmieraufgabe 1

So da ja Computer- und Programmiersprachenrätsel so beliebt sind, mal eine praktische Aufgabe. Es geht um die Falcon 9 v.1. oder Falcon 9R (offenbar ist in SpaceX alles so chaotisch, dass man nicht mal den Namen der Rakete genau kennt. Generauer gesagt geht es um die Zuverlässigkeit aufgrund eines Triebwerksausfalls

Die Falcon 9 hat in der ersten Stufe eine Engine-Out Capability. fällt ein Triebwerk aus, so kann sie ihre Mission fortsetzen. Der Ausfall bei Flug 4 zeigt die wahrscheinliche Strategie: es wird das gegenüberliegende abgeschaltet, anders sind die veränderten Brennzeiten nicht zu erklären. Damit ist ein Ausfall direkt nach dem Start verhängnisvoll, während zum Brennschluss auch zwei Triebwerke ausfallen dürfen. Für die folgende Aufgabe wollen wir vereinfacht annehmen, dass ein Triebwerksausfall in der ersten Stufe keine Mission zum Scheitern bringt, egal wann er erfolgt, mehr als einer dagegen schon.

Bei der zweiten Stufe ist natürlich ein Ausfall verhängnisvoll. Hier gibt es keine Absicherung.

Was gibt es an Erfahrungswerten? Es gab bisher fünf Starts der Falcon 9. Bei zweien fielen Triebwerke aus. Von jedermann bemerkt und dann auch nach einigen Stunden zugegeben beim vierten Flug und einem bis zur Anhörung am Aerospace Safety Advisory Panel verheimlichten Abschalten beim zweiten Start. Bei zehn Triebwerken pro Rakete (neun in der ersten, einer in der zweiten) ist das ein Ausfallrisiko von 2 zu 50.

Die Wahrscheinlichkeit eines Fehlstarts sollte nun durch Simulation in einem Programm bestimmt werden. (Es ist exakt berechenbar, aber dann wäre es ja keine Aufgabe). Dazu eignet sich eine Monte-Carlo Simulation also die Simulation von n Starts (n: große Zahl >100) und bestimmen derer mit zwei oder mehr Triebwerksausfällen in der ersten odereinem in der zweiten Stufe. wer will kann das auch parametrierbar machen, sodass es sich für die Falcon Heavy oder beliebige Träger eignet

Bitte das Ergebnis und das Programm posten, vielleicht bekommen wir auch eine kleine Sammlung in verschiedenen Programmiersprachen zusammen. Da das einige Zeit braucht ist dieser Eintrag mal für eine Woche oben angeheftet.

14 thoughts on “Programmieraufgabe 1

  1. Moin Bernd,

    ich hoffe mal, dass viele verschiedene Lösungen in verschiedenen Sprachen geposted werden.

    Ich habe mich für Lua entschieden. Lua ist eine Sprache die von den Jesuiten an der Pontifícia Universidade Católica do Rio de Janeiro zur Lehre entwickelt wurde. Ziel ist eine leichtgewichtige Sprache, die gut lesbar, und einfach zu lernen, und die sich als Eingebundene Sprache eignet. Lua ist sehr klein, sehr schnell, hat einen einfachen aber guten Garbage Collector, und verbraucht so wenig Speicher, dass selbst auf Atari oder Amiga Systemen damit Spiele möglich sind. Daher ist Lua auch die wichtigste Script-Sprache für Computer Spiele.

    Mein Code ist bestimmt nicht der kürzeste, aber wohl dafür gut lesbar.

    http://kephra.de/src/Falcon9.lua.txt

    Als Ergebnis komme ich auf auf eine Zuverlässigkeit von 66.43% und einer kritischen Ausfallrate von 8.71%. Das Programm braucht 80 Millisekunden für 100-Tausend Simulationen auf einem AMD FX-4100@3600MHz.

    ciao,Michael

  2. Hallo Michael.

    Mein Code ist deutlich länger aber besser kommentiert und auch parametrierbar.
    Du hast aber eine kleine Kleinigkeit übersehen, wodurch das Programm etwas negativer ist als nötig. Schau Dir noch mal die Aufgabenstellung an.

  3. Moin Bernd,

    ich gehöre zur Fraktion die meint, dass Kommentare innerhalb des Codes die Lesbarkeit vermindern. Entweder Code ist lesbar, oder nicht. Dokumentation sollte beschreiben wie der Code zu benutzen ist, und nicht wie jede einzelne Zeile funktioniert. Wenn letzteres nötig ist, so ist das ein Zeichen dass der Code stinkt.

    Als Zuverlässig hab ich definiert, dass alle Triebwerke funktionieren, ein Ausfall ist definiert dass 2 oder mehr Triebwerke der ersten Stufe ausfallen, oder das Triebwerk der dritten Stufe.

    d.h. in mehr als einem drittel der Fälle hängt es davon ab, wann das Triebwerk der Erststufe ausfällt und wie viel Nutzlast wirklich in welchen Orbit muss.

    ciao,Michael

  4. Moin Bernd,

    die Wahrscheinlichkeit dass alle 10 Triebwerke funktionieren ist:

    (24/25)^10 = 66.48%

    die Wahrscheinlichkeit dass maximal ein Triebwerk in der ersten Stufe streikt, und das in der zweiten Funktioniert ist:

    ((24/25)^9 + 9/25 * (24/25)^8) * 24/25 = 91.41%
    ~ Ausfallwahrscheinlichkeit 8.59%

    Bei 10 Millionen Tests, komme ich auf:
    10000000 6648694 857846

    So falsch kann ich also nicht liegen. Wenn ich die Falcon9 richtig verstanden habe.

    ciao,Michael

  5. Moin Bernd,

    > Was ist den mit dem Fall gleich/mehr als zwei Triebwerke in der
    > ersten Stufe fallen aus. Was macht dein Programm da bei der
    > zweiten Stufe?

    die zweite Stufe ist egal, auch wenn sie vorher berechnet wurde, wenn mehr als zwei Triebwerke der ersten ausfallen:

    if stage1 < 8 or stage2 == 0 then
    failure = failure + 1
    end

    Wenn weniger als 8 Triebwerke der ersten Stufe funktionieren, oder die zweite ausfällt ist es ein kritischer Fehler.

    ciao,Michael

  6. @Michael K. Wenn man eine Simulation macht, dann macht es keinen Sinn die zweite Stufe zu simulieren, auch wenn das Ergebnis aufgrund der Formulierung stimmt.
    @Elendsoft: Das zwei Triebwerke gleichzeitig ausfallen die gegenüberliegend sind ist aber sehr unwahrscheinlich. Wir haben ja eine Computersteuerung die bei Ariane alle 40 ms den Status prüft und dann abschalten würde. Das bedeutet dass die Triebwerke beide innerhalb von 40 ms ausfallen müssten. Das ist bei einer Gesamtbetriebszeit von 180 s und einer Chance von 4% für einen Ausfall während dieser Zeit aber dann schon recht unwahrscheinlich (etwa 1/112500). Die 40 ms von Ariane beruhen übrigens auf einem sehr alten Bordcomputern, die Falcon 9 dürfte mit moderner Hardware eher noch öfter den Zustand prüfen,

  7. Moin Bernd,

    > Wenn man eine Simulation macht, dann macht es
    > keinen Sinn die zweite Stufe zu simulieren, auch
    > wenn das Ergebnis aufgrund der Formulierung stimmt.

    Doch macht es, zumindest wenn ich einen einfachen ALGOL ähnlichen Ablauf habe, weil wenn ich diese Stufe nicht vor den beiden von stage2 abhängigen Abfragen berechne, sondern in diesen Abfragen jeweils erneut ein math.random() aufrufe, so wäre der Code falsch, oder es würde eine stinkende if-cascade geben.

    Ein (saubere) Alternative wäre die if-Caskade in eine eigene Funktion heraus zu faktorisieren, und Smalltalk ähnlich return-as-a-break zu nutzen. Damit könnte ich in dem Fall dass das zweite Triebwerk der ersten Stufe versagt, alle weiteren math.random() sparen.

    Vertrau mir einfach: Ich bin seit 35 Jahren Programmierer, während Du ein Chemiker bist, der ein bisschen Pascal kann. Ich stell mir gerade als Horror vor Dich als Lehrer für Informatik zu haben, und die gleiche Diskussion nach einer Klausur zu führen.

    ciao,Michael

    PS: Traut sich niemand anders eine Lösung in einer anderen Programmiersprache zu?

  8. Ich habs etwas verkürzt geschrieben. Du simulierst auch die zweite Stufe, selbst wenn die Rakete schon aufgeschlagen ist weil die Triebwerke der ersten Stufe ausgefallen sind. Im Ergebnis gebe ich dir recht, aber sauber ist es nicht.

    Alle Triebwerke der ersten Stufe abzufragen macht insofern sinn, als dass man als weitere Information gewinnen kann, wie wahrscheinlich der Ausfall von 3,4 … Triebwerken ist, wobei man dann schon weiter gehen müsste und auch den Zeitpunkt mit einbeziehen, schließlich reicht schon ein ausgefallenes Triebwerk nach dem Start für eine Katastrophe und zum Ende hin werden ja zwei abgeschaltet um die Beschleunigung zu begrenzen.

  9. Moin Bernd,

    > Ich habs etwas verkürzt geschrieben. Du simulierst
    > auch die zweite Stufe, selbst wenn die Rakete schon
    > aufgeschlagen ist weil die Triebwerke der ersten
    > Stufe ausgefallen sind. Im Ergebnis gebe ich dir
    > recht, aber sauber ist es nicht.

    sauberer wäre es die zweite Stufe als erstes zu simulieren, weil wenn diese fehlschlägt, kann man sich die ganze Schleife für die 9 Triebwerke der ersten Stufe sparen.

    ciao,Michael

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.