<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="pmathml.xsl"?>
<!DOCTYPE html [
  <!ENTITY rightarrow "&#8594;">
  <!ENTITY Rightarrow "&#8658;">
  <!ENTITY Leftrightarrow "&#8660;">
  <!ENTITY Element "&#8712;">
  <!ENTITY Exists "&#8707;">
  <!ENTITY Sum "&#8721;">
  <!ENTITY setminus "&#8726;">
  <!ENTITY VerticalBar "&#8739;">
  <!ENTITY approx "&#8776;">
  <!ENTITY leq "&#8804;">
  <!ENTITY geq "&#8805;">
  <!ENTITY prec "&#8826;">
  <!ENTITY succ "&#8827;">
  <!ENTITY succeq "&#8829;">
  <!ENTITY preceq "&#8828;">
  <!ENTITY asymp "&#8781;">
  <!ENTITY subseteq "&#8838;">
  <!ENTITY Intersection "&#8898;">
  <!ENTITY Kscr "&#61242;">
  <!ENTITY Ropf "&#8477;">
  <!ENTITY Nopf "&#8469;">
  <!ENTITY Zopf "&#8484;">
  <!ENTITY pm "&#177;">
  <!ENTITY epsi "&#949;">
  <!ENTITY Hscr "&#8459;">
  <!ENTITY Lscr "&#8466;">
  <!ENTITY % htmlDTD PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
  %htmlDTD;
]>

<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Automatische Berechnung von Grenzwerten und Implementierung in Mathematica</title><style type="text/css">
     .mathcell {
       padding-left:2%;
     }
     .mathlabel {
       width:4em;
       float:left;
       padding-top:3px;
       color: #454F99;
       font-size: 10px;
       font-family: Helvetica;
     }
     .mathinput {
       position:relative;
       width:90%;
       margin-top:5px;
       border-width:1px 1px 0px 1px;
       border-style:solid;
       padding:0.5em;
       font-weight: bold;
       font-size: 14px;
       left:4em;
       background-color:#dddddd;
     }
     .mathoutput {
       position:relative;
       width:90%;
       margin-bottom:5px;
       border-width:0px 1px 1px 1px;
       border-style:solid;
       padding:0.5em;
       font-size: 14px;
       left:4em;
       background-color:#dddddd;
     }
     .mathprint {
       position:relative;
       width:90%;
       border-width:0px 1px 0px 1px;
       border-style:solid;
       padding:0.5em;
       font-size: 14px;
       left:4em;
       background-color:#cccccc;
     }
     .mathmessage {
       position:relative;
       width:90%;
       border-width:0px 1px 0px 1px;
       border-style:solid;
       padding:0.5em;
       font-size: 14px;
       left:4em;
       background-color:#ffffff;
     }
     .mathcellblock {
       margin-top:1em;
       margin-bottom:1em;       
     }
     .mmldisplay {
       text-align:center;
       margin-top:0.5em;
       margin-bottom:0.5em;       
     }
   </style></head><body>

<a href="Einfuehrung.xml">Zurück</a> - <a href="Inhalt.xml">Inhalt</a> - <a href="index.html">Übersicht</a> - <a href="Grundlagen.xml">Vorwärts</a><br />


<a name="UeberblickUeberDenAlgorithmus" /><h2>2 Überblick über den Algorithmus</h2>

Der Kern des MrvLimit-Algorithmus ist die Potenzreihenentwicklung. Da die Potenzreihenentwicklung
jedoch nur mit polynomiellem Wachstum zuverlässig umgehen kann, muss die Funktion so angepasst
werden, dass sie aus Sicht der Potenzreihenentwicklung nur polynomiell wächst. Langsameres
Wachstum wird dazu vorübergehend ausgeblendet.<br /><br />

Bevor wir uns in <a href="Grundlagen.xml#MathematischeGrundlagen">Kapitel 3</a> mit den mathematischen Details intensiver beschäftigen, 
werfen wir aber schon mal einen Blick auf die grobe Strategie des MrvLimit-Algorithmus für eine 
Funktion <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>f</mi>
<mo>(</mo><mi>x</mi><mo>)</mo>
</math>.

<ol><li>Transformation der allgemeinen Grenzwertaufgabe <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msub><mo lspace="thinmathspace" rspace="thinmathspace">lim</mo> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><msub><mi>x</mi> <mn>0</mn></msub></mrow></msub>
<mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo>
</math> in
eine Grenzwertaufgabe der Form <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msub><mo lspace="thinmathspace" rspace="thinmathspace">lim</mo> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn></mrow></msub>
<mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo>
</math>.
</li><li>Isolieren desjenigen Teilausdrucks der Funktion, der das größte asymptotische
Wachstumsverhalten besitzt. 
</li><li>Bestimmen aller Teilausdrücke, die das gleiche Wachstumsverhalten besitzen wie der
ausgewählte Teilausdruck.
</li><li>Darstellen all dieser Teilausdrücke mit Hilfe einer einzelnen Variable ω, die das
größte Wachstumsverhalten repräsentiert. Alle verbleibenden Terme müssen signifikant schwächeres Wachstum haben.
</li><li>Ermitteln der Potenzreihe in ω und Ermittlung des führenden Terms der Potenzreihe.
Dabei kann <i>x</i> als konstant betrachtet werden.
</li><li>Falls erforderlich, weitere Analyse des führenden Terms durch rekursive Grenzwertberechnungen.
</li><li>Abschließende Bestimmung des Grenzwerts durch Analyse des führenden Terms.
</li></ol>

Dieser Überblick ist natürlich sehr knapp ausgefallen. Deswegen werden im Folgenden ein paar Themen 
noch detaillierter besprochen.

<a name="Transformation" /><h3>2.1 Transformation</h3>
Um den Algorithmus überschaubar zu gestalten, werden grundsätzlich nur Grenzwerte für
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>x</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn>
</math> betrachtet. Andere Grenzwerte lassen sich leicht
durch Transformation ermitteln:
<div class="mmldisplay"><math xmlns='http://www.w3.org/1998/Math/MathML' mode='display'>
<mrow><mtable columnalign="left left "><mtr><mtd><munder><mo lspace="thinmathspace" rspace="thinmathspace">lim</mo> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><msup><mrow><msub><mi>x</mi> <mn>0</mn></msub>
</mrow> <mo>+</mo></msup></mrow></munder>
<mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mtd> <mtd><mo>=</mo>
<munder><mo lspace="thinmathspace" rspace="thinmathspace">lim</mo> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn></mrow></munder><mi>f</mi><mrow><mo>(</mo>
<msub><mi>x</mi> <mn>0</mn></msub><mo>+</mo><mfrac><mrow><mn>1</mn>
</mrow><mrow><mi>x</mi>
</mrow></mfrac> <mo>)</mo></mrow></mtd></mtr> <mtr><mtd><munder><mo lspace="thinmathspace" rspace="thinmathspace">lim</mo> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><msup><mrow><msub><mi>x</mi> <mn>0</mn></msub>
</mrow> <mo>-</mo></msup></mrow></munder>
<mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mtd> <mtd><mo>=</mo>
<munder><mo lspace="thinmathspace" rspace="thinmathspace">lim</mo> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn></mrow></munder><mi>f</mi><mrow><mo>(</mo>
<msub><mi>x</mi> <mn>0</mn></msub><mo>-</mo><mfrac><mrow><mn>1</mn>
</mrow><mrow><mi>x</mi>
</mrow></mfrac> <mo>)</mo></mrow></mtd></mtr> <mtr><mtd><munder><mo lspace="thinmathspace" rspace="thinmathspace">lim</mo> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><mo lspace="thinthinmathspace" rspace="0em">-</mo><mn>&infin;</mn></mrow></munder>
<mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mtd> <mtd><mo>=</mo>
<munder><mo lspace="thinmathspace" rspace="thinmathspace">lim</mo> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn></mrow></munder><mi>f</mi><mrow><mo>(</mo>
<mo lspace="thinthinmathspace" rspace="0em">-</mo><mi>x</mi> <mo>)</mo></mrow></mtd></mtr></mtable></mrow>

</math></div>
Beidseitige Grenzwerte löst man, indem der Grenzwert aus beiden Richtungen separat
ermittelt und verglichen wird.


<a name="Wachstumsklassen1" /><h3>2.2 Wachstumsklassen</h3>
Wie in der Computeralgebra üblich, gehen wir davon aus, dass unsere zu analysierende
Funktion explizit in Form eines Funktionsausdrucks in Baumstruktur vorliegt. Vorläufig begrenzen wir
auch die Funktionsvielfalt auf Konstanten, die Variable x sowie die beliebige Anwendung der
Grundrechenoperationen Addition, Subtraktion, Multiplikation, Division, Potenzfunktion,
Exponentialfunktion und Logarithmus. Später wird dieses Grundgerüst um weitere Funktionen ergänzt,
die sich in der Praxis als leicht behandelbar erweisen.<br /><br />

Liegt eine Funktion als Baumstruktur vor, ist es einfach, sämtliche Teilausdrücke zu
betrachten. Diese Teilausdrücke müssen dann anhand ihrer asymptotischen Wachstumseigenschaften 
geordnet werden. Wie genau
das erfolgt, wird <a href="Grundlagen.xml#MathematischeGrundlagen">Kapitel 3</a> zeigen. Es sei auch schon mal darauf hingewiesen, dass im
Folgenden oft auch gegen Null strebendes Grenzverhalten der Einfachheit halber als Wachstum
bezeichnet wird. Für unsere Fälle hat also sowohl <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msup><mi>e</mi> <mi>x</mi></msup>

</math> als auch <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msup><mi>e</mi> <mrow><mo lspace="thinthinmathspace" rspace="0em">-</mo>
<mi>x</mi></mrow></msup>

</math> für
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>x</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn>
</math> exponentielles Wachstum, im zweiten Fall jedoch exponentielles Wachstum
gegen 0.<br /><br />

Ist der am stärksten wachsenden Teilausdruck
gefunden, kann er als ω zu einem Symbol substituiert werden, für die spätere
Potenzreihenentwicklung. Vorher müssen aber alle Terme, die einen relevanten Beitrag zu dieser
Potenzreihe liefern können, ebenfalls mittels ω dargestellt werden. Terme, deren Wachstum
kleiner als jedes <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msup><mi>&omega;</mi> <mi>n</mi></msup>
<mspace width="verythickmathspace"/><mo>(</mo><mi>n</mi><mo>&ne;</mo><mn>0</mn><mo>)</mo>
</math> sind, leisten keinen Beitrag zur Potenzreihe
und werden vorerst als konstant betrachtet.


<a name="BedingungenAnDasWachstum" /><h3>2.3 Bedingungen an das Wachstum</h3>
Sollte ω langsamer als exponentiell wachsen, kann es im Algorithmus zu Problemen kommen, die
zu unendlichen Rekursionen führen. Der Algorithmus gestaltet sich dagegen erheblich einfacher, wenn
angenommen werden kann, dass ω mindestens exponentielles Wachstum besitzt.<br /><br />
Abhilfe: Ersetzt man in <i>f(x)</i> jedes Vorkommen von <i>x</i> durch <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msup><mi>e</mi> <mi>x</mi></msup>

</math>, ändert sich
der Grenzwert selbst nicht, nur das Wachstumsverhalten. Durch wiederholtes Ersetzen kann so jede Funktion
(innerhalb unserer Einschränkung der Funktionsvielfalt, siehe oben) derart verschärft werden, dass sie
mindestens exponentiell gegen Unendlich strebt.<br /><br />

Der Algorithmus soll später eine Potenzreihe in <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>&omega;</mi>
<mo>=</mo><mn>0</mn>
</math> bilden. Damit das 
funktioniert, muss auch der gewählte Teilausdruck ω für <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>x</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn>
</math> 
gegen <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msup><mn>0</mn> <mo>+</mo></msup>

</math> streben. Zum Glück ist
das kein kritisches Problem: Sollte <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>&omega;</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn>
</math> gelten, kann statt dessen
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mn>1</mn>
<mo>/</mo><mi>&omega;</mi>
</math> verwendet werden. Der Fall
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<msub><mi>lim</mi> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn></mrow></msub>
<mi>&omega;</mi><mo>&Element;</mo><mi>&Ropf;</mi><mo>,</mo><msub><mi>lim</mi> <mrow><mi>x</mi>
<mo>&rightarrow;</mo><mn>&infin;</mn></mrow></msub><mi>&omega;</mi><mo>&ne;</mo><mn>0</mn>
</math>
kann dank des Mindestwachstums zum Glück nicht mehr auftreten.


<a name="ErsetzungVonTeilausdruecken" /><h3>2.4 Ersetzung von Teilausdrücken</h3>
Beim Umschreiben der Funktion in eine Funktion in ω muss man sehr umsichtig vorgehen.
Es ist durchaus möglich, dass ein Teilausdruck der höchsten Wachstumsklasse selbst einen weiteren
Teilausdruck der selben Klasse beinhaltet. In dem Fall muss immer der größere Teilausdruck
vor den kleineren Teilausdrücken behandelt werden.<br /><br />
Kritisch sind auch die nötigen Umformungen. An manchen Stellen ist es wünschenswert, dass
Teilausdrücke nach dem Umschreiben vereinfacht werden, an anderen Stellen jedoch auch höchst
problematisch: Durch manche Umformungen können erneut Teilausdrücke mit höherer Wachstumsklasse
entstehen. Mathematicas fest eingebaute Funktion zur automatischen Vereinfachung wird sich dabei
als sehr problematisch erweisen.



<a name="Potenzreihenermittlung" /><h3>2.5 Potenzreihenermittlung</h3>
Nach der Isolation des stärksten Wachstums in ω wird die Potenzreihe der Funktion ermittelt.
In Computeralgebra-Systemen wird üblicherweise die Potenzreihe durch konstruktive Verfahren aus der
Struktur der Funktion aufgebaut, und nicht klassisch durch die Definition der Taylorreihe. Um den
vollen Umfang der unterstützten Funktionen beizubehalten, ist eine Darstellung als Generalisierte
Potenzreihe (Generalized Power Series) erforderlich. Eine Generalisierte Potenzreihe ist eine
Potenzreihe der Form <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msubsup><mo lspace="thinmathspace" rspace="thinmathspace">&Sum;</mo> <mrow><mi>k</mi>
<mo>=</mo><mn>1</mn></mrow> <mrow><mn>&infin;</mn>
</mrow></msubsup>
<msub><mi>a</mi> <mi>k</mi></msub><msup><mi>x</mi> <mrow><msub><mi>e</mi> <mi>k</mi></msub>
</mrow></msup>
</math>, wobei die <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msub><mi>e</mi> <mi>k</mi></msub>

</math>
eine streng monoton wachsende Folge von reellen Zahlen bilden, und <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msub><mi>a</mi> <mi>k</mi></msub>
<mo>&ne;</mo><mn>0</mn>
</math>
für Funktionen ungleich der Nullfunktion gilt. Es dürfen also durchaus auch irrationale Exponenten
in der Potenzreihe auftreten.<br /><br />
Es existieren Algorithmen, die solche Potenzreihen als abgebrochene Potenzreihen mit Restterm
ermitteln können. Dabei sind die <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msub><mi>a</mi> <mi>k</mi></msub>
<msup><mi>x</mi> <mrow><msub><mi>e</mi> <mi>k</mi></msub>
</mrow></msup>
</math> nur bis zu einem Summenindex <i>n</i>
bekannt, und der Algorithmus kann bei Bedarf diesen Abbruch-Index weiter hinaus schieben. Die
Unvollständigkeit der abgebrochenen Potenzreihe ist nicht kritisch, da der für die Analyse wichtige
Term der Potenzreihe sowieso der führende Term ist. Leider existiert
noch keine Implementierung eines solchen Algorithmus in Mathematica, so dass diese Diplomarbeit mit
den eingeschränkten Mitteln des Series-Kommandos von Mathematica auskommen muss.<br /><br />



<a name="AnalyseDesFuehrendenTerms" /><h3>2.6 Analyse des führenden Terms</h3>
Im Allgemeinen hat der führende Term die Gestalt <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>C</mi>
<mo>(</mo><mi>x</mi><mo>)</mo><mo>&sdot;</mo><msup><mi>&omega;</mi> <mi>n</mi></msup>
</math>, und <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>C</mi>
<mo>(</mo><mi>x</mi><mo>)</mo>
</math>
wächst dabei schwächer als jedes <math xmlns='http://www.w3.org/1998/Math/MathML'>
<msup><mi>&omega;</mi> <mi>k</mi></msup>

</math> für <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>k</mi>
<mo>&ne;</mo><mn>0</mn>
</math>.
<br /><br />

Falls <i>n</i> sich als 0
ergibt, war die ursprüngliche Annahme, dass ω das Wachstum dominieren würde, falsch. Tatsächlich
hat sich in diesem Fall das Wachstum aller mit ω vergleichbaren Terme gegenseitig aufgehoben, und
der wirklich dominante Term ist in einer niedrigeren Wachstumsklasse zu finden. Durch die
Potenzreihenentwicklung wurde die Wachstumsklasse von ω eliminiert, und der gesuchte Grenzwert
kann nun durch weitere Analyse von <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>C</mi>
<mo>(</mo><mi>x</mi><mo>)</mo>
</math> gefunden werden.<br />
Ist <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>n</mi>
<mo>&ne;</mo><mn>0</mn>
</math>, ist das Ergebnis entweder 0 oder <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mo>&pm;</mo>
<mn>&infin;</mn>
</math>. Das Vorzeichen
kann durch weiteres Analysieren von <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>C</mi>
<mo>(</mo><mi>x</mi><mo>)</mo>
</math> gefunden werden.<br /><br />
Durch rekursives Abarbeiten wird so die Funktion jedes mal um eine Wachstumsklasse vereinfacht, bis
letztlich <math xmlns='http://www.w3.org/1998/Math/MathML'>
<mi>C</mi>
<mo>(</mo><mi>x</mi><mo>)</mo>
</math> konstant ist. Zeichnet man diese Historie auf, gewinnt man einen guten
Einblick in die mit einander konkurrierenden Wachstumsprozesse und kann sogar eine Asymptote zur Funktion
bestimmen, die das Grenzverhalten der Funktion exakt nachbildet.


<a name="NullTest" /><h3>2.7 Null-Test</h3>
Im Verlauf des Algorithmus wird es wiederholt nötig sein, einen Term daraufhin zu überprüfen, ob
er Null ist, oder welches Vorzeichen er besitzt. So ist das Ermitteln des führenden Terms der
Potenzreihe zum Scheitern verurteilt, wenn die Funktion selbst die Null-Funktion ist: In diesem Fall
gibt es keine von Null verschiedenen Terme in der Potenzreihe. Es genügt sogar bereits, wenn die
Funktion in einer Umgebung um den Grenzübergangspunkt identisch der Nullfunktion ist.<br />
Aber auch in anderen Teilen des Algorithmus treten solche Nulltests auf, z.B. beim Vergleichen des
Wachstumsverhaltens verschiedener Funktionen.<br /><br />

Auf den ersten Blick scheint es einfach zu sein, zu überprüfen, ob eine Funktion identisch Null ist.
In der Computeralgebra hat sich jedoch leider herausgestellt, dass dies ein sehr schwieriges, wenn
nicht gar unlösbares Problem ist. <a href="Anhang.xml#har10">[Har10]</a> und <a href="Anhang.xml#sha04">[Sha04]</a> beschäftigen sich 
eingehender mit dem Thema.<br /><br />

So ist zum Beispiel in unserem eingeschränkten Funktionsraum ein zweifelsfreier
Nulltest theoretisch machbar: Es existieren Abschätzungen, wie viele Nullstellen eine solche Funktion
maximal haben kann. (vgl. <a href="Anhang.xml#ric69">[Ric69]</a> und <a href="Anhang.xml#mac80">[Mac80]</a>) 
Findet man mehr Nullstellen, muss die Funktion insgesamt identisch Null sein.
Leider ist der Aufwand zur Ermittlung dieser Abschätzung sehr groß, und auch die Anzahl der zu 
überprüfenden Nullstellen ist meist so groß, das das Verfahren in der Praxis zu langsam ist.<br /><br />

In dieser Diplomarbeit ist es daher auch wieder einfachen Mathematica-Abfragen überlassen,
die Frage des Nulltests zu beantworten. Eine gewisse Fehlerwahrscheinlichkeit muss hier wieder in Kauf
genommen werden.


<a name="Rekursionen" /><h3>2.8 Rekursionen</h3>
Auf dem Weg zur Berechnung des Grenzwerts wird es immer wieder erforderlich sein, andere
Grenzwerte ebenfalls zu berechnen. Solche Grenzwertberechnungen sind z.B. nötig, wenn das
Wachstumsverhalten von Termen analysiert wird. In solchen Situationen wird sich der
MrvLimit-Algorithmus selbst rekursiv aufrufen. Dabei muss sorgfältig darauf geachtet werden,
dass die rekursiv berechneten Grenzwertaufgaben immer einfacherer Natur sind, als der eigentlich
zu berechnende Grenzwert. Andernfalls würde sich der Algorithmus immer wieder mit immer
schwierigeren Problemen selbst aufrufen und niemals ein Ergebnis liefern. Solange aber die
Grenzwertaufgaben zunehmend einfacher werden, wird der Algorithmus irgendwann bei den einfachsten
Aufgaben ankommen und die Grenzwerte von <i>x</i> oder von Konstanten berechnen - dessen Lösungen
direkt fest in den Algorithmus integriert werden können.




<br /><a href="Einfuehrung.xml">Zurück</a> - <a href="Inhalt.xml">Inhalt</a> - <a href="index.html">Übersicht</a> - <a href="Grundlagen.xml">Vorwärts</a>
</body></html>