Auflösung Programmierrätsel 1

Hier mein Programm zur Lösung der Aufgabe. Es ist in Pascal und ein Konsolenprogramm, erstellt mit Lazarus, dürfte aber mit älteren Turbo Pascal Compilern, Delphi oder Free Pascal compilierbar sein. Dann muss man die Compilerswitches anpassen. Ich habe ja auf mehr Lösungen als nur eine gehofft, aber Berieseln ist eben praktischer. Ich sollte nach den Schlussfolgerungen dieses Blogs vielleicht für Nur-Leser den Blog kostenpflichtig machen….

Wie schon in der Aufgabe angekündigt ist es parametrierbar. So kann man auch feststellen wie dies bei einer Falcon Heavy (Eingabe 27  3 1 0 0.96) aussieht.

Ich komme auf 91,40% Zuverlässigkeit bei 1 Million simulierter Starts bei der Falcon 9 und 93,9% bei der Falcon Heavy

Noch was außer der Reihe. Wie „gerüchteweise“ berichtet (es gibt nichts offizielles sondern nur Posts in Foren) brauchte die Falcon 9 V1.1 fünf Anläufe um einmal vollständig durchzulaufen. Angesichts dessen verwundert es nicht, dass man da nichts offizielles verlautbart. Viermal klappte es also nicht. Bei den Tests wird abgeschaltet wenn ein Triebwerk ein Problem hat.

Wenn man die Zuverlässigkeit eines Triebwerks mit „x“ annimmt, dann gibt es die Wahrscheinlichkeit 1-x dass es ausfällt. Für 9 Triebwerke sind es dann z=9*(1-x).

Das dies bei 4 Versuchen passiert entspricht wie beim Würfelspiel y=z4. (jeder Versuch ist unabhängig).

Wenn man annimmt, dies soll mit einer Wahrscheinlichkeit von 1% (y=0.01) passieren, so wäre z =0.316. Da z = 9*(1-x) ist wäre 0.035 = 1-x oder x= 0.9648 was sehr nahe an dem obigen Wert von 0,96 für das Merlin 1D ist. (0,96 entsprechen einer Wahrscheinlichkeit von 1,67%). Wenn man eine 10% Chance annimmt (y=0.1, dann wäre x=0.9375). Also entweder haben sie viel Pech gehabt oder die Zuverlässigkeit der Falcon 9 „v1.1“ ist noch schlechter als die der ersten Version.

Das zeigt dass man bei SpaceX etwas falsch verstanden ist. Die Idee der „engine-Out capability“ ist ja das man einen Triebwerksausfall abfangen kann, wenn er vorkommt. Dieser ist bei n Triebwerken n-mal wahrscheinlicher. Daraus ergibt sich aber auch dass jedes Triebwerk relativ zuverlässig sein muss, denn sonst sind zwei Ausfälle relativ häufig. Es ist kein Mittel um dann viele Triebwerke mit schlechter Zuverlässigkeit einzusetzen, weil dann die Ausfallswahrscheinlichkeit für 2 Triebwerke zu hoch ist – und es gibt natürlich noch das Risiko in der Oberstufe.

program zuverlaessigkeitraketen;

{$mode objfpc}{$H+}

var
  enginesfirst, enginessecond: integer;
  // Triebwerke in der ersten Stufe und Anzahl die ausfallen duerfen
  failuresfirst, failuressecond: integer;
  // Triebwerke in der zweiten Stufe und Anzahl die ausfallen duerfen
  failrate: double;  // Ausfallrate (0..1)
  Anzahl: integer;   // anzahl simulierter Starts
  failures: integer; // Anzahl an Fehlstarts
  failedenginesone, failedenginestwo: integer; // Triebwerksausfaelle
  nofailures: integer;  // Starts bei denen kein Triebwerk ausfällt
  i, j: integer; // Laufvariablen

begin
  Write('Anzahl der Triebwerke in der ersten Stufe: ');
  readln(enginesfirst);
  Write('Anzahl der Triebwerke in der ersten Stufe die ausfallen duerfen: ');
  readln(failuresfirst);
  Write('Anzahl der Triebwerke in der zweiten Stufe: ');
  readln(enginessecond);
  Write('Anzahl der Triebwerke in der zweiten Stufe die ausfallen duerfen: ');
  readln(failuressecond);
  Write('Zuverlaessigkeit (0..1 1= kein Ausfall): ');
  readln(failrate);
  if Failrate > 1then
    failrate := failrate / 100; // Falls jemand Prozente eingibt
  Write('Anzahl simulierter Starts: ');
  readln(anzahl);
  Randomize;
  // Zufallszahlengenerator auf Datum/Uhrzeit initalisieren
  failures := 0;                  // Erst mal keine Fehlstarts annehmen
  nofailures := 0;                  // anzahl der Starts ohne Probleme
for i := 1to anzahl do
begin
// erste Stufe
    failedenginesone := 0;           // vorgabe: kein Triebwerksausfall
for j := 1to enginesfirst do
begin
if random >= failrate then
// Triebwerk ausgefallen, radnom liefert eine Zufallszahl zwischen 0 und 1
        Inc(failedenginesone);
    end;                          // Ende Schleife j 1..enginesfirst
if failedenginesone > failuresfirst then// Test ob grösser als Grenzwert
begin
      Inc(failures);              // Dann fehlstart
      continue;
      // aktuelle Schleife abbrechen, da oberstufe nun gar nicht erst zuendet
end;
    // zweite Stufe
    failedenginestwo := 0;           // vorgabe: kein Triebwerksausfall
for j := 1to enginessecond do
begin
if random >= failrate then// Triebwerk ausgefallen
        Inc(failedenginestwo);
    end;                          // Ende Schleife j 1..enginessecond
if failedenginestwo > failuressecond then// Test ob grösser als Grenzwert
begin
      Inc(failures);
    end;
    if (failedenginestwo = 0) and (failedenginesone = 0) then
      Inc(nofailures);
  end;                            // Ende Schelife i: 1..Anzahl
  Writeln('Es gab ', failures, ' Fehlstarts bei ', anzahl, ' Starts.');
  Writeln('Es gab ', nofailures, ' Starts ohne Triebwerksfehler bei ',
    anzahl, ' Starts.');
  Writeln('Die Zuverlaessigkeit betraegt: ', 100 * (anzahl - Failures) /
    anzahl: 2: 2, '%.');
  readln;                         // Warten auf Tastendurck, da Konsolenprogramm
end.

6 thoughts on “Auflösung Programmierrätsel 1

  1. Also von mir wäre da auch noch was gekommen, das dann in C geschrieben wäre. Nur hab ich es nicht so mit der Wahrscheinlichkeitsrechnung und war deshalb erst mal dabei, mir etwas mehr über Monte Carlo Methoden anzulesen…
    Ach ja, und dann hat mich das Planetariumsprogramm Stellarium derzeit im Bann geschlagen. Bei mir tritt da nämlich ein Fehler auf: Immer wenn ich den Saturn heran zoomen will, stürzt das Programm ab. Hab mich damit auch schon an die Entwickler gewand, und denen Crashdumps zur Verfügung gestellt. Um der Sache selber auch mal auf dem Grund gehen zu können, würde ich die auch gerne selber etwas näher untersuchen, aber bisher fehlt mir das richtige Werkzeug dazu. Bin da noch auf der Suche, aber leider scheint es bei MS so tief in der MSDN vergraben zu sein, das ich es nicht finde…

  2. Wahrscheinlich bist Du mit einem Ringpartikel kollidiert…. Nach der Website ist die Versionsnummer bei 0.12, vielleicht braucht man noch etwas Zeit. Wenn ich den Saturn sehen will, setze ich übrigens Celestia ein.

  3. *gg* Also das mit dem Ringpartikel glaube ich weniger! Die Ringe sind nämlich noch gar nicht zu sehen, wenn das Programm abstürzt. Und an der Versionsnummer sollte man sich auch nicht stören. Obwohl die erst bei 0.12 ist, ist das Programm schon genial. Und Celestia ist da auch drin. Zumindest haben die einigen Code aus Celestia übernommen, wofür sich der Hauptauthor ausdrücklich bedankt. Ach ja, und der Crash passiert ab der Version 0.12.1; habe inzwischen 0.12.2 RC1 in Betrieb, wo der Fehler immer noch enthalten ist. Die haben dem nämlich „nur“ eine mittlere Priorität zugeordnet, so das er wohl erst in Version 0.13 oder höher behoben werden wird. Und wann die Version 1.0 kommt, weis wohl nur der Herr Chéreau, der das Projekt angefangen hat…

  4. Was mir an Celestia so gefällt ist dass man bei den Himmelskörpern die Oberflächen als „Maps“ per JPG definieren kann. Neben denen von Dritten bereitgestellten kann man auch die offiziellen vom Cassini SSI Team nehmen und sieht dann den Mond so wie er derzeit aufgrund der Aufnahmen bekannt ist.

  5. Okay, einverstanden. Da zeigen sich dann wieder die unterschiedlichen Schwerpunkte der Programme. Stellarium zeigt einen Planet ja so, wie man ihn sehr wahrscheinlich durchs Teleskop sehen würde.

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.