%htmlDTD; ]> Automatische Berechnung von Grenzwerten und Implementierung in Mathematica Zurück - Inhalt - Übersicht - Vorwärts

2 Überblick über den Algorithmus

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.

Bevor wir uns in
Kapitel 3 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 f (x) .
  1. Transformation der allgemeinen Grenzwertaufgabe lim x x 0 f(x) in eine Grenzwertaufgabe der Form lim x f(x) .
  2. Isolieren desjenigen Teilausdrucks der Funktion, der das größte asymptotische Wachstumsverhalten besitzt.
  3. Bestimmen aller Teilausdrücke, die das gleiche Wachstumsverhalten besitzen wie der ausgewählte Teilausdruck.
  4. 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.
  5. Ermitteln der Potenzreihe in ω und Ermittlung des führenden Terms der Potenzreihe. Dabei kann x als konstant betrachtet werden.
  6. Falls erforderlich, weitere Analyse des führenden Terms durch rekursive Grenzwertberechnungen.
  7. Abschließende Bestimmung des Grenzwerts durch Analyse des führenden Terms.
Dieser Überblick ist natürlich sehr knapp ausgefallen. Deswegen werden im Folgenden ein paar Themen noch detaillierter besprochen.

2.1 Transformation

Um den Algorithmus überschaubar zu gestalten, werden grundsätzlich nur Grenzwerte für x betrachtet. Andere Grenzwerte lassen sich leicht durch Transformation ermitteln:
lim x x 0 + f(x) = lim x f( x 0+1 x ) lim x x 0 - f(x) = lim x f( x 0-1 x ) lim x - f(x) = lim x f( -x )
Beidseitige Grenzwerte löst man, indem der Grenzwert aus beiden Richtungen separat ermittelt und verglichen wird.

2.2 Wachstumsklassen

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.

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
Kapitel 3 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 e x als auch e - x für x exponentielles Wachstum, im zweiten Fall jedoch exponentielles Wachstum gegen 0.

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 ω n (n0) sind, leisten keinen Beitrag zur Potenzreihe und werden vorerst als konstant betrachtet.

2.3 Bedingungen an das Wachstum

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.

Abhilfe: Ersetzt man in f(x) jedes Vorkommen von x durch e x , ä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.

Der Algorithmus soll später eine Potenzreihe in ω =0 bilden. Damit das funktioniert, muss auch der gewählte Teilausdruck ω für x gegen 0 + streben. Zum Glück ist das kein kritisches Problem: Sollte ω gelten, kann statt dessen 1 /ω verwendet werden. Der Fall lim x ω,lim x ω0 kann dank des Mindestwachstums zum Glück nicht mehr auftreten.

2.4 Ersetzung von Teilausdrücken

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.

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.

2.5 Potenzreihenermittlung

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 k =1 a kx e k , wobei die e k eine streng monoton wachsende Folge von reellen Zahlen bilden, und a k 0 für Funktionen ungleich der Nullfunktion gilt. Es dürfen also durchaus auch irrationale Exponenten in der Potenzreihe auftreten.

Es existieren Algorithmen, die solche Potenzreihen als abgebrochene Potenzreihen mit Restterm ermitteln können. Dabei sind die a k x e k nur bis zu einem Summenindex n 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.

2.6 Analyse des führenden Terms

Im Allgemeinen hat der führende Term die Gestalt C (x)ω n , und C (x) wächst dabei schwächer als jedes ω k für k 0 .

Falls n 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 C (x) gefunden werden.
Ist n 0 , ist das Ergebnis entweder 0 oder ± . Das Vorzeichen kann durch weiteres Analysieren von C (x) gefunden werden.

Durch rekursives Abarbeiten wird so die Funktion jedes mal um eine Wachstumsklasse vereinfacht, bis letztlich C (x) 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.

2.7 Null-Test

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.
Aber auch in anderen Teilen des Algorithmus treten solche Nulltests auf, z.B. beim Vergleichen des Wachstumsverhaltens verschiedener Funktionen.

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.
[Har10] und [Sha04] beschäftigen sich eingehender mit dem Thema.

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. [Ric69] und [Mac80]) 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.

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.

2.8 Rekursionen

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 x oder von Konstanten berechnen - dessen Lösungen direkt fest in den Algorithmus integriert werden können.
Zurück - Inhalt - Übersicht - Vorwärts