Das Mehrkörperproblem in der Astronomie/ Grundlagen/ Vektoren und Skalare

Aus Wikibooks

Bei vielen der in einem Sternsystem interessierenden Größen, z.B. den Geschwindigkeiten der einzelnen Mitglieder, kommt es nicht nur auf den Betrag an, sondern auch auf die Richtung, in welche die Massenpunkte sich bewegen - wie bei einer Autofahrt, wo man sich nicht nur Gedanken darüber macht, wie viele Kilometer man pro Stunde zurücklegen will, sondern auch darüber, welchen Weg man einschlagen muss, um an das Ziel zu gelangen. Solche Größen werden als Vektoren bezeichnet. Dagegen kann man einer Größe wie der Masse keine Richtung zuordnen. Eine solche Größe nennt man Skalar.

Vektoren werden in der Regel durch einen Pfeil über dem Größensymbol gekennzeichnet. Diskutiert man z.B. die Geschwindigkeit einschließlich ihrer Richtung, so schreibt man .

Komponentendarstellung und Betrag eines Vektors[Bearbeiten]

Die Tatsache, dass Vektoren eine Richtungsangabe beinhalten, führt zwangsläufig dazu, dass solche aus mehreren Komponenten bestehen. Will man z.B. von Nürnberg nach Frankfurt gelangen, muss man sich in nordwestliche Richtung bewegen. Die Angabe "Nordwesten" aber schließt bereits zwei Komponenten ein, nämlich "Westen" und "Norden". Man könnte diese durch kartesische Koordinaten wiedergeben, in dem man z.B. die West-Ost-Richtung als x-Achse und die Süd-Nord-Richtung als y-Achse darstellt. Der von Nürnberg nach Frankfurt zielende Vektor hätte dann eine in negative x-Richtung zeigende Komponente und eine etwa gleich große in positive y-Richtung weisende.

Im Alltag kommt man meist mit zwei Richtungskomponenten aus. In einem Sternsystem dagegen mit voller räumlicher Bewegung der einzelnen Massenpunkte sind drei Komponenten erforderlich, zu der x- und y-Achse tritt die z-Achse als weitere kartesische Komponente hinzu. Will man die einzelnen Komponenten eines Vektors auflisten, so verwendet man oft folgende Schreibweise:

, und sind dabei die Geschwindigkeiten in Richtung der drei kartesischen Achsen.

Nicht nur die Geschwindigkeit, auch der Ort eines Körpers ist ein Vektor, denn für eine Ortsangabe werden gleichfalls mehrere Komponenten benötigt. Auf der Erde genügen dazu der Längen- und Breitengrad. In einem Sternsystem müssen abermals drei Komponenten angegeben werden, wobei man als Bezugspunkt zumeist den Schwerpunkt wählt (dieser ist, wie im letzten Abschnitt dieses Unterkapitels dargelegt wird, der auf die Verteilung der einzelnen Massen bezogene Mittelpunkt des Systems). Man schreibt dann z.B.

Der Ortsvektor bezeichnet demgemäß die Richtung, in welcher man vom Ursprung aus zu dem gewünschten Objekt schauen muss.

Den Betrag eines Vektors kann man aus seinen Komponenten mittels des Satzes des Pythagoras berechnen. Um kenntlich zu machen, dass man den Betrag meint ohne Richtungsangaben, lässt man entweder den Pfeil über dem Größensymbol weg (schreibt also z.B. einfach ) oder umgibt die als Vektor markierte Größe mit Betragsstrichen (z.B. ). Auf den Geschwindigkeitsvektor angewandt liefert der Satz des Pythagoras den Absolutwert der Gesamtgeschwindigkeit:

Im Falle des Ortsvektors gewinnt man den Abstand eines Massenpunktes vom Schwerpunkt des Systems.

Vektoren stellt man sich anschaulich oft als Pfeile vor. Die Komponenten geben die Richtung an, nach welcher der Pfeil orientiert ist, der Betrag dessen Länge.

Im Verlauf einer Mehrkörpersimulation müssen Betragsberechnungen sehr häufig durchgeführt werden, so dass es angebracht ist, dafür eine eigene Prozedur zu definieren. Übergeben wird dieser der vektor, dessen Betrag zu bestimmen ist. vektor ist ein Array, das drei Double stellvertretend für die drei kartesischen Komponenten enthält. Der Rückgabewert ist ebenfalls vom Typ Double.


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


Die wichtigste Anwendung dieser Prozedur besteht in der Berechnung des Abstands zweier Körper. Zunächst bestimmt man dafür den Differenzvektor der Ortsvektoren der beiden Objekte und anschließend dessen Betrag.

Nicht nur für obige, sondern auch für alle nachfolgend in diesem Buch besprochenen Prozeduren werden für reelle Zahlen (Gleitkommazahlen) Variablen des Datentyps Double verwendet. Zwar werden mit diesem Datentyp für jede Gleitkommazahl 8 Byte Speicherplatz benötigt, doch werden mit einer Genauigkeit von 15-16 Dezimalstellen Rundungsfehler minimiert, was wegen der bei einer Mehrkörpersimulation auftretenden großen Zahl von Rechenoperationen von großer Wichtigkeit ist. Mit dem Datentyp Float kommt man mit 4 Byte pro reelle Zahl aus, doch kann mit nur 7-8 vorgehaltenen Dezimalstellen keine ausreichende Rechengenauigkeit gewährleistet werden.

Addition und Subtraktion von Vektoren[Bearbeiten]

Auf Vektoren können die Grundrechenarten Addition und Subtraktion gleichermaßen angewandt werden wie auf Skalare. Dies geschieht, indem man die einzelnen Komponenten addiert bzw. voneinander subtrahiert. Betrachtet man zwei Vektoren und , so gilt für die Vektorsumme :

Amalog gilt für die Vektordifferenz :

Graphisch kann man die Vektoraddition durchführen, in dem man an die Spitze des Vektors den Fuß von setzt. Der Summenvektor erstreckt sich dann von dem Fuß von bis zur Spitze von .


Addition zweier Vektoren +


Im Falle der Subtraktion wird ebenfalls der Fuß von an die Spitze von gesetzt, dabei aber zugleich in seine Gegenrichtung umgeklappt. Der Differenzvektor weist wiederum vom Fuß von zur Spitze des umgeklappten Vektors .


Subtraktion zweier Vektoren -


Bei der Simulation eines Sternsystems wird die Vektoraddition vor allem zur Berechnung der auf ein Mitglied wirkenden Gesamtkraft benötigt. Jeder andere Massenpunkt übt auf einen beliebig herausgegriffenen Körper eine gewisse Anziehungskraft aus. Um die gesamte Gravitation zu kennen, müssen alle diese einzelnen Kraftvektoren aufsummiert werden.

Um die Anziehung zwischen zwei Massenpunkten zu bestimmen, muss deren Abstand bekannt sein. Dazu wiederum müssen wie schon angedeutet deren Ortsvektoren voneinander subtrahiert werden, woraus der sogenannte Abstandsvektor resultiert.

Multiplikation eines Vektors mit einem Skalar und Einheitsvektor[Bearbeiten]

Wie Skalare können auch Vektoren mit weiteren Skalaren multipliziert werden. Um einen Vektor mit einem Skalar zu multiplizieren, bildet man für jede seiner Komponenten das Produkt mit :

Multipliziert man einen Vektor mit einem Skalar > 1, so wird dieser einfach in der ursprünglichen Richtung gestreckt. Liegt der Skalar zwischen 0 und 1, resultiert eine Stauchung wiederum in ursprünglicher Richtung. Bei Multiplikation mit einem negativen Skalar wird der Vektor nicht nur gestreckt (falls < -1) oder gestaucht (für zwischen -1 und 0), sondern zugleich in seine Gegenrichtung umgeklappt.

Die Division mit einem Skalar ist gleichbedeutend mit der Multiplikation mit . Wird ein Vektor durch Multiplikation mit einem Skalar > 1 gestreckt, so wird er durch Division mit demselben gestaucht (die Division wirkt dann wie eine Multiplikation mit einem Skalar < 1).


Multiplikation eines Vektors mit einem Skalar


Eine besondere, aber in der Praxis oft benötige Rechenoperation ist die Division eines Vektors mit seinem eigenen Betrag. Der dadurch gewonnene Vektor hat exakt die Länge 1 und wird als Einheitsvektor bezeichnet; er zeigt in die gleiche Richtung wie der Ausgangsvektor:

Der Einheitsvektor stellt eine reine Richtungsangabe dar. So bezeichnet beispielsweise der Einheitsvektor der Geschwindigkeit die Richtung, in welche sich ein Objekt gerade bewegt. Der Einheitsvektor des Abstandsvektors gibt die Verbindungslinie zweier Massenpunkte an.

Der einheitsvektor eines vektor lässt sich mit folgender Prozedur gewinnen. Zunächst liefert die Betragsprozedur in Form der Double laenge den Betrag von vektor. Danach wird jede Komponente von vektor mit laenge dividiert. einheitsvektor ist wie vektor ein Array mit 3 Double.

Der Nullvektor, dessen Komponenten und somit auch dessen Betrag gleich 0 sind, ist nicht normierbar. Um diesen Sonderfall programmiertechnisch abfangen zu können, gibt die Prozedur für den Nullvektor wiederum den Nullvektor zurück.

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;
  }
}


Skalarprodukt und Kreuzprodukt[Bearbeiten]

Das "Produkt" zweier Vektoren hat im Gegensatz zur Multiplikation eines Vektors mit einem Skalar mit einer gewöhnlichen Multiplikation nur wenig zu tun. Es existieren zwei verschiedene Formen, das Skalarprodukt und das Kreuzprodukt.

Das Skalarprodukt zweier Vektoren und wird so genannt, weil es nicht wie die bisher skizzierten Rechenoperationen wieder einen Vektor, sondern einen Skalar liefert. Es wird in der Regel durch den gewöhnlichen Multiplikationspunkt zwischen den beiden betrachteten Vektoren kenntlich gemacht, man schreibt also . Gegeben ist es durch die Beträge von und sowie den Cosinus des von den beiden Vektoren eingeschlossenen Winkels :

Graphisch lässt sich das Skalarprodukt folgendermaßen darstellen. Man projiziert den Vektor senkrecht auf und erhält so den Vektor . Das Skalarprodukt folgt dann durch Multiplikation der Beträge von und . Ist der Winkel spitz, zeigt in die gleiche Richtung wie und das Skalarprodukt ist positiv. Stehen die beiden zu "multiplizierenden" Vektoren senkrecht aufeinander, so verschwindet die Projektion von , d.h. das Skalarprodukt ist gleich 0. Im Falle eines stumpfen Zwischenwinkels zeigt der Projektionsvektor in die Gegenrichtung von , wodurch das Skalarprodukt negativ wird.


Projektion eines Vektors auf einen Vektor zur Berechnung des Skalarprodukts


Schließlich sei auch die kartesische Darstellung des Skalarprodukts gegeben. Man multipliziert jeweils die Komponenten der beiden Vektoren miteinander und summiert die einzelnen Produkte auf.

Das skalarprodukt zweier Vektoren vektor1 und vektor2 lässt sich durch folgende Prozedur berechnen. Beide sind Arrays mit je 3 Double, der Rückgabewert ebenfalls vom Typ Double.


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


Das Skalarprodukt taucht in mehreren in diesem Buch verwendeten Formeln auf, wobei jedoch keine herausragende Anwendung genannt werden kann. In der Geometrie wird das Skalarprodukt z.B. verwendet, um nachzuprüfen, ob zwei Geraden aufeinander senkrecht stehen. Dies ist dann der Fall, wenn das Skalarprodukt ihrer Richtungsvektoren gleich 0 ist.

Das Kreuzprodukt erinnert noch weniger an die gewöhnliche Multiplikation als das Skalarprodukt. Es liefert wieder einen Vektor und wird durch ein "x" zwischen den zu kombinierenden Vektoren gekennzeichnet (z.B. ). Der resultierende Vektor steht senkrecht auf den beiden Ausgangsvektoren, sein Betrag entspricht der Fläche des von diesen aufgespannten Parallelogramms:


Kreuzprodukt zweier Vektoren x


Die kartesische Darstellung des Kreuzprodukts ist relativ kompliziert:

Im Gegensazu zu Vektoraddition und Skalarprodukt folgt das Kreuzprodukt dem Kommutativgesetz nicht, es gilt:

Auch für das Kreuzprodukt sei eine Prozedur gegeben. Übergeben werden dieser die zu untersuchenden Vektoren vektor1 und vektor2, zurückgegeben wird das Ergebnis vektor3. Sämtliche Vektoren sind Arrays mit je 3 Double.


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];
}


Eine klassische Anwendung des Kreuzprodukts in der Astronomie ist die Bestimmung des Bahndrehimpulses der Planetenbewegung, welcher durch das Kreuzprodukt des Orts- und Geschwindigkeitsvektors des Planeten, multipliziert mit dessen Masse, gegeben ist. Der Bahndrehimpuls verändert sich während des Umlaufs um die Sonne nicht, woraus das Zweite Keplersche Gesetz folgt, wonach der Ortsvektor (als Verbindungslinie zwischen Sonne und Planet) in gleichen Zeiten gleiche Flächen überstreicht. Dieses Gesetz wird oft auch als Flächensatz bezeichnet.


Zweites Keplersche Gesetz


Schwerpunkt eines Systems von Massenpunkten[Bearbeiten]

Für die Simulation eines Mehrkörpersystems wählt man wie bereits erwähnt als Koordinatenursprung zumeist dessen Schwerpunkt. Man erhält dessen Ortsvektor , indem man für die Ortsvektoren der einzelnen Mitglieder deren gewichtetes Mittel bildet, wobei als Gewichtsfaktoren die individuellen Massen dienen:

Jede Komponente von stellt eine Art Mittelwert der entsprechenden Komponenten der Einzelobjekte dar. Im Gegensatz zum gewöhnlichen (arithmetischen) Mittel tragen die individuellen Körper jedoch nicht in gleichem Maße dazu bei, sondern mehr oder weniger je nach ihrer Masse. Ist z.B. doppelt so groß wie , so wird das Mitglied 1 bei der Mittelwertbildung gegenüber dem Mitglied 2 quasi doppelt gezählt. Der Schwerpunkt stellt somit den Mittelpunkt des Systems dar, wobei aber berücksichtigt wird, wie die einzelnen Massen verteilt sind.

Ein alltägliches Beispiel für den Schwerpunkt als gewichtetes Mittel unterschiedlicher Massen ist der Hebel. Um mit einer kleinen Masse z.B. eine doppelt so große Masse aufwiegen zu können, muss der Hebelarm für doppelt so lang sein wie für . Der Schwerpunkt des Sonnensystems liegt sehr nahe am Sonnenmittelpunkt (nahe deren Oberfläche), weil die Masse der Sonne sehr viel größer ist als diejenige selbst des massereichsten Planeten, des Jupiter.

Um die Ortsvektoren der einzelnen Massenpunkte auf den Schwerpunkt zu beziehen, zieht man einfach dessen Ortsvektor von diesen ab:

Lässt man eine Mehrkörpersimulation ablaufen, so ist es wünschenswert, dass der Schwerpunkt selbst ruht, also im Koordinatenursprung verharrt. Dies gelingt, indem man auch die Geschwindigkeiten in das Schwerpunktsystem umrechnet. Man geht dabei vor wie für die Ortsvektoren, d.h. bestimmt erst die Geschwindigkeit des Schwerpunkts und zieht diese dann von den ursprünglichen Geschwindigkeiten der Einzelobjekte ab.

Die Geschwindigkeit des Schwerpunkts folgt in Analogie zu seinem Ortsvektor aus dem gewichteten Mittel der Geschwindigkeiten der individuellen Körper:

Entsprechend gewinnt man die korrigierten Einzelgeschwindigkeiten aus den originalen durch Subtraktion der Schwerpunktgeschwindigkeit:

Die Frage, wie die anfänglichen Positionen und Geschwindigkeiten der Massenpunkte festzulegen sind, wird im Praxiskapitel ausführlich behandelt. Es wird dort aufgezeigt, dass die dafür erforderliche Herangehensweise sehr stark von dem Typ des zu untersuchenden Systems abhängt.

Die Umrechnung von Orten und Geschwindigkeiten ins Schwerpunktsystem kann mit folgender Prozedur bewerkstelligt werden. Übergeben werden dieser die Anzahl der Körper N, die Gesamtmasse M des Systems, die Einzelmassen m sowie die Vektoren r im ursprünglichen System. N ist vom Typ unsigned Integer, M eine Double. An für sich könnte die Gesamtmasse auch innerhalb der Prozedur bestimmt werden. Jedoch wird diese auch für andere Anwendungen benötigt, so dass M für die später diskutierten Praxisbeispiele vorab berechnet wird.

m ist ein eindimensionales Array, welches aus N Double besteht, entsprechend der Masse jedes einzelnen Objekts. r stellt ein zweidimensionales Array dar, welches N Vektoren enthält, die wiederum je drei Double auflisten. Diese Vektoren können sowohl Orte als auch Geschwindigkeiten repräsentieren, je nachdem was man umrechnen will.

Die Prozedur bestimmt zuerst den Zähler obiger Ausdrücke. Anschließend wird dieser durch M dividiert. Der so gewonnene Schwerpunkt wird durch das Array s repräsentiert. Im letzten Schritt erfolgt für r der Übergang ins Schwerpunktsystem, d.h. dieses Array nimmt am Ende auch die Rückgabewerte auf. Die Ausgangswerte werden dabei überschrieben, d.h. nicht weiter verwendet.

void schwerpunkt (unsigned int N, double M, double *m, double **r)
{
  unsigned int i,k;
  double s[3];

  for (k = 0;k < 3;k ++)
  s[k] = 0;

  for (i = 0;i < N;i ++)
  {
    for (k = 0;k < 3;k ++)
    s[k] += m[i] * r[i][k];
  }
  for (k = 0;k < 3;k ++)
  s[k] /= M;

  for (i = 0;i < N;i ++)
  {
    for (k = 0;k < 3;k ++)
    r[i][k] -= s[k];
  }
}


Die Koordinatentransformation in das Schwerpunktsystem muss nur ein einziges Mal zu Beginn der Simulation durchgeführt werden. Begründet ist dies durch die Erhaltung der Energie (welche im Unterkapitel Energieerhaltung detailliert besprochen wird) sowie die Unabhängigkeit der physikalischen Gesetze vom Beobachtungsort und der Blickrichtung. Die fundamentale Annahme, dass überall im Kosmos die gleichen physikalischen Gesetze gelten, bezeichnet man als Homogenität des Raumes. Die nicht weniger bedeutsame Annahme, dass (auf genügend großer Längenskala) das Universum in jeder Blickrichtung die gleichen Eigenschaften aufweist, als Isotropie des Raumes.