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

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  Transformationsregeln und Definitionen /

Die Reihenfolge von DefinitionenFunktionen, die sich an die gefundenen Werte erinnern

2.4.8 Sofortige und verzögerte Definitionen

Sie haben vielleicht bemerkt, daß es zwei verschiedene Wege gibt, Zuweisungen in Mathematica zu machen: ls = rs und ls := rs. Der grundlegende Unterschied zwischen diesen Formen besteht darin, wann der Ausdruck rs evaluiert wird. ls = rs ist eine sofortige Zuweisung, bei der rs dann evaluiert wird, wenn die Zuweisung gemacht wird. ls := rs hingegen ist eine verzögerte Zuweisung, bei der rs nicht evaluiert wird, wenn die Zuweisung gemacht wird, sondern jedesmal evaluiert wird, wenn der Wert von ls angefordert wird.

Die zwei Typen von Zuweisungen in Mathematica

Dies benutzt den Operator :=, um die Funktion ex zu definieren.

In[1]:= ex[x_] := Expand[(1 + x)^2]

Weil := benutzt wurde, wird die Definition in einer unevaluierten Form belassen.

In[2]:= ?ex

Wenn Sie eine Zuweisung mit dem Operator = machen, wird die rechte Seite sofort evaluiert.

In[3]:= iex[x_] = Expand[(1 + x)^2]

Out[3]=

Die jetzt gespeicherte Definition ist das Ergebnis des Befehls Expand.

In[4]:= ?iex

Wenn Sie ex ausführen, wird Expand vollzogen.

In[5]:= ex[y + 2]

Out[5]=

iex setzt einfach sein Argument in die bereits ausmultiplizierte Form ein und liefert eine andere Antwort.

In[6]:= iex[y + 2]

Out[6]=

Wie Sie aus dem obigen Beispiel sehen, können = und := beide bei der Definition von Funktionen nützlich sein; sie haben jedoch unterschiedliche Bedeutung, und Sie müssen vorsichtig dabei sein, welche Sie in einem bestimmten Fall benutzen.

Eine Faustregel: Wenn Sie sich eine Zuweisung als die Angabe eines endgültigen „Wertes" für einen Ausdruck vorstellen, benutzen Sie den Operator =. Wenn Sie sich stattdessen die Zuweisung als die Spezifizierung einer „Anweisung" zur Bestimmung des Wertes vorstellen, benutzen Sie den Operator :=. Im Zweifelsfall ist es gewöhnlich besser, den Operator := statt des Operators = zu verwenden.

Interpretationen von Zuweisungen mit den Operatoren = und :=

Obwohl := wahrscheinlich öfter als = beim Definieren von Funktionen verwendet wird, gibt es einen wichtigen Fall, in dem Sie = benutzen müssen, um eine Funktion zu definieren. Wenn Sie eine Berechnung durchführen und eine Antwort mit dem symbolischen Parameter x erhalten, möchten Sie oft fortfahren und Ergebnisse für verschiedene spezielle Werte von x bestimmen. Sie können zum Beispiel mit dem Operator /. geeignete Regeln auf jedes x anwenden. Es ist gewöhnlich jedoch vorteilhafter, mit = eine Funktion zu definieren, deren Argument x ist.

Hier ist ein Ausdruck, der x enthält.

In[7]:= D[Log[Sin[x]]^2, x]

Out[7]=

Dadurch wird eine Funktion definiert, deren Argument der für x angenommene Wert ist.

In[8]:= dlog[x_] = %

Out[8]=

Hier ist das Ergebnis, wenn x als 1 + a angenommen wird.

In[9]:= dlog[1 + a]

Out[9]=

Ein wichtiger Punkt, der in dem obigen Beispiel zu beachten ist: Der Name x, der im Muster x_ erscheint, hat keine besondere Bedeutung. Er ist nur ein Symbol, nicht unterscheidbar von einem x, das in irgendeinem anderen Ausdruck erscheint.

Definieren von Funktionen zum Evaluieren von Ausdrücken

Sie können mit = und := nicht nur Funktionen definieren, sondern auch Variablen Werte zuweisen. Wenn Sie x = wert eintippen, dann wird wert sofort evaluiert und das Ergebnis wird x zugewiesen. Wenn Sie x := wert eintippen, wird anderseits wert nicht sofort evaluiert. Stattdessen wird es in nicht evaluierter Form belassen und jedesmal neu evaluiert, wenn x benutzt wird.

Dies evaluiert Random[ ], um eine Pseudozufallszahl zu bestimmen, und weist diese Zahl r1 zu.

In[10]:= r1 = Random[ ]

Out[10]=

Hier wird Random[ ] in nicht evaluierter Form belassen und jedesmal neu evaluiert, wenn r2 benutzt wird.

In[11]:= r2 := Random[ ]

Hier sind Werte für r1 und r2.

In[12]:= {r1, r2}

Out[12]=

Der Wert für r1 ändert sich niemals. Jedesmal, wenn r2 benutzt wird, wird jedoch eine neue Pseudozufallszahl erzeugt.

In[13]:= {r1, r2}

Out[13]=

Die Unterscheidung zwischen sofortiger und verzögerter Zuweisung ist besonders wichtig, wenn Sie Ketten von Zuweisungen anlegen.

Dadurch wird a als 1 definiert.

In[14]:= a = 1

Out[14]=

Hier wird a + 2 zu 3 evaluiert, und das Ergebnis wird ri als Wert zugewiesen.

In[15]:= ri = a + 2

Out[15]=

Hier wird a + 2 in einer unevaluierten Form belassen, um jedesmal dann evaluiert zu werden, wenn der Wert von rd angefordert wird.

In[16]:= rd := a + 2

In diesem Fall ergeben ri und rd dieselben Werte.

In[17]:= {ri, rd}

Out[17]=

Nun wird der Wert von a verändert.

In[18]:= a = 2

Out[18]=

Jetzt benutzt rd den neuen Wert für a, während ri seinen ursprünglichen Wert beibehält.

In[19]:= {ri, rd}

Out[19]=

Mit verzögerten Zuweisungen wie t := rs können Sie Variablen aufstellen, deren Werte Sie in einer Vielzahl von verschiedenen „Umgebungen" finden können. Jedesmal, wenn Sie nach t fragen, wird der Ausdruck rs evaluiert, und dabei werden die aktuellen Werte der Objekte benutzt, von denen es abhängt.

Die rechte Seite der verzögerten Zuweisung wird in einer unevaluierten Form beibehalten.

In[20]:= t := {a, Factor[x^a - 1]}

Dadurch erhält a den Wert 4, und dann wird der Wert von t bestimmt.

In[21]:= a = 4; t

Out[21]=

Hier ist a gleich 6.

In[22]:= a = 6; t

Out[22]=

Im obigen Beispiel agiert das Symbol a wie eine „globale Variable", deren Wert den Wert von t beeinflußt. Wenn Sie eine große Anzahl von Parametern haben, von denen sich viele nur gelegentlich ändern, finden Sie vielleicht diese Art der Konstruktion vorteilhaft. Sie sollten sich jedoch darüber klar sein, daß implizite oder versteckte Abhängigkeit einer Variablen von anderen oft ziemliche Verwirrung stiften kann. Sie sollten möglichst alle Abhängigkeiten explizit gestalten, indem Sie Funktionen definieren, bei denen alle notwendigen Parameter als Argumente definiert sind.

Zwei Typen von Transformationsregeln in Mathematica

Genauso, wie Sie in Mathematica sofortige und verzögerte Zuweisungen aufstellen können, können Sie auch sofortige und verzögerte Transformationsregeln anlegen.

Die rechte Seite dieser Regel wird evaluiert, wenn Sie die Regel angeben.

In[23]:= f[x_] -> Expand[(1 + x)^2]

Out[23]=

Eine Regel wie diese ist wahrscheinlich nicht besonders nützlich.

In[24]:= f[x_] -> Expand[x]

Out[24]=

Hier wird die rechte Seite der Regel in einer unevaluierten Form beibehalten, um jedesmal dann evaluiert zu werden, wenn die Regel benutzt wird.

In[25]:= f[x_] :> Expand[x]

Out[25]=

Die Anwendung der Regel bewirkt, daß ausmultipliziert wird.

In[26]:= f[(1 + p)^2] /. f[x_] :> Expand[x]

Out[26]=

Wie bei den Zuweisungen sollten Sie normalerweise -> benutzen, wenn Sie einen Ausdruck durch einen bestimmten Wert ersetzen wollen, und Sie sollten :> einsetzen, wenn Sie eine Anweisung zum Bestimmen des Wertes geben wollen.

Die Reihenfolge von DefinitionenFunktionen, die sich an die gefundenen Werte erinnern