Einführung in Mathematica

Carsten Rezny

Listen, Vektoren, Matrizen

Listen werden mit geschweiften Klammern notiert, die Elemente können beliebige Ausdrücke sein.

{7,42,"abcdef",(Sqrt[(x^2)-1])}

Listen können generiert werden:

Range[20]

liste=Table[n^3,{n,20}]

Außer dem Endwert können auch Startwert und Schrittweite angegeben werden:

Table[n^2,{n,10,20,2}]

Auch Zuweisung an Listen ist möglich:

{x,y,z}={3,6,9}

Die Anzahl der Elemente einer Liste gibt Length:

Length[liste]

Einzelne Elemente werden mit doppelten eckigen Klammern angesprochen,

liste[[4]]

Teillisten erhält man mit [[von;;bis]]:

liste[[4;;7]]

Ein negativer Index wird vom Ende der Liste gezählt:

liste[[-1]]

Einzelne Listenelemente können durch Zuweisung ersetzt werden:

liste[[5]]=0

Einige Elemente aus einer Liste entfernen:

Drop[liste,{3,18}]

Listen können verschachtelt werden, das ermöglicht Matrizen:

{{1,2,3},{4,5,6},{7,8,9}}

%//MatrixForm

Auch das geht mit Table

m=Table[(Subscript[a, i,k]),{i,3},{k,3}]

%//MatrixForm

Auf einzelne Elemente einer geschachtelten Liste wird folgendermaßen zugegriffen:

m[[1,2]]

Denselben Effekt hat

m[[1]][[2]]

Allgemein bezeichnet m[[i,j]] das Element in der j-ten Spalte der i-ten Zeile.

Das Schlüsselwort All steht für alle Indizes der entsprechenden Dimension:

m[[All,3]]

liefert also die dritte Spalte von m.

Identitäts- und Diagonalmatrizen können einfacher erzeugt werden:

DiagonalMatrix[{1,2,3,4}]//MatrixForm

DiagonalMatrix[{1,2,3},1]//MatrixForm

IdentityMatrix[3]//MatrixForm

Geschachtelte Listen müssen nicht notwendig rechteckig sein:

Table[i k,{i,10},{k,i}]

%//TableForm

Viele Funktionen können direkt auf eine Liste angewandt werden:

Sqrt[liste]

Ausschlaggebend dafür ist das Attribut Listable.

Attributes[Sqrt]

Die meisten Vektoroperationen ergeben sich damit wie erwartet:

v={v1,v2,v3};w={w1,w2,w3};

Vektoraddition:

v+w

Multiplikation mit einem Skalar:

2 v

Skalarprodukt:

v.w

Dot[v,w]

Vorsicht mit der “normalen” Multiplikation (Times). Hier wird komponentenweise multipliziert, was meist nicht gemeint ist:

v w

Das Dot-Produkt ermöglicht auch Matrix-Vektor-Multiplikation:

m.v

%//MatrixForm

Schließlich das Kreuzprodukt:

v\[Cross]w

Cross[v,w]

%//MatrixForm

Achtung: Das × (EsccrossEsc) kann leicht mit × (Times, Esc*Esc) verwechselt werden.

Es gibt natürlich auch Funktionen zum Transponieren, Invertieren und für die Determinante einer Matrix:

Inverse[m]//MatrixForm

Transpose[m]//MatrixForm

m\[Transpose]//MatrixForm

Det[m]

Mengen

Listen können auch verwendet werden, um endliche Mengen zu simulieren. Eine Liste unterscheidet sich in zwei Punkten von einer Menge:

Diese zwei Listen sind nicht gleich:

{1,2,3}=={3,2,1}

obwohl sie, als Mengen interpretiert, gleich wären.

Um dies zu berücksichtigen, werden Listen, wenn sie als Mengen verwendet werden, grundsätzlich sortiert und von Duplikaten bereinigt.

Union[{c,a,b,a,c,f},{g,f,d,e}]

Union vereinigt Mengen. Als Spezialfall kann man eine Menge mit der leeren Menge vereinigen, um sie sortieren und bereinigen zu lassen.

Union[{3,5,6,4,5,78,4}]

Die Schnittmenge liefert Intersection:

Intersection[{2,3,4,5,4,3},{5,4,6,7,8,9}]

Lineare Gleichungssysteme

Matrizen können lineare Gleichungssysteme repräsentieren.

Zu lösen sei das Gleichungssystem (({{1, 2}, {-2, 1}}))x==(({{-1}, {1}})):

m={{1,2},{-2,1}};b={-1,1};

x=LinearSolve[m,b]

m.x

m={{1,2,-2},{2,3,0},{2,1,8}};b={7,0,-28};
MatrixRank[m]

LinearSolve findet, wenn möglich, eine Lösung des Gleichungssystems.

LinearSolve[m,b]

MatrixRank[m]

Ist die Lösung nicht eindeutig, benötigt man noch den Kern der Matrix für die komplette Lösung.

NullSpace[m]

Funktionale Programmierung

Rekursion
Viele Funktionen lassen sich rekursiv besonders elegant definieren, wie schon bei der Fakultätsfunktion zu sehen war. Zur Erinnerung:

f[0]=1;
f[x_]:=x f[x-1]

?f

f[5]

Platzhalter (pattern matching)

Der Unterstrich in einer Funktionsdefinition heißt Blank, das ist die grundlegende Form des Platzhalters. Meist verwendet man benannte Platzhalter, also solche mit vorangestelltem Bezeichner. Unbenannte Platzhalter sind aber auch möglich.

Beispiel Kronecker-Delta:

δ[a_,a_]:=1;
δ[_,_]:=0

δ[1,2]

δ[5,5]

Wird ein benannter Platzhalter mehrfach verwendet, trifft er nur auf gleiche Teilausdrücke.

Nochmal zur Fakultätsfunktion: Für nicht natürliche Argumente ergibt sich ein unschönes Verhalten.

f[3.5]

Abhilfe schafft eine an den Blank angehängte Head-Angabe. Damit passt das Muster nur noch auf Werte mit dem angegebenen Head.

Clear[f]; (* vergiss die alten Definitionen für f *)
f[0]:=1;
f[x_Integer]:=x f[x-1]

f[3.5]

f[4]

Negative Argumente sind immer noch ein Problem:

f[-2]

Man kann ein Pattern noch weiter einschränken. Mit ? wird eine Testfunktion angegeben, die genau ein Argument akzeptiert und einen Wahrheitswert zurückgibt.

Clear[f];
f[0]=1;
f[x_Integer?Positive]:=x f[x-1]

f[-3]

Darüber hinaus gibt es noch die Möglichkeit, ein Muster oder eine Definition mit einer beliebigen Bedingung zu verknüpfen:

Clear[h];
h[x_/;x>0]:=1;
h[x_]:=0;

h[5]

Clear[g];
g[x_,y_]/;x≠y:=(1/(x-y))

g[3,4]

g[2,2]

Neben dem Platzhalter _, der auf genau ein Argument zutrifft, gibt es noch einen Platzhalter, der auf ein oder mehrere Argumente zutrifft:

avg[x__]:=Plus[x]/Length[{x}]

avg[2,4,6]

avg[]

Schließlich existiert mit ___ noch ein Platzhalter, der auf null oder mehrere Argumente zutrifft:

count[x___]:=Length[{x}]

count[2,3,4,5]

count[]

Listen und Funktionen: Map, Apply

Es sollen die Elemente einer Liste aufaddiert werden:

liste={2,4,6,8}

Plus[liste]

Mit Plus allein ist das nicht zu machen. Stattdessen:

Apply[Plus,liste]

Oder auch

Plus@@liste

Allgemein wendet Apply die gegebene Funktion auf alle Elemente einer Liste gemeinsam an.

f@@{x,y,z}