Wie kann ich die Abstoßung zwischen mehreren Punktladungen (Kugellagern) in Mathematica simulieren?

8

Ich versuche, ein Programm in Mathematica zu schreiben, das die Art und Weise simuliert, wie sich geladene Kugellager ausbreiten, wenn sie mit gleichen Ladungen aufgeladen werden (sie stoßen sich gegenseitig ab). Mein Programm hält die Kugellager davon ab, sich vom Bildschirm zu bewegen, und zählt, wie oft sie auf die Seite der Box treffen. Ich habe die Kugellager, die sich bisher zufällig um die Kiste bewegen, aber ich muss wissen, wie man sie dazu bringt, sich gegenseitig abzustoßen.

Hier ist mein Code bis jetzt:

%Vor%

    
Fermat11235 30.12.2011, 02:43
quelle

2 Antworten

7

Was Sie für Ihre Simulation benötigen, ist ein Kollisionserkennungsalgorithmus. Das Feld dieser Algorithmen ist weit verbreitet, da es so alt ist wie Computerspiele (Pong) und es ist unmöglich, hier eine vollständige Antwort zu geben.

Ihre jetzige Simulation ist sehr einfach, weil Sie Ihre geladenen Kugeln jedes Mal vorrücken, wodurch sie von Position zu Position "springen". Wenn die Bewegung so einfach ist wie bei der konstanten Geschwindigkeit und der Nullbeschleunigung, kennen Sie die exakte Gleichung der Bewegung und können alle Positionen berechnen, indem Sie einfach die Zeit in die Gleichungen eingeben. Wenn ein Ball von der Wand springt, erhält er eine neue Gleichung.

Damit können Sie vorhersagen, wann zwei Bälle kollidieren. Sie lösen einfach nach zwei Bällen, ob sie zur selben Zeit die gleiche Position haben. Dies wird A Priori-Erkennung genannt. Wenn Sie Ihre Simulation so nehmen, wie sie jetzt ist, müssten Sie zu jedem Zeitpunkt prüfen, ob zwei Kugeln so nahe beieinander liegen oder nicht, dass sie kollidieren können.

Das Problem ist, dass Ihre Simulationsgeschwindigkeit nicht unendlich hoch ist und je schneller Ihre Bälle sind, desto größer sind die Sprünge in Ihrer Simulation. Es ist dann nicht unwahrscheinlich, dass zwei Bälle sich gegenseitig überspringen und Sie eine Kollision verpassen.

In diesem Sinne könntest du den Wikipedia-Artikel zu diesem Thema lesen, um einen Überblick zu bekommen. Als nächstes könntest du einige wissenschaftliche Artikel darüber lesen oder nachsehen, wie die Risse es machen. Die Chipmunk-Physik-Engine zum Beispiel ist eine erstaunliche 2d-Physik-Engine. Um sicherzustellen, dass solche Sachen funktionieren, bin ich mir ziemlich sicher, dass sie eine Menge Gedanken in ihre Kollisionserkennung stecken müssen.

    
halirutan 30.12.2011 09:13
quelle
2

Ich kann den Erkennungsteil nicht machen, da dies ein eigenständiges Projekt ist. Aber jetzt scheint die Interaktion schneller zu sein, du hattest wenige Dynamics, die nicht benötigt wurden. (Wenn Sie die Seite der Zelle die ganze Zeit beschäftigt sehen, bedeutet dies immer, dass ein Dynamic beschäftigt ist, wo es nicht sein sollte).

Ich habe auch eine STOP / START-Taste hinzugefügt. Ich konnte nicht alles verstehen, was du tust, aber genug, um die Änderungen zu machen, die ich gemacht habe. Sie verwenden auch AppendTo everything. Sie sollten versuchen, Inhalte vorher zuzuordnen, und Part[] verwenden, um darauf zuzugreifen, wäre viel schneller, da Sie die maximal zulässigen Punkte zu kennen scheinen?

Ich möchte den Code gerne weiter verbreiten, das hilft mir, die Logik besser zu sehen.

Hier ist ein Screenshot und der aktualisierte Versionscode ist unten. Hoffe, du findest es schneller.

Siehe Code unten, in Update (1)

Aktualisieren (1)

%Vor%     
Nasser 30.12.2011 16:16
quelle