Diffusion/Octave-Tutorial

Aus Wikiversity
3D-Zerlegung in Würfel und Nachbarschaften (Bildquelle: Jörg Rapp - 2019)
Schadsstoffverteilung auf die Teilquader zum Zeitpunkt t=1 (Bildquelle: Jörg Rapp - 2019)
Schadsstoffverteilung auf die Teilquader zum Zeitpunkt t=2 (Bildquelle: Jörg Rapp - 2019)

Hier finden Sie Information zur Anwendung von Octave auf Diffusionprozesse. Zur Vorbereitung dieses Octave-Tutorials zur Diffusion wird empfohlen, die 2D-Diffusion mit Tabellenkalkulation näher zu betrachten, da die Umgebung in 2D mit den arithmetischen Operationen für die Verteilung und Bewegung von Objekten eine Vorbereitung für dieses Octave-Tutorial darstellen.

4D-Matrix[Bearbeiten]

Für die Speicherung der Verteilung der Schadstoffe in Zeitschritten werden verschiedene dreidimensionale Schadstoffmatrix benötigt. Die einzelnen Matrizen zum Zeitpunkt haben nicht-negative Einträge in den Komponenten mit , und . So entsteht ein Quader, der in Länge, Breite und Höhe in insgesamt Teilquader zerlegt ist. Insgesamt erhält man eine 4-dimensionale Datenstruktur, die 3 Raumkoordinaten und eine Zeitkoordinate mit enthält.

Eingabe einer 4D-Matrix in Octave[Bearbeiten]

Da man ggf. in Abhängigkeit von den Ausgangsdimensionen in Richtung mehrere Matrizen mit der gleichen Dimension erzeugen muss, sollte man die Anzahl der Quader in Richtung als Variablen definieren. Dies gilt analog für die Anzahl der Zeitschritte, die man zu Testzwecken am Anfang klein und überschaubar hält, um Fehler bei der Implementation schnell entdecken zu können. Läuft die Implementierung mit "kleinen" Quader kann man den Algorithmus auch komplexere Modelle mit längeren Rechenzeiten

  x_max = 5;
  y_max = 4;
  z_max = 3;
  t_max = 4;
  SchadstoffC = zeros(x_max,y_max,z_max,t_max);

Die Indizierung der Matrixkomponenten beginnt in Octave mit 1 (in vielen Programmiersprachen beginnt die Indizierung von Arrays mit 0). Natürlich kann man die Schadstoffmatrix in Octave auch mit S bezeichnen, dann wird komplexer Code allerdings ggf. schlechter nachvollziehbar. Eine sinnvolle Namensgebung wird bereits bei der Definition von Matrizen deutlich.

  SchadstoffC = zeros(5,4,3,4);

würde in Octave die gleiche 4D-Matrix erzeugen, wie der längere obige Code. Die Semantik der Dimensionen wird dadurch aber nicht deutlich. Wesentlich ist auch, dass sich im weiteren Verlauf der Implementation bestimmte Schleifen auf die Länge, Breite, Höhe und die Anzahl der Zeitschritte beziehen. Wenn die Ausgangsmatrix eine andere Länge, Breite, Höhe oder eine höhere Anzahl von Zeitschritten besitzt muss an vielen Stellen im Code nachjustiert werden. Dies kann man vermeiden, wenn man von Beginn an mit Variablennamen statt einer explizit abgebenen Größe der Matrix arbeitet.

Setzen einzelner Komponenten in der 4D-Matrix[Bearbeiten]

Einzelne Komponenten können in der 4D-Matrix mit dem entsprechenden Komponentenindex wie folgt angesprochen und gesetzt werden. Zum Zeitindex und dem Raumindex kann man die Matrixkomponente der 4D-Schadstoffmatrix in Octave wie folgt setzen:

  x0 = 4;
  y0 = 1;
  z0 = 3;
  t0 = 4;
  SchadstoffC(x0,y0,z0,t0) = 5.6;

Mit dem obigen Befehl hat nun die Matrix den Wert . Bitte beachten Sie, dass Nachkommastellen in der englischen Notation für reelle Zahlen mit einem Punkt angegeben werden. Für eine konsistente Schreibenweise werden auch hier die Nachkommastellen mit einem Dezimalpunkt getrennt.

Ausgabe einer einzelner Komponenten aus einer 4D-Matrix[Bearbeiten]

Den Inhalt einer Zelle kann man einer bestimmten Raum-Zeitkoordinate auch ausgeben lassen mit

  SchadstoffC(x0,y0,z0,t0)

Definition einer Funktion[Bearbeiten]

Die folgenden Funktion sollte mit Verteilungsmatrix zu einer Schadstoffverteilung zum Zeitpunkt ausrechnen und zu einem darauffolgenden Zeitschritt die neue Schadstoffverteilung ausgeben.

 function [mat3d] = schadstoff_diff(pmat3d,pverteilmat)
 
 endfunction

Der Aufruf der Funktion lautet wie folgt:

 verteilungsmatrix = ??
 ausgabe_t1 = schadstoff_diff(SchadstoffC,verteilungsmatrix)

Über eine For-Schleife sollen zu Zeitpunkt bis die neue Verteilungen ausgerechnet werden.

Siehe auch[Bearbeiten]