Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws2223:protokoll_07.03

Protokoll 07.03.

geschafft

Wir hatten gestern das Problem, dass die Teilchen beim Stoßen ihre Geschwindigkeit nicht wesentlich betragsmäßig verändert haben1)(was ein Formatierungsfehler war) und zudem hin und wieder an den Wänden festgeklebt sind (was sich durch eine kleine Positionsveränderung bei der Kollision behandeln ließ). Diese Probleme haben wir behoben und uns heute vor allem mit dem Problem beschäftigt, dass die Teilchen zusammenkleben. Bei diesem Problem sind wir sehr viel weiter gekommen, in dem wir eine Überprüfung der jeweiligen letzten Stoßpartner eingeführt haben, die wiederholte Stöße von zwei Teilchen verhindert, falls nicht zwischendurch andere Einwirkungen stattgefunden haben, denn eigentlich sollte es ohne Stöße mit dritten oder der Wand nicht die Möglichkeit geben, mehrmals zu stoßen.
Ausschnitt aus der neuen Kollisions-Methode:

def handle_collision(self, b2):
        """überprüft Kollision mit anderen Teilchen und berechnet neue Geschwindigkeit"""
        abstand = np.linalg.norm(b2.position - self.position)
        if abstand <= self.radius + b2.radius and not (self.last_collision == b2 and b2.last_collision == self):
            # Zwischenspeicher für Geschwindigkeiten
            b1_vel_vec = self.vel_vec
            b2_vel_vec = b2.vel_vec

            # Berechnung elastischer Stoß
            self.vel_vec = (self.masse * b1_vel_vec + b2.masse * (2 * b2_vel_vec - b1_vel_vec)) / (
                        self.masse + b2.masse)
            b2.vel_vec = (b2.masse * b2_vel_vec + self.masse * (2 * b1_vel_vec - b2.vel_vec)) / (self.masse + b2.masse)

            self.last_collision = b2
            b2.last_collision = self

(Außerdem wird bei Stößen mit der Wand der Wert von self.last_collision zurückgesetzt)
Die Lösung lässt sich aber noch verbessern, da die Teilchen nun manchmal durch das brownsche Teilchen hindurchfliegen, insbesondere bei hohen Radiusunterschieden. Außerdem haben wir Sektoren eingeführt, also die Einteilung der Bälle in Gruppen mit ähnlichen Koordinaten, und so die Anzahl der überprüften Stöße pro Zeitschritt reduziert:

class Sector:
    '''Aufteilung von Teilchen in Listen(Sektoren), die je einem Abschnitt des Fensters zugeordnet sind'''
    def __init__(self):
        self.sec1 = []
        self.sec2 = []
        self.sec3 = []
        self.sec4 = []
    def sectorize(self,ball, height=HEIGHT, width=WIDTH):
        '''ordnet den Ball einem Sektor im Koordinatensystem zu'''
        if ball.position[0] >= width/2 and ball.position[1] >= height/2:
            self.sec1.append(ball)
            return(self.sec1)
        elif ball.position[0] < width/2 and ball.position[1] >= height/2:
            self.sec2.append(ball)
            return(self.sec2)
        elif ball.position[0] < width/2 and ball.position[1] < height/2:
            self.sec3.append(ball)
            return(self.sec3)
        else:
            self.sec4.append(ball)
            return(self.sec4)
    def flush(self):
        '''leert die Sektoren'''
        self.sec1 = []
        self.sec2 = []
        self.sec3 = []
        self.sec4 = []

neue Abfrage zur Kollision2) innerhalb von main:

 sector.flush()
        for ball in balls:
            own_sector = sector.sectorize(ball)
            ''' Bewegung und Kollision aller Teilchen'''
            ball.handle_border_collision()
            for i in range(len(own_sector)-1):
                ball.handle_collision(own_sector[i])
            ball.move()
Offene Fragen, nächste Schritte

Weiterhin kommt es allerdings vor, dass die Teilchen ineinander gespawnt werden und dann recht lang brauchen, um sich zu trennen. Wir haben momentan zwei Haupt-To-Dos:

  • die Effizienz der Kollisionssimulation weiter zu verbessern, um mehr Teilchen (aktuell problemlos ~200) simulieren zu können
  • die Position, Gerschwindigkeit und Beschleunigung, die momentan in jeweils zwei Variablen aufgeteilt sind, als Vektoren (numpy array) zu speichern und somit die Berechnungen zu vereinfachen.

Zusätzlich haben wir das Projekt auf github hochgeladen, um besser zusammenarbeiten zu können. Langfristig ist unser Ziel, die Bewegung in 3D zu simulieren, wofür wir noch nach einer geeigneten Bibliothek suchen müssen.

1) Die geplottete Geschjwindigkeitsverteilung zeigt selbst danach noch große Abweichungen von der evtl. erwarteten Maxwell-Boltzmann-Verteilung, die Ursache könnte aber darin liegen, dass wir schlichtweg zu wenige Teilchen und somit zu wenige Stöße in noch dazu kurzer gesamter Simulationsdauer betrachten. Außerdem normieren wir am Anfang die Geschwindigkeitsvektoren, und die Abweichung von diesem Zustand dauert aus eben genannten Gründen sehr lange. Perspektivisch lässt sich vielleicht eine Anfangs-Geschwindigkeitsverteilung implementieren
2) Die -1 hinter len(own_sector) ist unerlässlich und bereitet, wenn sie nicht von vonherein mit eingebaut wird, einiges an Kopfzerbrechen: In diesem Fall können Teilchen mit sich selber stoßen, was allerdings erst zum Problem wird, wenn zusätzlich weitere Teilchen interagieren, und so eine neue Form des Klebeproblems darstellt.:-|
ws2223/protokoll_07.03.txt · Zuletzt geändert: 2023/03/09 14:26 von Jakob_Hoffmann