%% This file can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN archives %% in directory macros/latex/base/lppl.txt. %% \title{\texttt{gauss.sty} - Visualisierung des Gaußschen Eliminationsverfahrens} \author{Herbert Voß} \maketitle \begin{abstract} Die Zahl der vorhanden \LaTeX{}-Pakete ist sicherlich endlich, wenn man auch manchmal den gegenteiligen Eindruck hat. Neben den mehr oder weniger bekannten Paketen gibt es eine erhebliche Anzahl, die einem großen Anwenderkreis deswegen nicht bekannt sind, weil deren Anwendung häufig sehr speziell ist. Dazu gehört sicherlich das Paket \texttt{gauss.sty}, welches nur sehr spezielle Wünsche erfüllt, die im folgenden an Beispielen beschrieben werden. \end{abstract} \section{Einführung} Das Gaußsche Eliminationsverfahren zur Lösung linearer Gleichungssysteme kann als Standardanwendung innerhalb der Naturwissenschaften bezeichnet werden. \TeX{} ist dafür bekannt, dass es insbesondere den mathematischen Zeichensatz hervorragend beherrscht. Dabei kann es in der Darstellung trotzdem zu erheblichen Problemen kommen, wenn zusätzliche Erläuterungen zu den einzelnen Rechenschritten erforderlich sind. Für diesen Fall bietet das Paket \texttt{gauss.sty} eine spezielle Unterstützung. Das Paket kann von jedem beliebigen CTAN-Server heruntergeladen werden (\url{CTAN:/latex/contrib/other/gauss/gauss.sty}), beispielsweise von \texttt{ftp.dante.de}. Eine entsprechende ausführliche Dokumentation mit einem zusätzlichen Beispiel im Quellcode findet sich ebenfalls dort. Das Paket wird in der üblichen Art und Weise in einen bestehenden \TeX{}-Baum eingebunden. \texttt{gauss.sty} verwendet zum Erstellen der diversen Linienzüge ausschließlich die picture-Umgebung, sodass eine PDF-Ausgabe ohne weiteres möglich ist. \section{\texttt{gmatrix}-Umgebung} In Analogie zum \texttt{amsmath.sty}-Paket wird eine Matrixumgebung zur Verfügung gestellt, was an sich nichts besonderes ist, wenn man einmal davon absieht, dass standardmäßig keine Klammerung vorgesehen ist. Diese kann der Einfachheit halber über einen optionalen Parameter gesetzt werden, der letztlich bestimmt, welche der Matrixumgebungen von amsmath benutzt wird: \addtolength{\myVSpace}{0.9cm} \begin{center}\noindent\begin{tabularx}{1.0\linewidth}{c|X} Option& Bedeutung\\ \hline \texttt{\xstrut} & \texttt{\textbackslash{}begin\{gmatrix\}} $\rightarrow $ \texttt{\textbackslash{}begin\{matrix\}} $\rightarrow $ $\begin{gmatrix} 1 & 2\\ 3 & 4 \end{gmatrix}$\\ \texttt{\xstrut} v& \texttt{\textbackslash{}begin\{gmatrix\}{[}v{]}} $\rightarrow $ \texttt{\textbackslash{}begin\{vmatrix\}} $\rightarrow $ $\begin{gmatrix}[v] 1 & 2\\ 3 & 4 \end{gmatrix}$\\ \texttt{\xstrut}V& \texttt{\textbackslash{}begin\{gmatrix\}{[}V{]}} $\rightarrow $ \texttt{\textbackslash{}begin\{Vmatrix\}} $\rightarrow $ $\begin{gmatrix}[V] 1 & 2\\ 3 & 4 \end{gmatrix}$\\ \texttt{\xstrut}p& \texttt{\textbackslash{}begin\{gmatrix\}{[}p{]}} $\rightarrow $ \texttt{\textbackslash{}begin\{pmatrix\}} $\rightarrow $ $\begin{gmatrix}[p] 1 & 2\\ 3 & 4 \end{gmatrix}$\\ \texttt{\xstrut}b& \texttt{\textbackslash{}begin\{gmatrix\}{[}b{]}} $\rightarrow $ \texttt{\textbackslash{}begin\{bmatrix\}} $\rightarrow $ $\begin{gmatrix}[b] 1 & 2\\ 3 & 4 \end{gmatrix}$\\ \texttt{\xstrut}B& \texttt{\textbackslash{}begin\{gmatrix\}{[}B{]}} $\rightarrow $ \texttt{\textbackslash{}begin\{Bmatrix\}} $\rightarrow $ $\begin{gmatrix}[B] 1 & 2\\ 3 & 4 \end{gmatrix}$\\ \end{tabularx}\end{center} Ohne Parameter ist es die einfache Matrixumgebung von \texttt{amsmath.sty}. Daneben wird noch der Befehl \texttt{\textbackslash{}newmatrix} angeboten, der es ermöglicht, weitere Umgebungen mit beliebigen Klammern zu definieren, beispielsweise: \begin{center}\texttt{\textbackslash{}newmatrix\{{]}\}\{{[}\}\{q\}} $\rightarrow $ \texttt{\textbackslash{}begin\{gmatrix\}{[}q{]}} $\rightarrow $ \newmatrix{]}{[}{q} $\begin{gmatrix}[q] 1 & 2\\ 3 & 4 \end{gmatrix}$\end{center} Die ersten beiden Parameter geben die Klammerung und der dritte das Optionskürzel an. Es ist offensichtlich, dass als Kürzel \texttt{v, V, p, b, B} wenig Sinn machen und \texttt{g} nicht zur Verfügung steht. \section{Zeilen- und Spaltenmarkierungen} Die Zählung der Zeilen und Spalten beginnt in der linken oberen Ecke jeweils bei 0, womit der unteren Ecke dann (Zeilenanzahl-1, Spaltenanzahl-1) zugeordnet wird. Zeilenmarkierungen werden durch den Befehl \texttt{\textbackslash{}rowops} und Spaltenoperationen durch \texttt{\textbackslash{}colops} eingeleitet. Für die speziellen Markierungen (Operationen) stehen die folgenden drei Befehle zur Verfügung \noindent\begin{tabularx}{1.0\linewidth}{X|X} Syntax& Bedeutung\\ \hline \texttt{\textbackslash{}add{[}{]}\{\}\{\}}& Gibt eine Additionsmarkierung für entsprechende Zeilen/Spalten \texttt{} aus\\ \texttt{\textbackslash{}mult\{\}\{\}}& Gibt eine Multiplikationsmarkierung für entsprechende Zeile/Spalte \texttt{} aus\\ \texttt{\textbackslash{}swap\{\}\{\}}& Markiert zwei Zeilen/Spalten \texttt{} durch einen Doppelpfeil\\ \end{tabularx} \subsection{Beispiele} In einem linearen Gleichungssystem sollen zwei linear abhängige Zeilen und Spalten in der Koeffizientenmatrix markiert werden: \begin{minipage}[c]{0.45\linewidth}% $\begin{gmatrix}[b] 1 & 2 & -3\\ 0.1 & 0.2 & -1\\ -0.5 &-1 & \frac{3}{2} \rowops \swap{0}{2} \colops \swap{0}{1} \end{gmatrix}$ \end{minipage}% \hfill{}\begin{minipage}[c]{0.40\linewidth}% {\setstretch{0.9}\footnotesize \begin{verbatim} $\begin{gmatrix}[b] 1 & 2 & -3\\ 0.1 & 0.2 & -1\\ -0.5 &-1 & \frac{3}{2} \rowops \swap{0}{2} \colops \swap{0}{1} \end{gmatrix}$ \end{verbatim}} \end{minipage}% Prinzipiell ist der \texttt{\textbackslash{}swap}-Befehl vorgesehen um zwei Zeilen/Spalten zu markieren, die in ihrer Anordnung vertauscht werden sollen. Würde man dieses Gleichungssystem in der üblichen Art und Weise, beispielsweise mit Hilfe der Additionsmethode, in eine Dreiecksform bringen wollen, so bietet sich das Gaußsche Eliminationsverfahren an. Für die ersten beiden Durchgänge ergibt sich dann: \begin{minipage}[c]{0.45\linewidth}% $\begin{gmatrix}[b] 1 & 2 & -3\\ 0.1 & 0.2 & -1\\ -0.5 &-1 & \frac{3}{2} \rowops \mult{0}{\cdot(-0.1)} \add{0}{1} \swap{1}{2} \end{gmatrix}$\\[2ex] $\begin{gmatrix}[b] 1 & 2 & -3\\ -0.5 &-1 & \frac{3}{2}\\ 0 & 0 & -0.7 \rowops \mult{0}{\cdot0.5} \add{0}{1} \end{gmatrix}$ \end{minipage}% \hfill{}\begin{minipage}[c]{0.40\linewidth}% {\setstretch{0.9}\footnotesize \begin{verbatim} $\begin{gmatrix}[b] 1 & 2 & -3\\ 0.1 & 0.2 & -1\\ -0.5 &-1 & \frac{3}{2} \rowops \mult{0}{\cdot(-0.1)} \add{0}{1} \swap{1}{2} \end{gmatrix}$\\[2ex] ... \end{verbatim}} \end{minipage}% Eine komplette Anwendung zeigt das folgende Beispiel, welches das lineare Gleichungssystem $\vec{A}\cdot \vec{x}=\vec{b}$ löst: \begin{equation} \begin{gmatrix}[b] 1 &-2 & 1 & 2\\ 2 & 3 &-2 & 3\\ 4 &-1 & 3 &-1\\ 3 & 2 &-4 & 5 \end{gmatrix}\cdot% \begin{gmatrix}[b] x\\ y\\ z\\ t \end{gmatrix}=% \begin{gmatrix}[b] 8\\ 14\\ 7\\ 5 \end{gmatrix} \end{equation} \renewcommand\rowmultlabel[1]{% |\,\cdot#1% } \[ \begin{gmatrix} 1 &-2 & 1 & 2 & & 8 \\ % Zeile 0 2 & 3 &-2 & 3 & & 14\\ % 1 4 &-1 & 3 &-1 & & 7 \\ % 2 3 & 2 &-4 & 5 & & 5 \\ % 3 \\ 1 &-2 & 1 & 2 & & 8 \\ % 5 0 & 7 &-4 &-1 & &-2 \\ % 6 0 & 7 &-1 &-9 & &-25\\ % 7 0 & 8 &-7 &-1 & &-9 \\ % 8 \\ 1 &-2 & 1 & 2 & & 8 \\ % 10 0 & 7 &-4 &-1 & &-2 \\ % 11 0 & 0 & 3 &-8 & &-23\\ % 12 0 & 0 &-17& 1 & &-47\\ % 13 \\ 1 &-2 & 1 & 2 & & 8 \\ % 15 0 & 7 &-4 &-1 & &-2 \\ % 16 0 & 0 & 3 &-8 & &-23\\ % 17 0 & 0 & 0 &-\frac{133}{3}& &\frac{-532}{3} % \rowops \mult{0}{(-2)}\add{0}{1} % 1. Matrix \mult{0}{(-4)}\add{0}{2} \mult{0}{(-3)}\add{0}{3} % \mult{6}{(-1)}\add{6}{7} % 2. Matrix \mult{6}{(-\frac{8}{7})}\add{6}{8} % \mult{12}{\frac{17}{3}}\add{12}{13} % 3. Matrix \end{gmatrix} \] Die vertikale Ausrichtung ist dabei nicht ganz unproblematisch, denn einerseits muss alles linksbündig ausgerichtet sein und andererseits haben die einzelnen Zellen eine unterschiedliche horizontale Breite. In solchen Fällen erstellt man am besten nicht vier verschiedene Matrizen, sondern setzt alles in eine einzige ,,gmatrix{}``-Umgebung und markiert sich dabei einfach die einzelnen Zeilen: {%\setstretch{0.9} \small \begin{verbatim} \begin{gmatrix} 1 &-2 & 1 & 2 & & 8 \\ % Zeile 0 2 & 3 &-2 & 3 & & 14\\ % Zeile 1 4 &-1 & 3 &-1 & & 7 \\ % Zeile 2 3 & 2 &-4 & 5 & & 5 \\ % Zeile 3 \\ 1 &-2 & 1 & 2 & & 8 \\ % Zeile 5 0 & 7 &-4 &-1 & &-2 \\ % Zeile 6 0 & 7 &-1 &-9 & &-25\\ % Zeile 7 0 & 8 &-7 &-1 & &-9 \\ % Zeile 8 \\ 1 &-2 & 1 & 2 & & 8 \\ % Zeile 10 0 & 7 &-4 &-1 & &-2 \\ % Zeile 11 0 & 0 & 3 &-8 & &-23\\ % Zeile 12 0 & 0 &-17& 1 & &-47\\ % Zeile 13 \\ 1 &-2 & 1 & 2 & & 8 \\ % Zeile 15 0 & 7 &-4 &-1 & &-2 \\ % Zeile 16 0 & 0 & 3 &-8 & &-23\\ % Zeile 17 0 & 0 & 0 &-\frac{133}{3}& &\frac{-532}{3} % \rowops \mult{0}{(-2)}\add{0}{1} % 1. Matrix \mult{0}{(-4)}\add{0}{2} \mult{0}{(-3)}\add{0}{3} % \mult{6}{(-1)}\add{6}{7} % 2. Matrix \mult{6}{(-\frac{8}{7})}\add{6}{8} % \mult{12}{\frac{17}{3}}\add{12}{13} % 3. Matrix \end{gmatrix} \end{verbatim}} Schwieriger wird es, wenn zusätzlich eine Klammerung und Nummerierung der einzelnen Teilmatrizen gewünscht wird. In diesem Fall kann auf die bekannte \texttt{tabular}-Umgebung zurückgegriffen werden, wobei nur eine Spalte definiert wird. \begin{tabular}{p{\columnwidth}} \begin{equation} \begin{gmatrix}[p] 1 &-2 & 1 & 2 \\ % Zeile 0 2 & 3 &-2 & 3 \\ % 1 4 &-1 & 3 &-1 \\ % 2 3 & 2 &-4 & 5 % 3 \rowops \mult{0}{(-2)}\add{0}{1} \mult{0}{(-4)}\add{0}{2} \mult{0}{(-3)}\add{0}{3} \end{gmatrix} \end{equation} \\ % Ende 1. Matrix \begin{equation} \begin{gmatrix}[p] 1 &-2 & 1 & 2 \\ % Zeile 0 0 & 7 &-4 &-1 \\ % 1 0 & 7 &-1 &-9 \\ % 2 0 & 8 &-7 &-1 % 3 \rowops \mult{1}{(-1)}\add{1}{2} \mult{1}{(-\frac{8}{7})}\add{1}{3} \end{gmatrix} \end{equation} \end{tabular} {%\setstretch{0.9} \small \begin{verbatim} \begin{tabular}{p{\columnwidth}} \begin{equation} \begin{gmatrix}[p] 1 &-2 & 1 & 2 \\ % Zeile 0 2 & 3 &-2 & 3 \\ % 1 4 &-1 & 3 &-1 \\ % 2 3 & 2 &-4 & 5 % 3 \rowops \mult{0}{(-2)}\add{0}{1} \mult{0}{(-4)}\add{0}{2} \mult{0}{(-3)}\add{0}{3} \end{gmatrix} \end{equation} \\ % Ende 1. Matrix \begin{equation} \begin{gmatrix}[p] 1 &-2 & 1 & 2 \\ % Zeile 0 0 & 7 &-4 &-1 \\ % 1 0 & 7 &-1 &-9 \\ % 2 0 & 8 &-7 &-1 % 3 \rowops \mult{1}{(-1)}\add{1}{2} \mult{1}{(-\frac{8}{7})}\add{1}{3} \end{gmatrix} \end{equation} \end{tabular} \end{verbatim}} Insbesondere die \texttt{mult}-Funktion kann auch für normale Gleichungsumformungen benutzt werden, wenn man diese innerhalb der \texttt{gmatrix}-Umgebung beschreibt. \renewcommand\rowmultlabel[1]{\left|\,#1\right.} \begin{equation}\label{schwingkreis} \begin{gmatrix} \displaystyle% \frac{1}{C}\int i\cdot dt+L\cdot\frac{di}{dt}+R\cdot i\hfill & = & 0\\ \displaystyle% \frac{1}{C}\cdot i+L\cdot\frac{d^2i}{dt^2}+R\cdot\frac{di}{dt}\hfill & = &0\\ \displaystyle% \frac{d^2i}{dt^2}+\frac{R}{L}\cdot\frac{di}{dt}+\frac{1}{LC}\cdot i\hfill & = & 0\\ \\ \displaystyle% \ddot{i}+\delta\dot{i}+\omega_0^2i\hfill & = &0 \rowops \mult{0}{\mbox{Differentiation}} \mult{1}{:L\mbox{ und sortieren}} \mult{2}{\displaystyle\frac{R}{L}=\delta;\ \frac{1}{LC}=\omega_0^2} \end{gmatrix} \end{equation} Gl.\ref{schwingkreis} ergibt sich durch folgende Befehlssequenzen, wobei der erste Befehl im folgenden Abschnitt beschrieben wird: {%\setstretch{0.9} \footnotesize \begin{verbatim} \renewcommand\rowmultlabel[1]{\left|\,#1\right.} \begin{equation} \displaystyle% \frac{1}{C}\int i\cdot dt+L\cdot\frac{di}{dt}+R\cdot i\hfill & = & 0\\ [ ... ] \displaystyle% \ddot{i}+\delta\dot{i}+\omega_0^2i\hfill & = &0 \rowops \mult{0}{\mbox{Differentiation}} \mult{1}{:L\mbox{ und sortieren}} \mult{2}{\displaystyle\frac{R}{L}=\delta;\ \frac{1}{LC}=\omega_0^2} \end{gmatrix} \end{equation} \end{verbatim}} \section{Weitere Funktionen} Das Paket \texttt{gauss} gestattet die Neudefinition der Label für die Additions- bzw. Multiplikationsmarkierungen, sodass beispielsweise ein Multiplikationspunkt standardmäßig gesetzt werden kann. \begin{verbatim} \renewcommand{\rowmultlabel}[1]{|\,\cdot#1} \end{verbatim} Für die Zeilen und Spalten gibt es dabei unterschiedliche Label, die in der üblichen Weise überschrieben werden können. \begin{verbatim} \rowaddlabel \rowmultlabel \coladdlabel \colmultlabel \end{verbatim} \section{Hinweise} Bei der Anwendung der gmatrix-Umgebung ist im wesentlichen nur zu beachten, dass die letzte Zeile keinen \texttt{\textbackslash{}\textbackslash{}}-Befehl aufweisen darf. Die letzte Zeile wird auch für die Berechnung der einzelnen Spaltenbreiten herangezogen, woraus folgt, dass alle Spalten vorhanden sein müssen. Die jeweilige Höhe einer Zeile orientiert sich nur an der Höhe der einzelnen Spalten, nicht jedoch an der Höhe der Label. Es ist grundsätzlich darauf zu achten, dass bei gleichzeitiger Verwendung von \texttt{amsmath.sty} dieses vor \texttt{gauss.sty} geladen wird. \address{Herbert}{Voß}{Wasgenstr. 21\\14129 Berlin\\voss@perce.de}