RegistrierenRegistrieren   LoginLogin   FAQFAQ    SuchenSuchen   
Gravitation und Kollision von Kugeln
 
Neue Frage »
Antworten »
    Foren-Übersicht -> Mechanik
Autor Nachricht
bene_2808



Anmeldungsdatum: 28.05.2017
Beiträge: 7

Beitrag bene_2808 Verfasst am: 28. Mai 2017 13:54    Titel: Gravitation und Kollision von Kugeln Antworten mit Zitat

Hallo Forum,

ich versuche schon seit Längerem eine Simulation für Gravitation mit kugelförmigen Masseneinheiten zu programmieren. Das ganze wäre aber nur halb so spannend, wenn die Kugeln nicht kollidieren könnten, da sonst die Bildung von planetenähnlichen Strukturen etc. unmöglich wäre. Für die Kollision habe ich bisher den elastischen Stoß verwendet.
Jetzt gibt es aber folgendes Problem: Ich bekomme einfach keine guten Zusammenstellungen hin, sodass es wirklich Spaß macht, der Simulation zuzuschauen. Und das liegt vermutlich vor Allem daran, dass in den physikalischen Algorithmen einfach Fehler sind. Zum Beispiel bewegen sich die Planeten meiner Meinung nach viel zu langsam aufeinander zu. Dies liegt wahrscheinlich daran, dass die internen Kollisionen mit nicht vollständiger Impulserhaltung jeden Impuls abschwächen, der in Richtung eines anderen Planeten aufgebaut wird. Nutze ich allerdings 100%ige Impulserhaltung, können sich gar keine stabileren Strukturen bilden... grübelnd

Hier mal der grobe Code, den ich für die Aktualisierung aller Kugeln verwende:
Code:

// Die letzte Kugel kann mit keiner anderen mehr verglichen werden,
      // deswegen circleCount - 1
      int lastCircle1 = circles.length - 1;
      for (int circleIndex1 = 0; circleIndex1 < lastCircle1; ++circleIndex1) {
         for (int circleIndex2 = circleIndex1 + 1; circleIndex2 < circles.length; ++circleIndex2) {
            float deltaX = circles[circleIndex1].position.x - circles[circleIndex2].position.x;
            float deltaY = circles[circleIndex1].position.y - circles[circleIndex2].position.y;
            float squaredDistance = deltaX * deltaX + deltaY * deltaY;
            float distance = (float)Math.sqrt(squaredDistance);
            // Nur der Vollständigkeit halber derart ungekürzt
            if (distance > circleDiameter) {
               float force = gravityConstant * circleMass * circleMass / squaredDistance;
               float acceleration1 = force / circleMass;
               float acceleration2 = force / circleMass;
               float deltaVelocity1 = acceleration1 * timeInterval;
               float deltaVelocity2 = acceleration2 * timeInterval;
               // Delta normalisieren, um die Vektoren zu den Beträgen zu
               // finden
               float normalizedX = deltaX / distance;
               float normalizedY = deltaY / distance;
               // Neue Geschwindigkeit dazuaddieren
               add(circles[circleIndex1].velocity, normalizedX, normalizedY, -deltaVelocity1);
               add(circles[circleIndex2].velocity, normalizedX, normalizedY, deltaVelocity2);
            }
            if (distance <= circleDiameter) {
               // Kollision
               if (distance < circleDiameter) {
                  // Kugeln erst einmal voneinander entfernen, damit
                  // das eigentliche Abprallen weiter unten richtig
                  // ablaufen kann.
                  float massSum = 2.0f * circleMass;
                  float f = circleDiameter / distance - 1.0f;
                  deltaX *= f;
                  deltaY *= f;
                  float dX = deltaX * circleMass / massSum;
                  float dY = deltaY * circleMass / massSum;
                  circles[circleIndex1].position.add(dX, dY);
                  circles[circleIndex2].position.sub(dX, dY);
               }
               float x1 = circles[circleIndex1].velocity.x;
               float y1 = circles[circleIndex1].velocity.y;
               float x2 = circles[circleIndex2].velocity.x;
               float y2 = circles[circleIndex2].velocity.y;
               float nx = circles[circleIndex2].position.x - circles[circleIndex1].position.x;
               float ny = circles[circleIndex2].position.y - circles[circleIndex1].position.y;
               float scalarN = nx * nx + ny * ny;
               // Winkel zwischen Kugel1 und Stoßnormaler
               float f1 = (x1 * nx + y1 * ny) / scalarN;
               // Paralelle Komponente
               float vp1x = nx * f1;
               float vp1y = ny * f1;
               // Senkrechte Komponente
               float vs1x = x1 - vp1x;
               float vs1y = y1 - vp1y;
               // Winkel zwischen Kugel2 und Stoßnormaler
               float f2 = (x2 * nx + y2 * ny) / scalarN;
               // Parallele Komponente
               float vp2x = nx * f2;
               float vp2y = ny * f2;
               // Senkrechte Komponente
               float vs2x = x2 - vp2x;
               float vs2y = y2 - vp2y;
               // Wenn Massen der zwei Kugeln gleich sind ->
               // Vereinfachung Parallele Komponenten werden getauscht,
               // senkrechte bleiben gleich
               circles[circleIndex1].velocity.set(vs1x + vp2x * remainingImpulse, vs1y + vp2y * remainingImpulse);
               circles[circleIndex2].velocity.set(vs2x + vp1x * remainingImpulse, vs2y + vp1y * remainingImpulse);
            }
         }
      }
      // Kugeln abhängig von der Geschwindigkeit verschieben
      for (int circleIndex = 0; circleIndex < circles.length; ++circleIndex) {
         add(circles[circleIndex].position, circles[circleIndex].velocity.x, circles[circleIndex].velocity.y, timeInterval);
      }


Danke für jede Idee! smile
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 28. Mai 2017 21:41    Titel: Antworten mit Zitat

Den Algorithmus zu prüfen ist aufwändig; mathematische Formeln wären einfacher.

Was mir sofort auffällt:
1) Impulserhaltung gilt für den Gesamtimpuls unter allen Umständen exakt
2) Energieerhaltung gilt ohne Stöße unter allen Umständen exakt; bei teilelastischen Stößen wird kinetische Energie in innere Energie umgewandelt
3) Wenn sich zwei Körper sehr nahe kommen, ist die numerische Integration bzw. Simulation aufgrund des 1/r Potentials sehr aufwändig

Ich denke, dass du nicht direkt mit der Kraft und einer Differentialgleichung zweiter Ordnung arbeiten solltest. Betrachte





r_i, p_i sind Vektoren mit



Generell solltest du zunächst für das o.g. System - für Massenpunkte, ohne Stöße und Energieverlust - die hamiltonschen Bewegungsgleichungen als gekoppelte DGLs erster Ordnung in (r_i,p_i) berechnen und einen stabilen Algorithmus implementieren. E und P müssen im Zuge der Berechnung konstant gehalten werden.

Im Folgenden kannst du das System auf ausgedehnte Körper mit Energieverlust im Falle eines Stoßes verallgemeinern; d.h. immer um die von kinetischer in innere Energie umgewandelte Energie reduzieren; dazu benötigst du ein vernünftiges Modell für diesen Energieverlust je Körperpaar.
bene_2808



Anmeldungsdatum: 28.05.2017
Beiträge: 7

Beitrag bene_2808 Verfasst am: 29. Mai 2017 15:49    Titel: Antworten mit Zitat

Danke schon mal für die schnelle Antwort! smile

Sorry für den langen Algorithmus; ich habe ihn nur deswegen mit gepostet, weil es sich zumindest teilweise auch um ein algorithmisches Problem handelt...
Eigentlich geht es um die grundsätzliche Struktur:

Code:

für jedes Kugelpaar:
   wenn sich die Kugeln überschneiden:
      Elastischer Stoß; Formel nutzt Geschwindigkeiten des letzten Bildes,
      verrechnet sie und leitet daraus neue Geschwindigkeiten her
   sonst:
      Gravitation zwischen Kugeln berechnen und auf Geschwindigkeit
      anwenden
   ende wenn
ende schleife


Zu deinen Anmerkungen:
1) Aber wie kann Impulserhaltung denn zum Beispiel für den nicht vollständig elastischen Stoß gelten? Da geht doch ein Teil des Impulses verloren... Oder beziehst du dich auf den vollkommen elastischen Stoß?
2) Bei Energieerhaltung wird es mit meinem physikalischen Verständnis schon schwierig Haue / Kloppe / Schläge ... Die Energie im Gravitationsfeld definiert sich mehr oder weniger über das "Potential" zwischen den Massen oder? Aber inwiefern bleibt Energie erhalten, wenn Kugeln aufeinander zu beschleunigt werden?
3) Diesen Fall habe ich möglicherweise dadurch vereinfacht, dass in meiner Anwendung keine Gravitation wirkt, wenn sich zwei Kugeln überschneiden.

Die Formeln und das darunter schaue ich mir noch genauer an... Big Laugh
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 29. Mai 2017 17:00    Titel: Antworten mit Zitat

zu 1) wenn zwei Teilchen der selben Masse m mit Impuls p, Geschwindigkeit v und einer beliebigen Bewegungsrichtung vollständig inelastisch kollidieren, dann gilt im Schwerpunktsystem

vorher







nachher





zu 2) die erhaltene Energie (ohne Betrachtung von inelastsichen Stößen) habe ich oben hingeschrieben.

zu 3) im Moment des Stoßes benötigst du keine Betrachtung der Gravitation; wenn du ausgedehnte Kugeln simulierst, musst die den Streuwinkel geometrisch bestimmen; wenn du Punktteilchen betrachtest, ist es ausreichend, die Winkelverteilung über den Streuquerschnitt zu "würfeln"; wenn du ein Modell für den Energieverlust hast, läuft das auf eine Reflexion der Teilchen aneinander hinaus

_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
bene_2808



Anmeldungsdatum: 28.05.2017
Beiträge: 7

Beitrag bene_2808 Verfasst am: 29. Mai 2017 17:36    Titel: Antworten mit Zitat

1) Nur zum Verständnis: Sind die beiden ê bei den Startimpulsen die normalisierten Bewegungsvektoren? grübelnd
Warum ist dann der Impuls des einen Teilchens dem des anderen exakt entgegengerichtet? Ich dachte, die Bewegungsrichtung sei beliebig...
Und wie sieht das ganze dann aus, wenn auch der Betrag der Geschwindigkeit beliebig ist?

Sorry, dass ich physikalisch nicht soo bewandert bin um alles auf Anhieb zu verstehen Hilfe
Was fängt man dann mit den Gleichungen bei "nachher" an? Also ich meine, wie kommt man darauf, was die konkreten Richtungsvektoren NACH der Kollision sind?

3) Ja, ich glaube die Berechnung des elastischen Stoßes in meinem Beispiel funktioniert korrekt. Nur der verringerte Impuls wirkt sich falsch auf die Anziehung von mehreren zusammenhängenden Strukturen von Kugeln aufeinander aus... :/
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 29. Mai 2017 18:31    Titel: Antworten mit Zitat

bene_2808 hat Folgendes geschrieben:
1) Nur zum Verständnis: Sind die beiden ê bei den Startimpulsen die normalisierten Bewegungsvektoren? ?(
Warum ist dann der Impuls des einen Teilchens dem des anderen exakt entgegengerichtet? Ich dachte, die Bewegungsrichtung sei beliebig...
Und wie sieht das ganze dann aus, wenn auch der Betrag der Geschwindigkeit beliebig ist?

Weil ich oben geschrieben habe, dass wir das im Schwerpunktssystem betrachten. Und in diesem ist der Gesamtpimpuls P = P' = 0 vor und nach dem Stoß Null; so ist das Schwerpunktssystem gerade definiert. Wenn aber P = P' in einem speziellen System gilt, dann gilt das in jedem System (genauer: Inertialsystem)

bene_2808 hat Folgendes geschrieben:
Was fängt man dann mit den Gleichungen bei "nachher" an? Also ich meine, wie kommt man darauf, was die konkreten Richtungsvektoren NACH der Kollision sind?

Ich habe einen vollständig inelastischen Stoß beschrieben, d.h. die kinetische Energie wird vollständig in innere Energie umgewandelt. Im Falle zweier gleich schwerer und gleich schneller Teilchen sind diese dann nach dem Stoß in Ruhe.

Man kann dies natürlich auch für unterschiedliche Teilchenmassen und Geschwindigkeiten diskutieren, dann ist die Kinematik eben etwas komplizierter.

M.E. must du diese Spezialfälle verstehen, bevor du dich an dein wesentlich komplizierteres Problem herantrauien solltest. Deine Algorithmen müssen zuerst für diese einfachen Fälle vernünftige Lösungen liefern.

bene_2808 hat Folgendes geschrieben:
ich glaube die Berechnung des elastischen Stoßes in meinem Beispiel funktioniert korrekt.

Das solltest du nochmal verifizieren, und zwar für den allereinfachsten Fall rein elastischer Stöße nicht-gravitierender Punktteilchen.

bene_2808 hat Folgendes geschrieben:
Nur der verringerte Impuls wirkt sich falsch auf die Anziehung von mehreren zusammenhängenden Strukturen von Kugeln aufeinander aus.

Betrachte doch zunächst elastiasche Stöße nicht-gravitierender Punktteilchen.

Als nächstes betrachtest du vollständig inelastische Stöße, wiederum von nicht-gravitierenden Punktteilchen. Diese kleben zusammen, wenn sie sich näher als eine bestimmte kritische Distanz kommen. Du berechnest dies für zwei Teilchen für deren minimalen Abstand; du ersetzt in diesem Fall beide Teilchen der Masse m durch eines doppelter Masse 2m; du berechnest (im Schwerpunktsystem mit P = 0) den neuen Impuls P' = 2mV' = 0 nach dem Zusammenkleben gemäß Impulserhaltung; du überlegst dir, was dies in dem von dir gewählten Begugsystem != Schwerpunktsystem bedeutet (P = P' gilt wegen Impulserhaltung weiterhin); ein Teil der kinetischen Energie wird dabei in innere Energie umgewandelt (ein komplizierteres Modell wie beim teilelastsichen Stoß ausgedehnter Körper benötigst du nicht; das Zusammenkleben ist m.E. die einfachste Implementierung)

_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5041

Beitrag DrStupid Verfasst am: 29. Mai 2017 18:40    Titel: Antworten mit Zitat

bene_2808 hat Folgendes geschrieben:

wenn sich die Kugeln überschneiden:
Elastischer Stoß; Formel nutzt Geschwindigkeiten des letzten Bildes,
verrechnet sie und leitet daraus neue Geschwindigkeiten her


Was passiert, wenn sich mehr als zwei Kugeln überschneiden?

bene_2808 hat Folgendes geschrieben:

sonst:
Gravitation zwischen Kugeln berechnen und auf Geschwindigkeit
anwenden


Nur, wenn sie sich nicht überschneiden? Wenn die Dichte groß wird, dann werden sich viele Kugeln überschneiden und dementsprechend viele gravitative Wechselwirkungen vernachlässigt.

Ohne Gravitation habe ich sowas auch schon mal simuliert. Dabei habe ich die Schrittweise immer so gewählt, dass jede Kollision am Ende eines Simulationsschrittes erfolgt. Bei vollkommen elastischen Stößen funktioniert das sehr gut. Bei teilweise elastischen Stößen geht die Schrittweite aber schnell gegen Null (und damit die Rechenzeit gegen unendlich), weil die Kugeln anfangen aneinander zu haften.

Eine Alternative zu starren Kugeln wäre die Einführung eines abstoßenden Potentials (z.B. Lennard-Jones). Weil die entsprechenden Kräfte eine kurze Reichweite haben, kann man dabei mit einem Linked-Cell-Algorithmus viel Zeit sparen. Den Energieverlust kann man durch einen zusätzlichen geschwindigkeitsabhängigen Term einbauen.

Das Problem mit der langreichweitigen Gravitationskraft bliebt dann natürlich immer noch. Da helfen aber Näherungsverfahren wie z.B. Barnes-Hut oder die Zerlegung in eine kurzreichweite Wechselwirkung (die dann in den Linked-Cell-Algorithmus implementiert wird) und einen langreichweitigen Teil, den man zunächst zu einem globalen Feld addiert und anschließend die Kräfte in diesem Feld berechnet.

bene_2808 hat Folgendes geschrieben:
1) Aber wie kann Impulserhaltung denn zum Beispiel für den nicht vollständig elastischen Stoß gelten? Da geht doch ein Teil des Impulses verloren...


Impulserhaltung gilt immer. Die Kollision zweier glatter starrer Kugeln A und B kann man sich am besten als Kraftstoß vorstellen, bei dem der Impuls dp von Kugel A auf Kugel B übertragen wird. Wenn pA und pB die Impulse vor dem Stoß sind, dann sind pA'=pA-dp und pB'=pB+dp die Impulse nach dem Stoß. Wie groß dp ist, hängt davon ab, wie elastisch der Stoß ist. In jedem Fall gilt aber pA+pB=pA'+pB'.

bene_2808 hat Folgendes geschrieben:
Die Energie im Gravitationsfeld definiert sich mehr oder weniger über das "Potential" zwischen den Massen oder? Aber inwiefern bleibt Energie erhalten, wenn Kugeln aufeinander zu beschleunigt werden?


Im Prinzip dadurch, dass die Kugeln schneller werden, wobei potentielle in kinetische Energie umgewandelt wird. So wie Du die Kollisionen behandelst, geht diese Bilanz aber völlig zum Teufel.
bene_2808



Anmeldungsdatum: 28.05.2017
Beiträge: 7

Beitrag bene_2808 Verfasst am: 29. Mai 2017 21:05    Titel: Antworten mit Zitat

Aalso schon mal vielen Dank für die ausführlichen Antworten Thumbs up! Big Laugh

Zitat:
Was passiert, wenn sich mehr als zwei Kugeln überschneiden?


Tja, das wird leider eben nicht so adhoc festgestellt. Wie gesagt, es werden die Kugeln immer nur paarweise betrachtet. Bekommen die Paare also eine andere Reihenfolge, kommt man möglicherweise auch zu anderen Ergebnissen. Außerdem ist dann tatsächlich selbst für ein Bild nicht mal gewährleistet, dass sich tatsächlich kein einziges Kugelpaar mehr überschneidet, da bei einer Betrachtung zwei Kugeln so auseinander geschoben werden können, das eine von ihnen wieder eine andere schneidet, die bereits betrachtet wurde... Aber ich wüsste ehrlich gesagt auch nicht, wie man das mit vertretbarem Rechenaufwand perfekt hinkriegen sollte... grübelnd

An TomS: Ich habe auf jeden Fall den vollkommen elastischen Stoß auch ohne Gravitation getestet und die Ergebnisse "sahen ganz gut" aus. Nachgerechnet habe ich das natürlich nicht Big Laugh
Ich werd mich morgen noch mal bisschen genauer mit euren Antworten beschäftigen smile
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 29. Mai 2017 21:27    Titel: Antworten mit Zitat

Wichtig ist, dass E und P erhalten sind. Man kann m.W.n. Algorithmen verwenden, die das sicherstellen (ich bin kein Numerik-Experte), du solltest auf jeden Fall E und P bei elastischen sowie zwischen den inelastischen Stößen auf Erhaltung prüfen. Ggf. trifft das auch auf den Gesamtdrehimpuls L zu, insbs. dann bei inelastischen Stößen, um deren korrekte Modellierung sicherzustellen.
_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5041

Beitrag DrStupid Verfasst am: 29. Mai 2017 21:31    Titel: Antworten mit Zitat

bene_2808 hat Folgendes geschrieben:
Aber ich wüsste ehrlich gesagt auch nicht, wie man das mit vertretbarem Rechenaufwand perfekt hinkriegen sollte... ?


Es kommt natürlich darauf an, was man als "vertretbar" ansieht. Ich habe das folgendermaßen gemacht:

1. Beim Start mit den aktuellen Positionen und Geschwindigkeiten alle potentiellen Kollisionen berechnen und nach Zeitpunkt sortiert in eine Liste eintragen.

2. Zum Zeitpunkt der ersten Kollision in der Liste alle Positionen aktualisieren.

3. Die Geschwindigkeiten der beiden kollidierenden Kugeln auf die Werte nach dem Stoß setzen.

4. Alle Kollisionen dieser beiden Kugeln aus der Kollisionsliste entfernen.

5. Alle potentiellen Kollisionen dieser beiden Kugeln neu berechnen und in die Kollisionsliste einsortieren

6. Weiter bei 2.

Mit ein paar tausend Kugeln war die Rechenzeit noch erträglich. Allerdings geht das so nur bei Abwesenheit von Kräften.


Zuletzt bearbeitet von DrStupid am 29. Mai 2017 21:49, insgesamt 2-mal bearbeitet
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5041

Beitrag DrStupid Verfasst am: 29. Mai 2017 21:46    Titel: Antworten mit Zitat

TomS hat Folgendes geschrieben:
Wichtig ist, dass E und P erhalten sind.


E ist nur bei elsatischen Stößen erhalten. Bei inelastischen Stößen kann man bestenfalls berechnen, welche Energie verloren geht und prüfen ob die Änderung der Gesamtenergie dazu passt.

TomS hat Folgendes geschrieben:
Man kann m.W.n. Algorithmen verwenden, die das sicherstellen (ich bin kein Numerik-Experte)


Ich empfehle das Leapfrog-Verfahren:




TomS hat Folgendes geschrieben:
Ggf. trifft das auch auf den Gesamtdrehimpuls L zu, insbs. dann bei inelastischen Stößen, um deren korrekte Modellierung sicherzustellen.


Bei glatten Kugeln sollte der Drehimpuls automatisch erhalten bleiben. Wenn Reibung ins Spiel kommt, sieht die Sache natürlich anders aus. Dann muss man zusätzlich zu Position und Geschwindigkeit auch den Spin der Kugeln berücksichtigen.
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 29. Mai 2017 21:48    Titel: Antworten mit Zitat

Wie hast du das implementiert? C/C++, Mathematica? hattest du eine Library aus dem Internet?
_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5041

Beitrag DrStupid Verfasst am: 29. Mai 2017 21:52    Titel: Antworten mit Zitat

TomS hat Folgendes geschrieben:
Wie hast du das implementiert? C/C++, Mathematica? hattest du eine Library aus dem Internet?


Ich habe das Ganze ohne Libraries in Delphi (Object-Pascal) geschrieben.
VeryApe



Anmeldungsdatum: 10.02.2008
Beiträge: 3247

Beitrag VeryApe Verfasst am: 30. Mai 2017 07:38    Titel: Antworten mit Zitat

wieso wollt ihr mit der Energie hantieren?.

Rein elastische Stösse sind ja nicht realistisch und es können sich doch keine Klumpen bilden.

Impulserhaltung und beim Stoss eine geschwindigkeitsabhängige Stosszahl einbauen. je stärker die zusammenkrachen umso mehr wandert die Stosszahl gegen null. und null bedeutet plastischer Stoss.

k=1 elastischer stoss. also so würde ich das machen und schauen was passiert

_________________
WAS IST LOS IN EUROPA? https://www.youtube.com/watch?v=a9mduhSSC5w
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 30. Mai 2017 08:11    Titel: Antworten mit Zitat

VeryApe hat Folgendes geschrieben:
wieso wollt ihr mit der Energie hantieren?.

Rein elastische Stösse sind ja nicht realistisch und es können sich doch keine Klumpen bilden.

Man muss sicherstellen, dass der Algorithmus den einfachsten Fall korrekt behandelt und für diesen Energieerhaltung sicherstellt. Bereits im Fall elastischer Stöße gravitierender Teilchen oder endlicher Kugeln ist dies nicht trivial. Und zwischen den Stößen gilt sowieso Energieerhaltung.

Ohne diese zu berücksichtigen hast du keine Kontrolle, ob dein Algorithmus korrekt funktioniert.
bene_2808



Anmeldungsdatum: 28.05.2017
Beiträge: 7

Beitrag bene_2808 Verfasst am: 30. Mai 2017 16:36    Titel: Antworten mit Zitat

DrStupid, die Formeln zum Leapfrog-Verfahren finde ich sehr interessant. Habe auch versucht, sie einzubinden, aber das ist dann doch wieder schwierig, weil ja auch noch die Kollision dazukommt und die kann man schlecht darauf anpassen... grübelnd

VeryApe, das mit der Stoßzahl wäre auch eine Idee... Ich habe das mal ausprobiert und für die Funktion der Impulserhaltung in Abhängigkeit von den beiden Geschwindigkeiten folgendes versucht:



Ist eine frei erfundene Funktion (sorry an die Physiker Big Laugh ), die deine Bedingungen für eine von den Geschwindigkeiten abhängige Impulserhaltung erfüllt. a ist eine beliebige reelle positive Zahl, die angibt, wie stark höhere Geschwindigkeiten zu geringerer Impulserhaltung beitragen.
Die Resultate sind leider auch nicht sehr viel besser... Die Planeten schleichen immer noch aufeinander zu Haue / Kloppe / Schläge
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 30. Mai 2017 16:57    Titel: Antworten mit Zitat

bene_2808 hat Folgendes geschrieben:
... die deine Bedingungen für eine von den Geschwindigkeiten abhängige Impulserhaltung erfüllt.

Nochmal: der Gesamtimpuls ist immer exakt erhalten, nicht jedoch die Summe aus kinetischer und potentieller im Falle inelastischer Stöße.
VeryApe



Anmeldungsdatum: 10.02.2008
Beiträge: 3247

Beitrag VeryApe Verfasst am: 30. Mai 2017 17:08    Titel: Antworten mit Zitat

Zitat:
Ist eine frei erfundene Funktion (sorry an die Physiker Big Laugh ), die deine Bedingungen für eine von den Geschwindigkeiten abhängige Impulserhaltung erfüllt. a ist eine beliebige reelle positive Zahl, die angibt, wie stark höhere Geschwindigkeiten zu geringerer Impulserhaltung beitragen.


ehrlich gesagt verstehe ich nicht was du da ansetzt.

Ich würde vorschlagen du beschäftigst dich zunächst mal mit der Impulserhaltung und der Energie bei Stössen, bevor du hier eine physikalische Simulation programmieren willsd und eigentlich nichts von den physikalischen Vorgängen verstehst.

Das wirsd du ziemlich schnell verstanden haben.

dann kannsd du auf den realen Stoss eingehen und die Stosszahl für die es schon experimentelle Werte für verschiedene Objekte gibt.

die Formel dazu steht zum Beispiel hier.
http://www.maschinenbau-wissen.de/skript3/mechanik/kinetik/342-realer-stoss

Dann mußt du noch das Problem von DrStupid in den Griff kriegen wenn mehrere Objekte am selben Stoss beteiligt sind.

_________________
WAS IST LOS IN EUROPA? https://www.youtube.com/watch?v=a9mduhSSC5w
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5041

Beitrag DrStupid Verfasst am: 30. Mai 2017 21:25    Titel: Antworten mit Zitat

bene_2808 hat Folgendes geschrieben:
DrStupid, die Formeln zum Leapfrog-Verfahren finde ich sehr interessant. Habe auch versucht, sie einzubinden, aber das ist dann doch wieder schwierig, weil ja auch noch die Kollision dazukommt und die kann man schlecht darauf anpassen... grübelnd


Wenn Du starre Kugeln simulierst, dann kannst Du den Integrator bestenfalls zwischen den Stößen verwenden. Die Schrittweite müsste dann immer so gewählt werden, dass die Stöße zwischen jeweils zwei Integrationsschritten erfolgen. Weil man den Zeitpunkt des jeweils nächsten Stoßes nicht exakt vorausberechnen kann, ist das nur mit großem Aufwand umzusetzen. Deshalb hatte ich oben als Alternative die Simulation elastischer Kugeln durch Einführung einer abstoßenden Kraft ins Spiel gebracht. Dafür wird gern das Lennard-Jones-(12,6)-Potential verwendet:



Die zugehörige Lennard-Jones-Kraft sieht so aus:



Wie man leicht sieht, ist diese Kraft positiv (und damit abstoßend) wenn der Abstand r zwischen den Teilchen kleiner als der Gleichgewichtsabstand R ist. Wird der Abstand größer als R, dann ist die Kraft anziehend. Der Parameter bestimmt die Stärke der Kraft (bzw. die Härte der Kugeln). Wenn man die Anziehung vermeiden will, dann kann man die Kraft für r>R einfach auf Null setzen.

Wenn die Partikel unterschiedlich groß und hart sind, dann gilt



mit



und



Das Ganze mag auf den ersten Blick kompliziert aussehen, aber praktisch ist das gar nicht so schlimm. Für das Gravitationspotential musst Du ohnehin alle Abstände berechnen. Daraus die für die Lennard-Jones-Kräfte notwendigen Potenzen von R/|r| und dann die Kräfte selbst zu berechnen ist nicht dramatisch. Und für |r|>>R kann man diese Wechselwirkung komplett vernachlässigen. Das ist sicher nicht schwieriger als die Behandlung der Kollision starrer Kugeln.

Um grobe Rechenfehler und Oszillationen zu vermeiden musst Du allerdings darauf achten, dass die Schrittweite nicht zu groß wird. Bei kleiner Auslenkung schwingen zwei Kugeln mit der Periode



um die Ruhelage. Solange die Schrittweite deutlich unter der kleinstmöglichen Schwingungsdauer bleibt, sollte die Simulation stabil laufen.

Um die Stöße inelastisch zu machen, kannst Du eine zusätzliche Kraft einführen, die von der relativgeschwindigkeit der Teilchen abhängt und mit zunehmendem Abstand schnell auf Null fällt (damit nur dann Energie verbraten wird, wenn sich die Teilchen auch tatsächlich begegnen).
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 30. Mai 2017 23:57    Titel: Antworten mit Zitat

Die Kombination aus anziehendem Coulomb-Potential, abstoßendem Potential mit hartem Kern sowie (z.B. exponentiell) abfallender "Dichte" und Reibungsterm halte ich für sinnvoll. Alle Beiträge werden äquivalent behandelt; insbs. spart man sich die geometrische Behandlung der Kugeln und kann bei Massepunkten bleiben.
VeryApe



Anmeldungsdatum: 10.02.2008
Beiträge: 3247

Beitrag VeryApe Verfasst am: 31. Mai 2017 08:24    Titel: Antworten mit Zitat

DrStupid hat Folgendes geschrieben:

Wenn Du starre Kugeln simulierst, dann kannst Du den Integrator bestenfalls zwischen den Stößen verwenden. Die Schrittweite müsste dann immer so gewählt werden, dass die Stöße zwischen jeweils zwei Integrationsschritten erfolgen.


Hast du eigentlich mehrere Threads verwendet für deine Simulation. Oder hast du alles von einem Thread berechnen lassen??
So wie du das schreibst schaut es so aus wie wenn das Programm in einem Thread rennt, obwohl ich noch keine Ahnung habe, welche genauere Probleme da wirklich bei der Programmierung auf einem zu kommen.

_________________
WAS IST LOS IN EUROPA? https://www.youtube.com/watch?v=a9mduhSSC5w
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 31. Mai 2017 09:19    Titel: Antworten mit Zitat

Die zentrale Fragestellung dabei ist, ob man die Stöße und den Energieverlust tatsächlich mittels geometrischer Kugeln simuliert, und ob man auf das Newtonsche Gravitationspotential verzichtet. In dem Fall liegt nämlich ein rein geometrisches Problem vor, bei dem man wie von DrStupid oben erklärt vorgehen kann: man bestimmt geometrisch den jeweils nächsten Stoß; die Zeit zwischen den Stößen muss dann nicht betrachtet werden.

Alternativ - und so verstehe ich den letzten allgemeineren Vorschlag - betrachtet man ein dynamisches System mit nicht-konservativen Zwei-Teilchen.Wechselwirkungen. Das läuft auf ein Differentialgleichungssystem (ggf. im hamiltonschen Formalismus erster Ordnung) hinaus. Der Ansatz dafür ist sicher völlig anders.

Ob und wie man parallelisiert ist eine zweite Fragestellung; zunächst mal muss man die grundsätzliche Modellierung festlegen. Für den zweiten Ansatz kann man dann einfach das Differentialgleichungssystem berechnen und dafür im Netz nach geeigneten Lösungsmethiden suchen.
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5041

Beitrag DrStupid Verfasst am: 31. Mai 2017 19:59    Titel: Antworten mit Zitat

VeryApe hat Folgendes geschrieben:
Hast du eigentlich mehrere Threads verwendet für deine Simulation.


Nein, nur einen. Wahrscheinlich kann man es parallelisieren, aber das lohnt sich erst, wenn alle anderen Möglichkeiten zur Beschleunigung der Simulation ausgeschöpft wurden.
bene_2808



Anmeldungsdatum: 28.05.2017
Beiträge: 7

Beitrag bene_2808 Verfasst am: 02. Jun 2017 13:33    Titel: Antworten mit Zitat

DrStupid, danke für die Formeln! Das scheint mir eigentlich auch ein sehr sinnvoller Ansatz zu sein... Ich habe jetzt bei Überschneidung deine Formel verwendet und ansonsten die normale Newton-Gravitation, da die Anziehung sonst zu schwach wäre. Leider scheint die abstoßende Kraft einfach zu stark zu werden... Auch das Verringern von funktioniert nicht wirklich... Hilfe

Sorry an alle, denen ich hier nicht genug Physikwissen mitbringe. Ich frage ja, weil ich selbst nicht genug Ahnung habe und Erklärungen im Internet nicht vollständig verstehe bzw. nicht optimal umsetzen kann... Die Simulation steht ja schon, sie muss jetzt eben nur noch mit korrekten Formeln arbeiten. Lehrer
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5041

Beitrag DrStupid Verfasst am: 02. Jun 2017 19:18    Titel: Antworten mit Zitat

bene_2808 hat Folgendes geschrieben:
Ich habe jetzt bei Überschneidung deine Formel verwendet und ansonsten die normale Newton-Gravitation,


Das ist keine gute Idee. Wenn Du die Gravitationskraft einfach abschneidest, dann steigt sie zunächst auf einen endlichen und je nach Größe und Masse der Kugeln möglicherweise sehr hohen Wert, um dann plötzlich auf Null zu fallen. Die gängigen Integratoren (zu denen auch Leapfrog gehört) mögen solche Unstetigkeiten überhaupt nicht. Deshalb solltest Du die Gravitation sicherheitshalber auch während der Überschneidung ganz normal mitberechnen.

Bei der Lennard-Jones-Kraft ist das kein Problem, weil sie verschwindet, wenn die Kugeln sich berühren. Durch das Abschneiden bei größeren Abständen verschwindet einfach nur die möglicherweise unerwünschte Anziehung. Das gilt allerdings nur, wenn Du alles richtig machst und da bin ich mir nicht so sicher wenn ich das hier lese:

bene_2808 hat Folgendes geschrieben:
da die Anziehung sonst zu schwach wäre. Leider scheint die abstoßende Kraft einfach zu stark zu werden... Auch das Verringern von funktioniert nicht wirklich...


Wenn die Kugeln sich überschneiden, dann soll die Lennard-Jones-Kraft sie viel stärker auseinander drücken, als sie durch die Gravitations zusammen gezogen werden. Andernfalls würden sie ja nicht abprallen. Wenn sie auch bei Kugeln abstoßend wirkt, die sich nicht überschneiden (und danach hört es sich für mich an), dann machst Du etwas falsch. Wenn der Abstand r der Kugeln größer als der Gleichgewichtsabstand R ist, dann ist die Lennard-Jones-Kraft nicht abstoßend, sondern anziehend.
bene_2808



Anmeldungsdatum: 28.05.2017
Beiträge: 7

Beitrag bene_2808 Verfasst am: 03. Jun 2017 13:08    Titel: Antworten mit Zitat

Ok habe jetzt mal einen Versuch ohne Gravitation gemacht und einen Vorzeichenfehler behoben und siehe da: Lennard-Jones funktioniert wirklich sehr gut, danke! war auch viel zu klein gewählt. Habe diesen Faktor jetzt von der Masse der Kugeln abhängig gemacht, da die aus der Kraft resultierende Beschleunigung ja auch indirekt proportional zur Masse ist. Big Laugh

Nur in Kombination mit der Gravitation hakt es noch ein bisschen... Egal ob ich die Gravitation immer aufaddiere, oder nur, wenn die Kugeln sich nicht schneiden: immer wieder kommen sich zwei Kugeln zu nahe und schießen danach auseinander. Aber nur Lennard-Jones ist im anziehenden Bereich zu schwach. Werde jetzt mal versuchen, eine stetige, differenzierbare zusammengesetzte Funktion aus Lennard-Jones für Abstoßung und Newton für Anziehung herzuleiten... grübelnd
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5041

Beitrag DrStupid Verfasst am: 03. Jun 2017 13:36    Titel: Antworten mit Zitat

bene_2808 hat Folgendes geschrieben:
immer wieder kommen sich zwei Kugeln zu nahe und schießen danach auseinander


Das klingt nach einer zu großen Schrittweite.
TomS
Moderator


Anmeldungsdatum: 20.03.2009
Beiträge: 18018

Beitrag TomS Verfasst am: 03. Jun 2017 15:37    Titel: Antworten mit Zitat

bene_2808 hat Folgendes geschrieben:
Nur in Kombination mit der Gravitation hakt es noch ein bisschen... Egal ob ich die Gravitation immer aufaddiere, oder nur, wenn die Kugeln sich nicht schneiden: immer wieder kommen sich zwei Kugeln zu nahe und schießen danach auseinander.

Was erwartetst du?

Sind Gesamtenergie und Impuls im Zuge dieser "Streuung" enthalten?

Warum rechnest du immer noch mit Kugeln statt mit Punkten? Das Zusammenkleben kommt doch im nächsten Schritt über die Reibungskraft - wie oben vorgeschlagen.

DrStupid hat recht, du musst die Schrittweite verkleinern. Evtl. kannst du diese abhängig vom Abstand der Massenpunkte dynamisch anpassen.

_________________
Niels Bohr brainwashed a whole generation of theorists into thinking that the job (interpreting quantum theory) was done 50 years ago.
DrStupid



Anmeldungsdatum: 07.10.2009
Beiträge: 5041

Beitrag DrStupid Verfasst am: 03. Jun 2017 21:35    Titel: Antworten mit Zitat

TomS hat Folgendes geschrieben:
du musst die Schrittweite verkleinern. Evtl. kannst du diese abhängig vom Abstand der Massenpunkte dynamisch anpassen.


Ich weiß zwar nicht, wie der Integrator auf eine variable Schrittweite reagiert, aber es dürfte besser sein, als die Simulation die ganze Zeit mit minimaler Schrittweite laufen zu lassen. Da man ohnehin in jedem Schritt alle Abstände und Geschwindigkeiten bestimmt, ist es kein allzugroßer Mehraufwand, ganz grob abzuschätzen, wie nahe sich die Partikel innerhalb des nächsten Schrittes kommen werden, um dann notfalls auf die Bremse zu treten.

Eine andere Methode zur Schrittweitenkrontrolle besteht darin, diese so zu wählen, dass der Fehler (z.B. gemessen an der Energieerhaltung) innerhalb eines vorgegebenen Intervalls bleibt. Liegt er darüber, dann wird der aktuelle Schritt mit kleinerer Schrittweite wiederholt. Liegt er darunter, dann wird die Schrittweite für den nächsten Schritt vergrößert.
Neue Frage »
Antworten »
    Foren-Übersicht -> Mechanik