Das Mehrkörperproblem in der Astronomie/ Zusammenfassung wichtiger C-Prozeduren/ Vektoroperationen

Aus Wikibooks

Die meisten dem Mitglied eines Mehrkörpersystems zugeordneten Größen stellen Vektoren dar, wie Ort, Geschwindigkeit und Beschleunigung. Dementsprechend erfordern praktisch alle damit zusammenhängenden Prozeduren die wiederholte Ausführung von Vektoroperationen, die seinerseits wiederum als Prozeduren definiert werden. Komplexere Operationen, die solche eigenständige Prozeduren erfordern, sind insbesondere der Betrag und Einheitsvektor eines Vektors, sowie das Skalarprodukt und Kreuzprodukt zweier Vektoren. Die Addition und Subtraktion zweier Vektoren kann hingegen durch eine gewöhnliche Addition bzw. Subtraktion ersetzt werden, welche mittels einer drei Mal durchlaufenen For-Schleife alle kartesischen Komponenten individuell erfasst.

Fast alle hier benutzten Variablen sind vom Datentyp Double. Für For-Schleifen verwendete Zähler stellen Unsigned Integer dar. Vektoren sind stets Arrays, welche drei Double enthalten.

Prozedur betrag (Betrag eines Vektors)[Bearbeiten]

Diese Routine bestimmt den Betrag eines Vektors vektor und gibt diesen unmittelbar zurück.

double betrag (double *vektor)
{
  return (sqrt (pow (vektor[0],2) + pow (vektor[1],2) + pow (vektor[2],2)));
}

Prozedur einheit (Einheitsvektor eines Vektors)[Bearbeiten]

Diese Prozedur bildet für einen Vektor vektor den dazugehörigen Einheitsvektor. Dieser wird durch den Vektor einheitsvektor angegeben. Die Routine benutzt die Betragsoperation, baut also auf obiger Prozedur auf. Für den Sonderfall, dass der Eingabevektor gleich dem Nullvektor ist, wird als Einheitsvektor wiederum der Nullvektor zurückgegeben.

void einheit (double *vektor, double *einheitsvektor)
{
  double laenge;
  unsigned int k;

  laenge = betrag (vektor);
  for (k = 0;k < 3;k ++)
  {
    if (laenge > 0)
    einheitsvektor[k] = vektor[k] / laenge;
    else
    einheitsvektor[k] = 0;
  }
}

Prozedur skalarprodukt (Skalarprodukt zweier Vektoren)[Bearbeiten]

Diese Routine berechnet das Skalarprodukt zweier Vektoren vektor1 und vektor2. Das Ergebnis wird von der Prozedur selbst direkt zurückgegeben.

double skalarprodukt (double *vektor1, double *vektor2)
{
  return (vektor1[0] * vektor2[0] + vektor1[1] * vektor2[1] + vektor1[2] * vektor2[2]);
}

Prozedur kreuzprodukt (Kreuzprodukt zweier Vektoren)[Bearbeiten]

Diese Prozedur ermittelt das Kreuzprodukt zweier Vektoren vektor1 und vektor2. Das Ergebnis wird durch den Vektor vektor3 dargestellt.

void kreuzprodukt (double *vektor1, double *vektor2, double *vektor3)
{
  vektor3[0] = vektor1[1] * vektor2[2] - vektor1[2] * vektor2[1];
  vektor3[1] = vektor1[2] * vektor2[0] - vektor1[0] * vektor2[2];
  vektor3[2] = vektor1[0] * vektor2[1] - vektor1[1] * vektor2[0];
}