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.

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)

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