Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws2223:projekt_hoehenformel

Dies ist eine alte Version des Dokuments!


Brownsche Bewegung und Perrins Untersuchungen der Höhenformel

Lily Linder, Marcel Nöldner, Jakob Hoffmann

Zielsetzung und Motivation

Die Brownsche Bewegung ist keineswegs ein Phänomen nur zweier Dimensionen. Bereits in den frühen Untersuchungen Jean Perrins spielt die Konzentration der Brownschen Teilchen in verschiedenen Höhen, selbst innerhalb von Proben, die nur Bruchteile von Millimetern hoch sind, eine wichtige Rolle. Das „Verschwinden“ von beobachteten Teilchen aus der begrenzten Sichttiefe des Mikroskop stellt in diesen Beobachtungen eine große Hürde dar- trotzdem gelingt es Perrin und seinem Schüler Chaudesaigues im Folgenden, einzelne Teilchen über Zeiträume von bis zu 25 Minuten zu verfolgen. Diesen bemerkenswerten Umständen wollen wir uns in diesem Projekt annähern und sie vergleichen mit den Sichtweisen, die uns die Möglichkeiten zur Computersimulation bieten. Dafür ist unser Hauptziel zunächst, eine dreidimensionale Simulation der Brownschen Bewegung mindestens eines suspendierten Teilchens zu programmieren und entsprechend zu visualisieren. Auch die Gravitationskraft soll dabei berücksichtigt werden. Im Weiteren wollen wir in ähnlicher Vorgehensweise wie Perrin versuchen, brownsche Teilchen auf verschiedene Höhenstufen eingeschränkt zu beobachten und einschätzen, wie (oder ob überhaupt) es sich umsetzen lässt, ein einziges Teilchen so lange im Blickfeld zu behalten. Schließlich soll auch die Untersuchung der Konzentration (bzw. verwandter Größen) in Abhängigkeit von der Höhe und insbesondere der Bezug zur beziehungsweise Zusammenhang mit der atmosphärischen Höhenformel Gegenstand unserer Projektarbeit sein.

Historisches

  • „When Perrin seized upon Brownian movement as a phenomenon for detailed study, many mysteries had been illuminated, though irksome questions still remained. There was in the current colloid literature a renewed interest in the Brownian particles as a thing in themselves, with opinion still divided over the cause of their activity. […] Perrin moved into a new direction for proofs of the kinetic theory as a cause of Brownian movement.“ (Nye 1972, S. 102)

Einer der frühesten Ansätze Perrins, der eine Brücke schlägt zwischen der Brownschen Bewegung und der kinetischen Gastheorie, beleuchtet die vertikale Verteilung der Dichte von Teilchen im Größenmaßstab beobachtbarer Brownschen Bewegung, über verschiedene Messreihen und Experimente variiert zwischen etwa 0,2 und 0,5 Mikrometer. Die Feststellung einer exponentiellen Verteilung solcher Teilchen in Analogie zur Konzentration von Gasteilchen in der Atmosphäre führt Perrin, unter Berufung auf Léon Gouy, zur Hypothese, dass es sich bei der Brownschen Bewegung tatsächlich um eine Konsequenz der Stöße von Molekularteilchen der Flüssigkeit handelt (vgl. Nye 1972, S. 103). Interessanterweise waren diese frühesten Experimente Perrins noch weitgehend unabhängig von den später untrennbar mit seiner Arbeit verbundenen Abhandlungen Einsteins. Die Verifizierungen von in der statistischen Physik begründeten Vorraussagen zur Brownschen Bewegung, die Einstein, beginnend in seinem Annus mirabilis 1905, veröffentlichte, zählen aber ohne Frage, wie auch von Perrin schnell verstanden, zu seinen bedeutsamsten Errungenschaften. Dass Perrins Werk heute wie bereits durch prominente Zeitgenossen (Ernest Rutherford, Walter Nernst, Gösta Mittag-Leffler) als wesentlicher Schritt im Sinne der Verifizierung der atomistischen Weltanschauung angesehen werden kann (vgl. Bigg 2008, S. 320) ist wohl nicht zuletzt in der Präzision und Gründlichkeit fundiert, mit der Perrin experimentierte. Gouy, der seinerzeit ähnliches versucht hatte, gestand Perrin in einem Brief 1909:

  • „I can tell you myself that, if it had not been for the difficulty which I perceived in preparing such granules, I would have more actively pursued my experimentation on Brownian movement“ (Nye 1972, S. 105)

Wie genau und minutiös die Beobachtungen tatsächlich waren, wird insbesondere klar, wenn man sich diese Schwierigkeiten vor Augen führt und solche, die bei der Beobachtung von Teilchen dieser Größe selbst mit technischen Errungenschaften wie dem Ultramikroskop auftreten.Ist die Herstellung von Präparaten dieser Art eine Herausforderung für sich, liegt in der Beobachtung der Teilchen doch weiterhin eine Hürde, die die Simulation im Rahmen dieses Projekts im Weiteren zu veranschaulichen versuchen wird. Perrin „kann gleichzeitig nur die Teilchen genau sehen, welche sich in einer sehr dünnen (Größenordnung des [Mikrometer]) Horizontalschicht befinden.“ (Perrin 1910, S.33), was der geringen Feldtiefe des Mikroskops bei starker Vergrößerung zuzurechnen ist (ebd.). Die Beobachtung solcher Höhenschichten und die Zählung der Teilchen in diesen Schichten ist allerdings essentiell für die Beschäftigung mit der eingangs erwähnten Dichteverteilung und so stellt sich unweigerlich die Frage, wie es Perrin gelang, diese Teilchen, die „fortwährend verschwinden, während doch neue Teilchen auftauchen“ (ebd.) zu beobachten. Anhand der gemeinsam mit der anderen Gruppe erarbeiteten grundlegenden Stoßsimulation und unter Vorraussetzung zumindest eines geringen Maßes an Übertragbarkeit erschien es uns zunächst sehr schwierig, unter diesen Umständen überhaupt Messungen durchzuführen. Der Anspruch der Übertragbarkeit muss natürlich sehr differenziert betrachtet werden, besonders in Bezug auf den erwähnten Prototypen des eigentlichen Projekts. Dennoch wurde uns beim Betrachten von den in dieser Version schon ausgeprägten chaotischen Zitterbewegungen zumindest klar, auf welchem Maßstab der Genauigkeit und vielleicht sogar in welchem Umfang Messungen dieses Phänomens geschehen müssten.

Um die Verbindung zwischen Perrins Vorgehen und der fertigen Simulation (siehe unten) herzustellen, muss allerdings noch ein wenig weiter ausgeholt werden. Im Jahre 1908 untersuchte Victor Henri die Brownsche Bewegung anhand von 1 Mikrometer großen Teilchen und beobachtete außergewöhnlich große Verschiebungen, was im Widerspruch zu Einsteins Theorie zu stehen schien. Während viele französische Physiker annahmen, Einsteins Erklärung sei unvollständig, versuchte sich Perrin (der sich zu diesem Zeitpunkt bereits eingehend mit Einsteins Arbeit beschäftigt hatte) eines experimentellen Nachweises von Einsteins Formel. Dies hielt er unter anderem für möglich, da Henri den Durchmesser seiner Teilchen abschätzte und Perrin in der Lage war, ihn genau zu bestimmen. Mithilfe seines Studenten Chaudesaigues unternahm er so eine Reihe von Experimenten, bei denen er die Avogadro-Konstante N mit Einsteins Formel bestimmte und das Ergebnis mit dem mithilfe einer erprobten Methode berechneten Wert verglich. Chaudesaigues beobachtete zunächst 40 Körner mit einem Radius von 0,45 Mikrometern und zeichnete die Position eines Teilchens in einem Zeitraum von 2 Minuten alle 30 Sekunden auf, bevor er sich dem nächsten Teilchen zuwandte. So erhielt er den Wert 94*10^22 für N. Perrin und Chaudesaigues führten drei weitere solche Experimentreihen durch, wobei sie Teilchen mit verschiedenen Radien und verschiedener Viskosität betrachteten. Als mittleren Wert für die Avogadro-Konstante N erhielten sie 70*10^22, was fast genau dem Wert entsprach, den Perrin mit einer anderen Methode errechnet hatte. Um sein Ergebnis genauer zu überprüfen, untersuchten er und Chaudesaigues anschließend Körner aus Mastix anstatt aus Gummigutti wie zuvor. Dies lieferte ihnen den Wert 73*10^22 für N. Zusammen mit den Ergebnissen der Experimente mit den Gummigutti-Körnern berechnete Perrin für die Avogadro-Konstante den Wert 71.5*10^22, was mit dem zuvor bekannten Wert 70.5*10^22 fast genau übereinstimmt. Einsteins Formel hatte sich also als richtig erwiesen (vgl. Perrin 1910, S. 55-60).

Was Perrin in seiner wichtigen Veröffentlichung „Movement Brownien et réalité moléculaire“ allerdings in deutlich geringerem Umfang beschreibt als etwa die Herstellung der Kolloidlösung, ist der Sprung in der Dauer der Beobachtung eines Teilchens von 4 verzeichneten Positionen in Chaudesaigues' ersten Messungen bis hin zu 50 Schritten à 30 Sekunden in Verbindung mit der berühmten Zeichnung der Teilchenbahnen (siehe Abb. 1). Wurde doch vorher beschrieben, wie häufig sich Teilchen aus der beobachtbaren Schicht entfernen, so scheint eine 25-minütige Beobachtung eines Teilchens sehr glücklich. Waren solche Messungen also die Ausnahme?

Abb. 1: Spur Brownscher Teilchen, Perrin 1910

Um diese (wohlbemerkt nur intuitiven) Zweifel auf eine immerhin qualitative Art zu behandeln, haben wir die im Folgenden beschriebene Simulation in ihrer Art, aber auch in ihrer Visualisierung soweit möglich an den Sicht- und Arbeitsweisen Perrins ausgerichtet.

Konzept

Alle Ansätze, die wir im Verlauf der Projektphase verfolgt haben, lassen sich auf einen grundlegenden Aufbau mit wenigen Komponenten reduzieren:Teilchenbad

  • Teilchen: viele kleine Einheiten mit einem festen Satz an Eigenschaften
  • Container: Eine räumlich abgeschlossene Umgebung, in der sich die Teilchen bewegen können
  • Interaktionsregeln: Ein fester Satz an vorgeschriebenen Interaktionen zwischen den Teilchen und ihrer Umgebung

Abb.2: Frühe Version eines Teilchenbades mit vier Wänden (Container), zwei Arten von Teilchen und einer einfachen Kollisionsmechanik (Interaktionsregel)

Projekt

Vorab eine Einführung zu verschiedenen von uns genutzten Werkzeugen und libraries:

GitHub (Versionsverwaltung)

Git wird in der Programmierung häufig genutzt um Versionen im Laufe der Entwicklung zu verwalten und gemeinsam an einem Programm zu arbeiten. Zudem ermöglicht Git verschiedene Zweige eines Projektes zu erstellen, die auch wieder zusammengeführt werden können. Um unkomplizierter zusammenarbeiten zu können, haben wir uns entschieden, unsere Versionen mithilfe von Git zu verwalten. So konnten wir leichter in verschiedene Richtungen arbeiten und Fehlentwicklungen leichter auf eine funktionierende Version zurücksetzen. Dies ermöglichte uns auch ein einfacheres Arbeiten von Zuhause ohne unseren Quellcode dauerhaft mühselig über Plattformen wie tubcloud auszutauschen. Für die Implementierung von verschiedenen libraries war es ebenso hilfreich, über Git die Programme auf einen gemeinsamen Nenner rückverfolgen zu können.
public git repository

Visualisierungen

Pygame

Pygame ist eine Python-libary mit der man schnell 2D-Grafiken mit verschiedenen Körpern erstellen kann. Normalerweise wird dies für kleine 2D Spiele verwendet. Mithilfe von Pygame haben wir (im Austausch mit dem Projekt zur Temperaturveränderung) unser erstes zweidimensionales Becken erstellt, in dem sich die Teilchen (Bälle) bewegen können. So konnten wir erste Erfahrungen sammeln, wie man Stöße mit der Wand oder mit andern Teilchen implementieren muss. Eine Erweiterung auf eine Darstellung im dreidimensionalen ist mit Pygame allerdings nicht möglich, somit mussten wir uns bereits früh andere Werkzeuge suchen. Wir haben zwei Wege zur Visualisierung im Dreidimensionalen gleichzeitig verfolgt. Möglich war dies, da sich ein Teilchen (im Folgenden auch häufig als Ball bezeichnet, was sich aus der Benennung der Objekte in Pygame fortgesetzt hat) in seinen wesentlichen Eigenschaften nicht verändert, sondern nur die Art und Weise der Visualisierung.

VPython

VPython ist eine libary, mit der man 3D-Grafiken erstellen kann. Viele Körper sind als Klassen bereits vordefiniert und diesen müssen nur eine vektorielle Position, Geschwindigkeit und im Falle unserer Teilchen(Bälle) ein Radius übergeben oder im Fall der Wände die Länge, Breite und Höhe übergeben werden. VPython öffnet ein Fenster im Browser, indem die Grafik zu sehen ist. Die dreidimensionale Darstellung in VPython ist rechentechnisch vergleichsweise effizient, sodass wir problemlos bis zu 800 stoßende kleine und mehrere Brownsche Teilchen implementieren konnten. Da VPython keine 2D Grafikkomponente besitzt, mussten wir einen kleinen Trick anwenden. Es wurde ein zweites Fenster erstellt, in dem eine weitere 3D-Grafik eine 2D-Grafik suggeriert. Zu einem wurden hier nur die Brownschen Teilchen angezeigt, um die Grafik zu vereinfachen und zum anderen wurde die alte z-Koordinate (multipliziert mit -1) zur y-Koordinate und die neue z-Koordinate immer auf 0 gesetzt, um eine Art Draufsicht zu erstellen:

for i, ball in enumerate(brownsche_teilchen_3D):
    brownsche_teilchen_2D[i].pos = vector(ball.pos.value[0], ball.pos.value[2]*-1, 0)

Abb.3: Visuelle Ausgabe von V-Python

In der Grafik sind zudem mehrere Brownsche Teilchen zu erkennen (große Bälle). Da in Perrins Beobachtungen ebenfalls viele dieser Teilchen zu sehen waren, haben wir uns entschieden, die VPython Version in der Teilchenanzahl der Brownschen Teilchen ebenfalls variabler zu gestalten. So kann man in den ersten Zeilen der VPython Version nicht nur die Anzahl der kleine Teilchen einstellen, sondern auch die Anzahl der Brownschen Teilchen. Zusätlich dazu kann man den einzelnen Bronwchen Teilchen verschiedenen Farben geben, um diese besser zu unterscheiden.

BROWNSCHESTEILCHEN_AMOUNT = 5
# Anzahl der Farben >= Amount: Farben werden gewählt; Anzahl der Farben < Amount: Nur erste Farbe
BROWNSCHESTEILCHEN_COLOR = [color.red, color.cyan, color.magenta, color.yellow, color.green]
BROWNSCHESTEILCHEN_MASSE = 4
BROWNSCHESTEILCHEN_RADIUS = 1.6

In ihrer elemantaren Struktur unterscheidet sich die VPython-Variante nicht sehr von den folgenden Versionen und den aufgeführten Methoden oder Ideen, die Visualisierung ist jedoch grundsätzlich anders und deswegen hier vorangestellt. Im Folgenden sind, wo nötig, beide Code-Varianten aufgeführt, die weiteren Visualisierungen stammen jedoch aus anderen Zweigen, mit denen wir uns eingehender auseinandergesetzt haben 1)

matplotlib

matplotlib ist eine library, die umfangreiche Methoden zur grafischen Darstellung von Daten bietet. Für uns von Interesse war dabei vor allem die Möglichkeit zur Erstellung von dreidimensionalen Scatterplots als naheliegende Möglichkeit, große Mengen von Punkten in bestimmte Positionen im Raum zu zeichnen. Ein proof of concept ist so leicht zu erstellen, aber diese Art der Darstellung bietet auch einige Tücken, die meist daher rühren, dass die Marker in einem Scatterplot nicht wie Kugeln behandelt werden, sondern wie Kreise, die auf die Projektion des Plots in die Bildebene gezeichnet werden. Für die Darstellung von zweidimensionalen Daten wiederum ist matplotlib sehr geeignet, weshalb wir letztendlich beide Wege verfolgt haben.
Abb.4: Ein matplotlib-Scatterplot

Klassen

Abb.5: UML-Klassendiagramm

Ball

In der Klasse Ball ist ein stoßendes Teilchen definiert. Jedem Teilchen werden dabei ein Radius, eine Masse, eine Farbe und Geschwindigkeits- sowie Ortsvektoren zugeordnet. Die wesentlichen Aktionen, die ein Teilchen durchführen kann, sind in Funktionen beschrieben

  • move(): bewegt das Teilchen um die Geschwindigkeit mal einen Zeitschritt
  • move_debug(): bewegt das Teilchen um einen festen Wert (um fehlerhafte Bewegungen zu korrigieren)
  • handle_border_collision(): überprüft Kollision mit den Wändrn, invertiert Geschwindigkeitskomponente und setzt das Teilchen zurück ins Fenster
  • handle_collision(): überprüft Kollision mit einem anderen Teilchen und berechnet neue Geschwindigkeit

Code: matplotlib-Version VPython-Version (hier: geringe Unterschiede)

Cubesector

Bei der Simulation von vielen Teilchen liegt es nahe, eine hohe Teilchenzahl mit einem belastbareren Ergebnis zu assoziieren. Die Umsetzung dieses Wegs führt jedoch schnell zu hohem Rechenaufwand. Die Kollisionsüberprüfung jedes Teilchens mit jedem anderen Teilchen in jedem Zeitschritt bewegt sich im Rahmen quadratischer Komplexität in Abhängigkeit von der Teilchenzahl. Um dem entgegenzuwirken, haben wir bereits früh nach Methoden gesucht, die Anzahl dieser Abfragen zu reduzieren.

Eine Möglichkeit besteht darin, den Container, also den Raum, in dem die Teilchen stoßen können, zu partitionieren. Diese Implementierung für drei Dimensionen ist in der Klasse Cubesector definiert. Ein Objekt dieser Klasse ist als ein Würfel im Raum zu verstehen, der durch eine Länge und einen Mittelpunkt definiert ist. Jedem Sektor sind außerdem alle Bälle, die sich aktuell in ihm befinden, in Form einer Liste zugeordnet.

Eine wichtige Eigenschaft eines Sektors ist, dass er wieder in 8 gleich große Sektoren unterteilt werden kann, quasi analog zu den Oktanten eines dreidimensionalen kartesischen Koordinatensystems. So lässt sich ein beliebig feines Gitter erzeugen, wir arbeiten allerdings mit nur einem subdivide. Da der Sektor bildlich gesehen die Bälle beinhaltet, sind ihm auch die entsprechenden Funktionen, die sich auf mehrere Bälle beziehen, zugeordnet.

  • subdivide(): Teilt den Sektor (einen Würfel) in 8 neue, gleich große Sektoren auf und sammelt diese in einer Liste
  • get_subcube(): Vergleicht Positionen von Punkten mit dem Mitelpunkt + der Länge des Sektors und gibt einen Integer von 0-7 aus, der den zugehörigen subcube repräsentiert, in dem sich der Punkt befindet
  • clear(): löscht die Liste der zugeordneten Bälle

Abb.6: Oktanten 2)
Die vielleicht wichtigste Funktion des ganzen Programms ist move_ball(). Durch sie werden die Bewegungs- und Kollisionsfunktionen aller jeweiligen Bälle aufgerufen und Gravitation „angewandt“.

class Cubesector:
    # [...]   
    def move_ball(self,G):
        ''' Bewegung und Kollision aller Teilchen'''
        for ball in self.balls:
            ball.handle_border_collision(wall)
            for i in range(self.balls.index(ball) + 1, len(self.balls)):
                ball.handle_collision(self.balls[i],wall)
            ball.vel_vec[2] -= G*ball.zeitschritt
            ball.move()

Code: matplotlib-Version VPython-Version

main

Hauptteil des Programms

In der Main-Klasse werden die Teilchen animiert und die Bewegung des Brownschen Teilchen verfolgt, insbesondere ob es sich in der für Perrin sichtbaren Schicht befindet. Für die Animation haben wir zunächst matplotlib und dann später auch VPython verwendet. Von der matplotlib-Variante gibt es zudem eine precompute und eine nicht-precompute-Variante. In der precompute-Variante, die wir bevorzugt verwendet haben, werden alle Schritte der Teilchen vorab berechnet und erst dann animiert, wodurch die Animation flüssiger läuft. Die Anzahl der Schritte kann mit der Variable num_steps bestimmt werden, wobei das Programm (in unserer Ausführung auf einem Mittelklasse-Laptop) für die Berechnung von 500 Schritten von 200 Bällen etwa 16 Sekunden benötigt.

Wie bereits erwähnt, konnte Perrin aufgrund der geringen Tiefenschärfe seines Mikroskops stets nur eine bestimmte Schicht der Flüssigkeit beobachten und dementsprechend auch nur die Teilchen sehen, die sich in dieser Schicht befanden. Dies wollten wir in unserer Simulation veranschaulichen und auch festhalten, wie lange sich unser Brownsches Teilchen in der Schicht aufhielt, um nachvollziehen zu können, welche Herausforderung die längere Beobachtung eines Teilchens für Perrin darstellte. In der aktuellen Version des Programms werden Teilchen, die sich nicht in der Schicht befinden, auch nicht mehr gezeichnet, sie sind also für den Betrachter unsichtbar, wie es auch in Perrins Experimenten war.


Abb. 7: erste Version ohne 3D-Ansicht, bei der nur überprüft wird ob das Brownsche Teilchen die Schicht verlassen hat

Abb. 8: Version ohne 3D-Ansicht, bei der zudem aufgezeichnet wurde, wie lang sich das Brownsche Teilchen in der Schicht befand

Abb. 9: erste Version mit 3D- und 2D-Projektion, bei der die Teilchen außerhalb der Schicht noch gezeichnet werden

Abb. 10: aktuelle Version mit 3D-Ansicht, bei der die Teilchen außerhalb der Schicht in der 2D-Ansicht nicht gezeichnet werden

In der 3D-Animation werden dabei die Bällchen gezeichnet, wie sie sich in der Realität verhalten würden, in der 2D-Projektion wird dargestellt, was Perrin sah.

Die Main-Klasse, respektive die gleichnamige Datei, besitzt folgende Funktionen:

  • generate_balls(): erstellt die gewünschte Anzahl von Bällen (Teilchen) und gibt sie als Liste zurück
  • do_everything(): ordnet alle Bälle den richtigen Sektoren zu und bewegt sie anschließend, gibt die Liste der Bälle zurück
  • update_graph1(): greift auf die aktuellen (neu berechneten3)) Positionen der Bälle zu und versetzt sie dahin, zeichnet die Spur des Brownschen Teilchens
  • update_graph2(): zeichnet die Bälle in der 2D-Projektion, wobei die Bälle sowie das Brownsche Teilchen nicht gezeichnet werden, wenn sie die Schicht verlassen haben. Hervorgehoben wird an dieser Stelle insbesondere der Mittelteil der Funktion (zweiter Codeblock), mit dem überprüft wird, ob sich die Teilchen in der Schicht befinden:
def update_graph2(num2):
    '''\Ebenenprojektion\:zeichnet die Verschiebung der Position ins Koordinatensystem;
    schließt Teilchen außerhalb der Horizontalschicht aus der Visualisierung aus und zählt die Schritte,
    die das Brownsche Teilchen innerhalb verbringt
    ACHTUNG: funktioniert nur, wenn vorher auch update_graph1 aufgerufen wurde.'''
    global xlist, ylist, zlist, brown_pos, vanishes, sizes2, colors, plane_graph, in_layer, ent_time, count, layer_time
    layered_xlist = xlist.copy()
    layered_ylist = ylist.copy()
    # setzt Indikatoren bei einer Wiederholung der Animation zurück
    if num2 == 0:
        vanishes = 0
        ent_time = 0
        layer_time = 0
    # löscht Teilchen außerhalb der Schicht aus layered_xlist/_ylist, ohne die Länge der Liste zu verändern
    for index in reversed(range(len(zlist))):
        if index == 0:
            if zlist[index] + BROWNSCHESTEILCHEN_RADIUS < bot_layer or zlist[index] - BROWNSCHESTEILCHEN_RADIUS > top_layer:
                layered_xlist[index] = None
                layered_ylist[index] = None
                if (in_layer == True):
                    vanishes += 1  # wie oft das Brownsche Teilchen die Schicht verlassen hat
                    count = 0  # Zählvariable, damit vanishes nicht in jedem Schritt außerhalb der Schicht erhöht wird
                    layer_time = num2 - ent_time  # aktuelle Zeit(Austrittszeit) - Eintrittszeit
                    print('Austritt {}: nach {} Schritten'.format(vanishes, layer_time))
                    in_layer = False
            if (zlist[index] - BROWNSCHESTEILCHEN_RADIUS <= top_layer and zlist[
                index] + BROWNSCHESTEILCHEN_RADIUS >= bot_layer) and count == 0:
                in_layer = True
                ent_time = num2  # Teilchen ist gerade in die Schicht eingetreten
                count += 1
        elif zlist[index] + BALL_RADIUS < bot_layer or zlist[index] - BALL_RADIUS > top_layer:
            layered_xlist[index] = None
            layered_ylist[index] = None
    # Für Projektion in die x-y-Ebene:
    line2.set_data(brown_pos[:num2, :2].T)
    plane_graph.set_offsets(np.column_stack([layered_xlist, layered_ylist]))
    # plane_graph = ax2.scatter(layered_xlist,layered_ylist,s= sizes2, c =colors)
    title2.set_text('Top-Down Ansicht, Anzahl Schichtaustritte ={}, Schichtzeit ={}'.format(vanishes, layer_time))

Auswertung und Fazit


Abb. 11: Dreidimensionaler Render mit main_precompute.py; beschleunigt

Um festzustellen, wie sich die von uns erstellte Visualisierung einordnen lässt, muss zunächst einmal der Mechanismus der Simulation reflektiert werden. Dass keine gute quantitative Näherung besteht, drängt sich nahezu auf. Mittels precompute, etwas Rechenzeit und einigermaßen leistungsfähigen Rechnern lassen sich mindestens tausend Teilchen in einem akzeptablen Zeitrahmen simulieren, aber der Avogadro-Konstante oder der durch sie und andere molare Größen vorgegebenen tatsächlichen Teilchenzahl im gewünschten Behälter wird sich das Programm auch bei weiterer Optimierung nicht wesentlich annähern können. Tatsächlich soll, und muss im Kontext der Beschäftigung mit Perrins Beobachtungen, diese Realität aber auch nicht emuliert werden können. Wir glauben, dass wir mit Gravitation, elastischen Stößen und verschiedenen Teilchenarten bereits wesentliche Faktoren berücksichtigen. Ein Modell wie auch eine Simulation wird stets Annahmen treffen und Vereinfachungen vornehmen, eine qualitative Betrachtung wird häufig auch dadurch erst ermöglicht- Perrin schreibt in Bezug auf seine berühmten Zeichnungen der Bahnen von brownschen Teilchen, jene vermittelten schlecht die „ außerordentliche Kompliziertheit der Bahn. Wenn man die Punkte von Sekunde zu Sekunde machen würde, dann käme an die Stelle eines jeden dieser Segmente eine 30seitige polygonale Kontur von der gleichen Mannigfaltigkeit, wie sie die Zeichnung hier wiedergibt“ (Perrin 1910, S. 60).

Auf eine ähnliche Weise ermöglicht uns die Simulation in ihrem aktuellen Zustand, einzelne Teilchen zu verfolgen, und (wichtigerweise) auch, sie aus den Augen zu verlieren, wie anfangs in Bezug auf perrinsche Beobachtungen problematisiert. Eine gründliche Verifizierung der Aussagekraft, das heißt eine mathematische, könnte sich äußerst schwierig gestalten, da wir wie bereits erörtert im Wesentlichen mit Verhältnissen statt mit Größen und Einheiten arbeiten. Was sich überprüfen lässt, ist ein Zwischenresultat in Form der erhaltenen Spuren brownscher Teilchen, die in ihrer Unvorhersehbarkeit nahe an die durch Perrin aufgezeichneten Spuren herankommen und auch optisch sehr ähnlich sind. Sicherlich hätte man ähnliche Resultate mit anderen Simulationen oder sogar ausschließlich über die Betrachtung von Zufallsprozessen erreichen können, was aber nicht unbedingt negativ zu bewerten ist, da der wesentliche Beobachtungsgegenstand das Verlassen der Horizontalschicht ist.
Dabei ist es insbesondere wichtig, sich klarzumachen, was es ist, dass man gerade beobachtet. Unsere dreidimensionale Simulation wird in ihrer Ausgabe auf verschiedene Arten in die Ebene projiziert. Auch Perrin merkt an „die Körner, die ich bereitet hatte, [wurden] in der Hellkammer bei senkrechtem Mikroskop angezeichnet, wodurch man die Horizontalprojektionen der Verschiebungen erhielt.“ (Perrin 1910, S.57). Zwar könnte sich eine solche Aussage auch ausschließlich auf die offensichtliche, wenngleich komplexe Tatsache beziehen, dass eine Zeichnung immer eine Projektion ist, allerdings ließe sie sich auch dahingehend interpretieren, dass bereits sein Versuchsaufbau eine gewisse Art von Projektion gewährleistet, auch wenn er in den folgenden Ausführungen nicht genauer darauf eingeht. In jedem Fall würde dies die Beobachtung der brownschen Bewegung sehr vereinfachen: Das Problem des schnellen Verlassens der beobachtbaren Schicht schlägt sich tatsächlich auch in der Simulation so gravierend nieder wie erwartet. In der Abbildung ist zu erkennen, dass das brownsche Teilchen in diesem Simulationszyklus nur einen Bruchteil der Zeit innerhalb der Schicht verbracht hat. Die Spur ist trotzdem chaotisch, und in Kombination mit der Bewegung in die Bildebene ergibt sich auch eine 'perrinsche Spur', nur wäre diese schwer zu beobachten gewesen. Einige weitere Punkte sind in diesem Zusammenhang relevant: Ist das beobachtete Teilchen nicht zu klein (oder groß) im Vergleich zum Behälter (was bei Perrin vermutlich der Fall sein dürfte mit einer Probenhöhe von 100 Mikron und Teilchengrößen in der Größenordnung von 0,5 Mikron (vgl. Perrin 1910, S.32ff.)), dann spielt die Position der Schicht eine Rolle, wie auch Perrin, der sich bereits im Voraus mit der Konzentrationsverteilung in verschiedenen Höhen beschäftigt hatte, klar gewesen sein dürfte. Eine nach unten verschobene Schicht dürfte längere Beobachtungszeiten ermöglichen. Das wäre auch ein guter Ansatzpunkt für ausführlichere weiterführende Betrachtungen. Weiterhin wird allerdings an der Abbildung auch klar, dass eine zu geringe Teilchenzahl die Aussagekraft auch massiv beeinträchtigen kann: Bis zu einem gewissen Punkt (~400 Teilchen im Kontext unserer Versuche) wird die Wirkung der Gravitation durch das Fehlen von Teilchen, mit denen beim Fallen kollidiert und der Fall verlangsamt werden kann, effektiv viel zu stark gewichtet. Bei höheren Teilchenzahlen wirken weitere Erhöhungen diesem Effekt allerdings weniger stark entgegen.

Die eingangs erwähnte Bedeutung von Visualisierung kommt allerdings auch zum Tragen, wenn auf diese Art die perrinschen Messungen nachvollzogen werden sollen. Der Blick auf die Seite eines Behälters kommt seiner Sichtweise noch nicht sehr nahe, da die Teilchen ja weder verschwinden noch auftauchen. Das finale Programm beinhaltet also vor der Projektion die Einschränkung des sichtbaren auf eine schmale Schicht, entsprechend der Tiefenschärfe eines fiktiven Mikroskops, und wie erwartet ist es mühsam, ein Teilchen über längere Zeit zu beobachten. Andererseits ist es dennoch möglich, insbesondere unter Berücksichtigung der Frage der Korrelation unserer Simulations-Zeitschritte mit Sekunden oder anderen Zeiteinheiten, aber zweifelsohne erfordert es zeitgleich viele frühzeitig abgebrochene Messreihen. Jede Möglichkeit der Projektion solcher Teilchen über die ursprüngliche Schicht hinaus dürfte eine große Hilfe dargestellt haben, auch wenn sich keine weiteren Hinweise auf das Vorhandensein einer solchen finden lassen. Was nachvollzogen werden kann ist die Wichtigkeit von Genauigkeit und Geduld bei der Betrachtung von Phänomenen, die Mikroskopie und Statistik vereinen. Eine Simulation wie die unsere kann das illustrieren und auch Diskussionen um die Nachvollziehbarkeit von solchen (2-auf-25-Minuten-)Sprüngen in der Experimentierweise anregen, aber eine differenzierte Betrachtung muss sich zeitgleich noch viel mehr an den historischen Quellen orientieren. Da aber die Aussagekraft in Bezug auf dieses konkrete Problem definitiv in Zusammenhang mit der allgemeinen Aussagekraft der Simulation in Bezug auf die Brownsche Bewegung steht, bleibt es spannend, sich mit der Optimierung dieses Problems auseinanderzusetzen, oder um es in einem oft dem britischen Statistiker George Box zugeordneten Aphorismus auszudrücken:
'All models are wrong, but some are useful.' (vgl. Box 1976).


Abb. 14: Render: Beobachtung in einer Horizontalschicht

Ausbaumöglichkeiten

  • Die Höhenverteilung mehrerer Brownscher Teilchen messen, um besser erkennen zu können, wie nah an Perrins Experimenten die Simulation ist. Auch der eingangs erwähnte Vergleich mit der atmosphärischen Höhenformel steht noch aus und könnte sich aus dieser Untersuchung ergeben
  • Problem der Anfangspositionen beheben (aufgrund der zufälligen Koordinatenzuweisung können die Bälle ineinander erstellt werden)
  • Fehlerbehebung: In der V-Python Simulation kommt es hin und wieder vor, das sich zwei Brownsche Teilchen ineinander befinden und erst nach einiger Zeit lösen
  • Die Kollisionen verbessern, d.h. kollidierende Teilchen zu dem Punkt zurücksetzen, wo sich noch nicht ineinander befinden und erst dann ihre Richtung ändern
  • Programm 'physikalisch realistisch' gestalten, also Einheiten für die Masse der Bälle, die Zeitschritte etc. festlegen - der Aufwand hierfür erschien uns zunächst nicht verhältnismäßig, weshalb wir das Ziel nicht weiter verfolgt haben, es ließe sich hiermit jedoch eine genauere Aussage über Perrins Versuchsbedingungen treffen
  • Zusammenführung mit der Temperatur-Gruppe
  • völlig anderer Simulationsansatz und Vergleich der Ergebnisse, interessant wäre z.B. die Simulation der resultierenden Gesamtkräfte auf das Brownsche Teilchen, wobei die einzelnen Bälle eher stochastisch statt individuell betrachtet werden
  • Implementierung einer anderen Anfangs-Geschwindigkeitsverteilung der Teilchen (aktuell werden Anfangsgeschwindigkeiten normiert, was zur Folge hat, dass sich die Heterogenität der Maxwell-Boltzmann-Verteilung erst sehr langsam einstellt)
  • Das Programm allgemein optimieren, sodass mehr Bälle animiert werden können und es flüssiger läuft, z.B. durch effizientere Algorithmen zur Kollisionsdetektion (siehe z.B. sweep and prune)

Code als .zip

Quellen (Wiki)

[1] Bigg, Charlotte (2008) Evident Atoms- visuality in Jean Perrin‘s Brownian motion research, Studies in History and Philosophy of Science 38, S. 312-322
[2] Box, George E.P. (1976) Science and Statistics, Journal of the American Statistical Association 71, S. 791-799
[3] Nye, Mary Jo (1972) Molecular Reality- A Perspective on the Scientific work of Jean Perrin, London, S. 102
[4] Perrin, Jean (1910) DIE BROWN’SCHE BEWEGUNG UND DIE WAHRE EXISTENZ DER MOLEKÜLE, Paris, Steinkopf, übersetzt aus dem Französischen von Dr. J.Donau Graz

Protokolle

1) Dieses etwas chaotische Zusammenspiel aus verschiedenen Ansätzen ist auch bezeichnend für Phasen unseres Arbeitsprozesses.
2) per Wikimedia Commons, GNU Lizenz für freie Dokumentation
3) in der precompute-Variante sind diese streng genommen nicht neu berechnet, allerdings wird der abgefragte Index der Positionsmatrix verschoben
ws2223/projekt_hoehenformel.1681670644.txt.gz · Zuletzt geändert: 2023/04/16 20:44 von Jakob_Hoffmann