Bernd Leitenbergers Blog

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.

Die mobile Version verlassen