This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.2)

 Documentation /  Mathematica /  Das Mathematica Buch /  Eine praktische Einführung in Mathematica /  Spezielles Thema: Die Interna von Mathematica /

InhaltDie grundlegende interne Architektur

1.12.1 Warum die internen Abläufe im allgemeinen nicht relevant sind

Der größte Teil des Buches erläutert, was Mathematica tut, aber nicht, wie es etwas tut. Der Zweck dieses Kapitels ist nun, zumindest ein wenig darüber zu erzählen, wie Mathematica das tut, was es tut. In Anhang A.9 finden Sie weitere Details.

Zunächst sollten Sie wissen, daß die Kenntnis der internen Abläufe von Mathematica ein intellektuelles Bedürfnis befriedigen mag, aber in der Praxis viel weniger relevant ist, als man zunächst vermuten mag.

Es ist sogar ein sehr wichtiger Aspekt von Mathematica, daß es eine Umgebung anbietet, in der Sie mathematische und andere Operationen durchführen können, ohne im einzelnen wissen zu müssen, wie diese Operationen in Ihrem Computer tatsächlich ausgeführt werden.

So können Sie zum Beispiel das Polynom faktorisieren, indem Sie Mathematica einfach nur die Anweisung Factor[x^15 - 1] geben. Sie müssen nicht die genauen komplizierten Einzelheiten kennen, wie eine solche Faktorisierung durch den Mathematica-Code tatsächlich ausgeführt wird.

In beinahe allen praktischen Anwendungen wird das Thema, wie Mathematica intern arbeitet, sich als weitgehend irrelevant herausstellen. In den meisten Fällen genügt es, Mathematica einfach als abstraktes System anzusehen, das bestimmte festgelegte mathematische und andere Operationen durchführt.

Sie mögen vielleicht denken, daß es für die Bestimmung, welche Lösung Mathematica liefern wird, notwendig ist, daß man weiß, wie Mathematica intern arbeitet. Dies ist aber nur sehr selten der Fall. Denn die überwiegende Mehrzahl der Berechnungen, die Mathematica durchführt, sind durch die Definitionen mathematischer oder anderer Operationen festgelegt.

Somit wird zum Beispiel 3^40 immer 12157665459056928801 sein, ungeachtet dessen, wie Mathematica diese Lösung intern berechnet hat.

Es gibt jedoch einige Situationen, in denen mehrere verschiedene Lösungen gleichermaßen mit den formalen mathematischen Definitionen im Einklang stehen. So gibt es zum Beispiel bei der Berechnung symbolischer Integrale mehrere verschiedene Ausdrücke, die alle die gleiche Ableitung ergeben. Welcher dieser Ausdrücke durch die Anweisung Integrate erzeugt wird, kann dann davon abhängen, wie Integrate intern arbeitet.

Hier ist die Lösung, die durch Integrate erzeugt wird.

In[1]:= Integrate[1/x + 1/x^2, x]

Out[1]=

Dies ist ein äquivalenter Ausdruck, der auch hätte erzeugt werden können, wenn Integrate intern anders arbeiten würde.

In[2]:= Together[%]

Out[2]=

Bei den numerischen Berechnungen taucht ein ähnliches Phänomen auf. So liefert Ihnen zum Beispiel FindRoot eine Nullstelle einer Funktion. Wenn es aber mehrere Nullstellen gibt, hängt es von den Einzelheiten, wie FindRoot intern arbeitet, ab, welche Nullstelle nun tatsächlich als Ergebnis zurückgegeben wird.

Dies findet eine Nullstelle von .

In[3]:= FindRoot[Cos[x] + Sin[x], {x, 10.5}]

Out[3]=

Mit einem anderen Startpunkt wird eine andere Nullstelle gefunden. Welche Nullstelle mit jedem Startpunkt gefunden wird, hängt im einzelnen davon ab, welcher interne Algorithmus verwendet wird.

In[4]:= FindRoot[Cos[x] + Sin[x], {x, 10.8}]

Out[4]=

Die Abhängigkeit von den Einzelheiten der internen Algorithmen kann signifikanter werden, wenn Sie genäherte numerische Berechnungen nahe an deren Gültigkeitsgrenzen durchführen.

Wenn Sie zum Beispiel in NIntegrate einen entarteten Integranden angeben, kann es somit vom intern verwendeten Algorithmus abhängig sein, ob Sie nun eine sinnvolle Lösung erhalten oder nicht.

NIntegrate weiß, daß dieses Ergebnis unzuverlässig ist, und von der Beschaffenheit des internen Algorithmus abhängen kann, und gibt entsprechende Warnungsmeldungen aus.

In[5]:= NIntegrate[Sin[1/x], {x, 0, 1}]

Out[5]=

Traditionelle Berechnungssysteme waren geneigt, der Idee zu folgen, daß alle Berechnungen, zumindest nominal, Ergebnisse mit der gleichen Genauigkeit liefern sollten. Eine Konsequenz dieser Idee ist, daß es nicht ausreicht, nur auf das Ergebnis zu schauen, um zu erkennen, ob es exakt ist. In der Regel müssen Sie auch den internen Algorithmus analysieren, durch den das Ergebnis gefunden wurde. Diese Tatsache hat dazu geführt, daß versucht wurde, Leute davon zu überzeugen, daß es immer wichtig sei, die internen Algorithmen für die numerischen Berechnungen zu kennen.

Bei dem Ansatz, den Mathematica vornimmt, ist dies selten der Fall. Mathematica kann nämlich normalerweise mit seinen beliebig genauen numerischen Berechnungsfähigkeiten Ergebnisse liefern, in denen jede erzeugte Ziffer der exakten mathematischen Vorschrift der gerade durchgeführten Berechnung folgt.

Auch wenn dies eine genäherte numerische Berechnung ist, wird jede Ziffer durch die mathematische Definition von bestimmt.

In[6]:= N[Pi, 30]

Out[6]=

Hier ist wiederum jede Ziffer durch die mathematische Definition von bestimmt.

In[7]:= N[Sin[10^50], 20]

Out[7]=

Wenn Sie maschinengenaue Zahlen verwenden, kann Mathematica kein zuverlässiges Ergebnis liefern. Die Lösung hängt dann von der Beschaffenheit des verwendeten internen Algorithmus ab.

In[8]:= Sin[10.^50]

Out[8]=

Es ist ein allgemeines Merkmal, daß, wann immer Ihre Ergebnisse durch die Beschaffenheit des internen Algorithmus beeinflußt werden, Sie sich nicht auf diese Ergebnisse verlassen sollten. Wenn alles andere außer Betracht gelassen wird, liefern verschiedene Mathematica-Versionen möglicherweise Unterschiede in diesen Ergebnissen. Entweder weil die Algorithmen etwas unterschiedlich auf den verschiedenen Computersystemen arbeiten oder weil fundamental unterschiedliche Algorithmen in zu verschiedenen Zeitpunkten herausgebrachten Versionen verwendet werden.

Dies ist das Ergebnis von auf einer Computersorte.

In[1]:= Sin[10.^50]

Out[1]=

Hier ist die gleiche Berechnung auf einer anderen Computersorte.

In[1]:= Sin[10.^50]

Out[1]= -0.0528229

Und hier ist das Ergebnis, das man in Mathematica Version 1 erhält.

In[1]:=Sin[10.^50]

Out[1]=0.0937538

Speziell in den fortgeschritteneren Anwendungen von Mathematica scheint es manchmal lohnend zu sein, die internen Algorithmen zu analysieren, um vorhersagen zu können, welche Methode einer gegebenen Berechnung die effektivste ist. Und es gibt gelegentlich bedeutende Verbesserungen als Ergebnis solcher Analysen.

Meistens werden sich die Analysen aber nicht lohnen. Denn die Interna von Mathematica sind sehr kompliziert. Sogar mit einer grundlegenden Beschreibung eines für einen bestimmten Zweck verwendeten Algorithmus ist es normalerweise extrem schwer, zu einer verläßlichen Schlußfolgerung darüber zu kommen, wie die detaillierte Implementation dieses Algorithmus sich unter bestimmten Umständen tatsächlich verhält.

Ein typisches Problem kann dadurch auftreten, daß Mathematica viele interne Optimierungsprozeduren besitzt. Die Effizienz der Berechnung kann stark dadurch beeinflußt werden, ob die Details der Berechnung es erlauben, eine vorhandene interne Optimierungsprozedur einzusetzen.

InhaltDie grundlegende interne Architektur