Matrix- und Tensor-Objekte höherer Stufe für numerische SimulationenArtikelentwürfe

Vorläufige Artikel
Anonymous
 Matrix- und Tensor-Objekte höherer Stufe für numerische Simulationen

Post by Anonymous »

Die Entwicklung der objektorientierten Analyse und Modellierung hat bedeutenden Einfluss auf die Anwendungen der kooperativen Planung und Konstruktion des Ingenieurwesens
bis hin zur gegenwärtigen Produkt- und Bauwerkinformationsmodellierung (BIM) Dabei spielen speziell numerische Modelle für die Simulation von physikalischen Vorgängen in der Festkörper-
und Strömungsmechanik eine entscheidende Rolle für das Verständnis komplexer Wechselwirkungen in Natur und Technik. Im Allgemeinen werden die physikalischen Grundlagen mit den Methoden der Tensoranalysis, des Matrixkalküls und der numerischen Programmstrukturen in zuverlässige Algorithmen unterschiedlicher Approximationsmethoden, wie z. B. die Differenzen- oder Finite-Elemente-Methoden
Dabei sind Algorithmen in objektorientierten Strukturen von hoher Relevanz, weil durch die zugrunde liegenden Paradigmen der Kapselung und der Vererbung die Transparenz der Formulierung und die Zuverlässigkeit der Methoden abgesichert und die Kommunikation mit den Objekten eindeutig definiert wird. So eröffnet vor allem die Objektorientierung neue Möglichkeiten, die theoretischen Grundlagen der Tensoranalysis mit den numerischen Vorteilen des Matrixkalküls und den Algorithmen der Rechenprogramme zu einer methodischen Einheit zu verknüpfen.

Denn die klassische Matrizenrechnung : C_{ikl} = A_{ikl}+ B_{ikl} bzw. '''C''' = '''A''' + '''B'''
oder
: f^{ilk} = k^{isl} * {v^k}_s bzw. '''f''' ≠ '''k''' * '''v'''^T
und bei dem die symbolische Matrixnotation leider versagt.
Durch das objektorientierte Klassenkonzept hingegen werden geeignete Strukturen für neue Tensor- und Matrixklassen geschaffen, die es ermöglichen, indexbasierte Matrixoperationen für mehrdimensionale Matrizen zu definieren, um die Matrizenrechnung auf Objekte höhere Stufe zu verallgemeinern und die Nomenklatur von Tensoren, Matrizen und Feldern zu vereinheitlichen. Dabei stärkt auch das Überladen der arithmetischen und funktionalen Standardoperatoren für die Matrixobjekte die Benutzerfreundlichkeit der Schnittstellen in ganz erheblichem Maße.

Der vorliegende Beitrag verdeutlicht dieses bewährte Konzept in den nachfolgenden Kapiteln mittels überschaubarer Beispiele der linearen Algebra anhand von übersichtlich gegliederten Prototypen der Programmstrukturen. Damit werden die Abläufe in transparenter Weise nachvollziehbar dargestellt und numerisch verifiziert. Die Methoden der objektorientierten Programmierung sind in
== Matrixobjekte und überladene Operatoren ==
Es wird im folgenden davon ausgegangen, dass '''''Matrizen 2. Stufe''''' ''spaltenweise'' gespeichert werden, wie das in naturwissenschaftlich-technischen Anwendungen und algorithmischen Programmiersprachen - wie FORTRAN - üblich ist.

:
\mathbf{M} =
\left(
\begin{array}{ccc}
a_{0,0} & a_{1,1} & ... & a_{1,N_{k-1 \\
... \\
... \\
... \\
... \\
a_{N_{i-1},0} & a_{N_{i-1},1} & ... & a_{N_{i-1},N_{k-1
\end{array}
\right)

= M_{ik} mit den Dimensionen (N_{i}\times N_{k}).

Dabei läuft der erste Index i über die Zeilen und der zweite Index k über die Spalten der Matrix M_{ik}.

Die ''interne Speicherung'' in Matrixobjekten erfolgt durch Zuweisung der Matrixelemente in sequentieller Reihenfolge zu einem eindimensionalen Vektorfeld:

:
\mathbf{V} :=
\left(
\begin{array}{ccc}
a_{0,0} & a_{1,0} & ... & a_{N_{i-1},0} & a_{0,1} & a_{1,1} & ... & a_{N_{i-1},1} &
... & ... &
a_{0,N_{i-1 & a_{1,N_{i-1 & ... & a_{N_{i-1},N_{k-1
\end{array}
\right)


:
=
\left(
\begin{array}{ccc}
v_{0} & v_{1} & ... & v_{N_{i-1 & ... & ... & v_{N_{i}*N_{k}-1}
\end{array}
\right)
= V_{z} mit der Dimension N_{z} = N_{i} * N_{k} ,

wie es auch intern auf von Neumann-Rechnerarchitekturen geschieht. .

Die entsprechenden ''bijectiven Abbildungen'' erfolgen durch die Vorschriften für

die Abbildung


V_{z} := M\underbrace{_{ik_z
durch die Zuordnung z = k * N_{i} + i
,

und die Rückabbildung


M\underbrace{_{ik_z := V_{z}
durch die Zuordnungen k = \text{Entier}(z/N_{i}) und i = z - k * N_{i} .

Der ''Deskriptor'' des Objektes für die Darstellung der Matrix ist offenbar unabhängig von der internen sequenziellen Speicherung der Elemente und steuert lediglich nach außen die spezielle Darstellung der Matrixform.

Reduziert man die Matrix \mathbf{M} auf eine einzelne Zeile, so entsteht ein Zeilenvektor M_{0k} , entsprechendes gilt für einen Spaltenvektor M_{i0} . Daraus erkennt man, dass es bei der ''Indexschreibweise'' möglich ist, in die Nomenklatur ''0-Indizes'' einzufügen, ohne dadurch die Speicherung von Vektoren oder Matrizen zu ändern.

Dies gilt auch für den Vektor
V_{z} := V_{0z} := V_{z0}
wie auch für beliebige Matrizen:
M_{ik} := M_{0ik} := M_{i0k} := M_{ik0} .

Über den '''''Konstruktor''''' M(N_i,N_k,N_l,N_m) wird in objektorientierter Weise die mathematische Grundform auf '''''Matrizen höherer Stufe''''' erweitert und durch die Wahl der Dimensionen festgelegt. Zulässig sind zunächst bis zu vier Dimensionen, die für ingenieurmäßige Anwendungen in der Regel ausreichen, zumal auch mehrere benachbarte Indizes mittels der obigen Abbildungen zusammengefasst werden können, wovon im Programmcode Gebrauch gemacht wird.

Anhand des folgenden C++ Programmbeispiels wird zuerst erläutert, wie die neuen '''''Matrizenklassen''''' semantisch aufgebaut sind, um entsprechende Matrixobjekte (''Instanzen'') zu erzeugen und diese mit einer ''indexbasierten Arithmetik'' mittels ''überladener Standardoperatoren'' syntaktisch zu verarbeiten. Mit den Konstruktoren der Klassen '''''Vektor, MATRIX, delta_MATRIX, e_MATRIX''''' können ''statische'' oder ''dynamische'' Objekte mit Elementen vom Typ ''double'' erzeugt werden. Über ein Feld (array) in Notation der Programmiersprache C ist es auch möglich, die Vektor- und Matrixelemente mit Zahlenwerten vorzubelegen. Die Ein-/Ausgabe erfolgt über die überladenen Standardoperatoren ''>>'' bzw. ''

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post