Verständnis der Formel für n-Body Simulationen

C

Crymes

Guest
Verständnis der Formel für n-Body Simulationen

Hi,
ich befasse mich gerade mit den n-Body Demos und verstehe die Formel dazu nicht so ganz:

Auf der folgenden Seite ist das Dokument von NVidia: http://wwwx.cs.unc.edu/~prins/Classes/633/Readings/nbody_gems3_ch31.pdf

Beim Punkt 31.2 die erste Formel: Dort wird eigentlich nur der Einheitsverbindugnsvektor der 2 Massen mal die entstehende Gravitationskraft gerechnet und man erhält einen neuen Richtungsvektor ?

Weiter unten wird etwas von einem Glättungsfaktor Epsilon geschrieben: Kann mir das einer kurz erklären wofür der gut ist? :what:
 
Ich versteh leider nicht so ganz was dein Problem ist. Steht doch im Text erklärt.
Bitte um Rückmeldung, hast nämlich mein Interesse geweckt.
 
AW: Verständnis der Formel für n-Body Simulationen

Ziemlich einfach, ehrlich gesagt:
Die Gravitationsformel mal den Normvektor des Vektors r, welcher der Abstand zwischen den zwei Massenpunkten ist.

Dann wird halt der resultierende Kraftvektor für jeden Massepunkt als die Summe aller gravitativen Wechselwirkungen zu anderen Massepunkten definiert.

Der Glättungsfaktor ist nötig, weil der Ausdruck divergiert, wenn der Abstand gegen null strebt. Dies wird mit Epsilon verhindert.

Melde dich wenn du mehr Fragen hast
 
Danke,
ich werd mir glaub noch ein kleines Programm in Java schreiben um das 3-Teilchen Problem zu veranschaulichen.
 
AW: Verständnis der Formel für n-Body Simulationen

Ich hab jetzt mal eine Simulation geschrieben, sie tut aber nicht :what: :huh: .
Vielleich kann sich einer kurz den Code anschauen und hat eine Idee warum das nicht funktioniert :daumen: .
Im Anhang ist das ganze Programm, ich poste hier mal die relevanten Stellen daraus:

Code:
public void computeBodies()
	{
		float[] r = new float[2];
		float[] temp = new float[2];
		for(int i=Bodies.size()-1; i>=0; --i)
		{
			temp[0] = 0;
			temp[1] = 0;
			for(int j=Bodies.size()-1; j>=0; --j)
			{
				//Verbindungsvektor der 2 Objekte
				r[0] = Bodies.elementAt(j).position[0] - Bodies.elementAt(i).position[0];
				r[1] = Bodies.elementAt(j).position[1] - Bodies.elementAt(i).position[1];
				
				//Betrag von r
				float abs = (float) Math.sqrt(r[0]*r[0] + r[1]*r[1]);
				
				//Beschleunigung ohne die Gravitationskonstante zum Aufaddieren berechnen
				temp[0] += (Bodies.elementAt(j).mass * r[0]) / (Math.sqrt(Math.pow(abs*abs + e*e, 3)));
				temp[1] += (Bodies.elementAt(j).mass * r[1]) / (Math.sqrt(Math.pow(abs*abs + e*e, 3)));
			}
			Bodies.elementAt(i).acceleration[0] = g * temp[0];
			Bodies.elementAt(i).acceleration[1] = g * temp[1];
		}
	}

und

Code:
public void moveBodies(float deltatime)
	{
		//Erst berechnete Beschleunigung zur aktuellen Geschwindigkeit addieren
		//Dann die neue Position mit   alte Position + v * t   berechnen
		for(int i=Bodies.size()-1; i>=0; --i)
		{			
			Bodies.elementAt(i).speed[0] += Bodies.elementAt(i).acceleration[0] * deltatime;
			Bodies.elementAt(i).speed[1] += Bodies.elementAt(i).acceleration[1] * deltatime;
			Bodies.elementAt(i).position[0] += Bodies.elementAt(i).speed[0] * deltatime;
			Bodies.elementAt(i).position[1] += Bodies.elementAt(i).speed[1] * deltatime;
		}
	}
 

Anhänge

  • BodySimulation.zip
    15,7 KB · Aufrufe: 2
Zurück