Mathematica Crash-Kurs - Eine kompakte und systematische Einführung für Anfänger und Fortgeschrittene
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Mathematica Crash-Kurs Eine kompakte und systematische Einführung für Anfänger und Fortgeschrittene Edition 1.0 © Markus van Almsick, 1999, alle Rechte vorbehalten.
2 MmaCrashKurs.nb Einleitung Zielsetzung Mathematica ist wahrscheinlich das größte Programm, das Sie derzeit benutzen. Es besteht aus über 1800 Grundbefe- hlen und aus einer ständig wachsenden Anzahl hinzuladbarer Packages, die die Fähigkeiten Mathematica's erweitern. Mathematica hilft Ihnen bei der Lösung angewandeter Mathematik, die Ihnen in den Naturwissenschaften, in der Technik und im Finanzwesen begegnet. Mathematica bietet nicht nur numerischen Lösungsverfahren, sondern auch Möglichkeiten Formeln symbolisch zu bearbeiten. Die eingebauten Graphikfähigkeiten und der Folding-Editor dienen zur Dokumentation Ihrer Ausarbeitungen. Außerdem ist Mathematica eine Programmiersprache, die die Fähigkeiten unterschiedlicher Programmiersprachen, wie z.B. Fortran, C, APL, Prolog, Lisp, etc. in sich vereinigt. Das Problem eines jeden zeitlich begrenzten Mathematica-Seminars ist die Fülle an Funktionen und neuen Konzepten, die einem Anwender möglichst umfassend vermitteln werden sollten. Dies ist leider in einem einzigen Kurs nicht machbar, sodaß Kompromisse gemacht und Schwerpunkte gesetzt werden müssen. Gegenstand dieses Workshops ist Mathematica Version 4.0. Der überwiegende Teil des Lehrmaterials trifft aber auch auf Version 2.2 und Version 3.0 zu. Vorgehensweise In diesem Seminar wird Ihnen Mathematica als Programmiersprache vorgestellt. Es gibt wie beim Erlernen einer Fremdsprache zwei Methoden sich einer Programmiersprache zu nähern: Die Ganzheitsmethode: Diese Methode, auch "Learning by Doing" genannt, ist der bekannte Sprung ins kalte Wasser. Durch das Nachvollzie- hen und Erweitern von Beispielrechnungen und kleineren Projekten wird die Handhabung der Software praxisorientiert vermittelt. Der Vorteil dieser Vorgehensweise liegt im Erlangen praxisorientierten Wissens. Man bekommt die Übung mit den alltäglichen, im Detail auftretenden Schwierigkeiten fertig zu werden. Man ist nach kürzester Zeit in der Lage einfache Rechnungen erfolgreich durchzuführen. Leider kommt bei dieser Vorgehensweise das systematische Grundwissen zu kurz. Dieser Umstand ist insbesondere bei der Komplexität von Mathematica auf Dauer von Nachteil.
MmaCrashKurs.nb 3 Die systematische Einführung: Eine systematische Einführung ist eine eher trockene und keineswegs praxisorientierte Angelegenheit. Das Wissen der "Vokabeln" und der "Grammatik" allein befähigt Sie nicht die "Fremdsprache" Mathematica im Alltag gewinnbringend einzusetzen. Auf längere Sicht ist jedoch eine systematische Erarbeitung der grundlegenden Strukturen einer Software immer von Vorteil. Dies trifft insbesondere auf Mathematica zu, wenn man sich mit der regelbasierten und funktionalen Programmierung befaßt. Der Crash-Kurs Wir werden uns in diesem Crash-Kurs aus Zeitgründen auf eine kurze, systematische Einführung beschränken müssen. Die Besprechung praxisorientierter Beispiele und die Vertiefung der Materie durch Übungen bleibt mehrtägigen Kursen und Workshops vorbehalten. Wir erarbeiten uns aber eine Ausgangsbasis, von der aus alle weiteren Fähigkeiten Mathe- matica's übersehen und leicht erlernt werden können. à Gliederung des Crash-Kurses In der kurzen, systematischen Einführung befassen wir uns mit Mathematica als Programmiersprache. Dementsprech- end ist der Kurs wie folgt gegliedert: 1. Die grundlegenden Datenobjekte, deren Zusammensetzung und Darstellung (Listenstrukturen) 2. Die Verarbeitung der Datenobjekte a) Die Syntax-Erkennung der Datenobjekte (Mustererkennung) b) Die Umwandlung der Datenobjekte (Regelsysteme) 3. Die Zusammensetzung der Verarbeitungsschritte (Programmierung) Tabula Rasa Bevor wir beginnen, ist es ratsam alle Erwartungshaltungen oder Vorstellungen, die aufgrund herkömmlicher Program- miersprachen wie C, Pascal, Basic, Fortran, usw. bestehen, über Bord zu werfen. In SMP (Symbolischen Manipulation- sprogrammen) wie Mathematica treffen wir auf eine Reihe neuer Ideen. Einige alte Konzepte, wie z.B. Typendeklara- tion der Variablen oder die Trennung zwischen Daten und Operationen, werden wegfallen. Es ist daher ratsam, vorbe- haltlos an die vielen in Mathematica verwirklichten Ideen heranzutreten ohne sie gleich in Frage zu stellen. Die Vorzü- gen werden Sie sicher während des Crash-Kurses kennenlernen. Genug der Vorrede! In medias res!
4 MmaCrashKurs.nb Mathematica Listenstrukturen Listenkonzept Alle Datenobjekte in Mathematica sind in Listenstrukturen niedergelegt. Eine Listenstruktur besteht aus zwei Teilen, dem Listenkopf und den Argumenten. Listenkopf[Argument1,Argument2,...] Die Listenstruktur der Datenobjekte läßt sich mit dem Befehl FullForm offenlegen. Hier sind einige Beispiele: Addition: 1+1 Plus[1,1] Vektor: {1,2,3} List[1,2,3] Formel: x2 - Cos@yD 3 Plus[Power[x,2],Times[Rational[-1,3],Cos[y]]] Graphik: Graphics[Line[{{0,0},{2,0},{1,1},{0,0}}]] In Mathematica wird praktisch alles mit Listenstrukturen geregelt. Dies schließt auch die Notebooks mit ein. Notebook[{ Cell[ CellGroupData[{ Cell[BoxData[\(2\ + \ 2\)], "Input"]
MmaCrashKurs.nb 5 Cell[BoxData[\(4\)], "Output"] }, Open ] ]}, FrontEndVersion->"Macintosh 3.0", ScreenRectangle->{{0, 1024}, {0, 748}}, WindowSize->{511, 259}, WindowMargins->{{36, Automatic}, {Automatic, 58}} ] Atomare Datentypen Offensichtlich müssen die Listenstrukturen aus grundlegenden Datenobjekten zusammengesetzt werden. Diese grundleg- enden, nicht weiter aus Listen zusammengesetzten Datenobjekte bezeichnet man als atomar. In Mathematica gibt es 6 verschieden atomare Datentypen. Ganzen Zahlen à Eingabe Natürliche und ganze Zahlen werden als Ziffernfolge mit oder ohne Vorzeichen (+ oder -) eingegeben. Die Ziffernfolge kann beliebig lang sein, darf aber keinen Dezimalpunkt oder Bruchstrich enthalten. Beispiele: 1998 -12 à Eigenschaften Ganze Zahlen haben den Listenkopf Integer Beispiele: Head@1999D Integer IntegerQ@1999D True Integer-Zahlen können beliebig groß sein und sie werden von Mathematica exakt verarbeitet.
6 MmaCrashKurs.nb Beispiele: Ein gigantischer Binomialkoeffizient Binomial@1999, 1900D 5480307429468978819502484902052030669259099763711602614435120655666146437 447653135616660229574404763211211949641810113372635915521793535841120897 8615805047532956183962204 Eine einfache Division 1998 37 54 Rationalen Zahlen à Eingabe Rationale Zahlen werden durch zwei ganze Zahlen, dem Zähler und dem Nenner, mit dazwischenliegendem Bruchstrich / eingegeben. Falls Zähler und Nenner einen gemeinsamen Faktor aufweisen, wird der eingegebene Bruch von Mathe- matica umgehend gekürzt. Die gekürzte Form wird als eindeutige, kanonische Darstellung der rationalen Zahl angesehen. Beispiele: 7 24 7 24 9 24 3 8 à Eigenschaften In Mathematica sind rationale Zahlen ein eigenständiger, atomarer Datentyp und keine aus ganzen Zahlen zusammeng- esetzter Ausdruck, wie die folgende Typenabfrage mittels Head[] und AtomQ[] belegen. Head@3 4D Rational AtomQ@3 4D True Ebenso wie die ganzen Zahlen werden auch die rationalen Zahlen exakt ohne Rundungsfehler weiterverarbeitet. Ist dies im Rahmen der rationalen Zahlen nicht möglich, wird die Rechnung beim letzten, nicht exakten Zwischenergebnis abgebrochen. Beispiele:
MmaCrashKurs.nb 7 H2 3 - 4 5L ^ 2 4 225 Sqrt@2 - 2 9D 4 3 Sqrt@2 - 2 7D 3 2 $%%%%%% 7 Man beachte, daß die exakte Verrechnung der rationalen Zahlen sehr aufwendig ist. Nach jedem Rechenschritt wird überprüft, ob Zähler und Nenner gekürzt werden können. Zu diesem Zweck ist eine Primzahlzerlegung erforderlich, was die Rechengeschwindigkeit drastisch beeinträchtigen kann. Gleitkommazahlen à Eingabe Gleitkommazahlen werden bei der Eingabe durch eine Ziffernfolge mit Dezimalpunkt, dem angelsächsischen Pendant eines Dezimalkommas, gekennzeichnet. Der Dezimalpunkt darf auf keinen Fall fehlen, da sonst die Zahl als Integer aufgefaßt wird. Gleitkommazahlen werden in Mathematica durch den Datentyp Real dargestellt. Beispiele: Eine typische Gleitkommazahl. Head@2.98 10 ^ 8D Real Zum Vergleich: die Eins als Gleitkommazahl Head@1.D Real und die Eins als ganze Zahl. Head@1D Integer Eine Gleitkommazahl mit einem Exponent ungleich 0 wird durch das Anfügen einer Basis hoch Exponent, z.B. 10^3, angegeben.
8 MmaCrashKurs.nb à Eigenschaften Gleitkommazahl können beliebig groß und präzise sein. Es gibt jedoch eine Einschränkung. Die Hardware eines Rechners umfaßt meist einen Koprozessor, der für eine schnelle Verarbeitung der Gleitkommazahlen sorgt. Damit dies auch für Mathematica zutrifft, sollten Gleikommazahlen nicht größer als $MaxMachineNumber und nicht kleiner als $MinMachineNumber sein. Außerdem sollte die Anzahl der signifikanten Ziffern in der Mantisse die $MachinePrecision nicht übersteigen. Ist die Verarbeitungsgeschwindigkeit nicht relevant, können auch Gleitkom- mazahlen bis zu einer Größe von $MaxNumber in Mathematica verrechnet werden. Die Grenze $MaxNumber kann auch verschoben werden. Bekanntlich können in Gleitkommarechnungen Rundungsfehler auftreten, die bei instabilen numerischen Algorithmen verheerende Ausmaße annehmen können. In Mathematica kann diesem Effekt nur bedingt durch höhere Rechen- genauigkeit Einhalt geboten werden. Beispiele: N@Π, 100D 3.14159265358979323846264338327950288419716939937510582097494459230781640 6286208998628034825342117068 N@2 Π, 100D 6.28318530717958647692528676655900576839433879875021164194988918461563281 2572417997256069650684234136 Achtung! Mathematica kann natürlich keine Dezimalstellen erfinden. Ist die Eingabe ungenau, gilt dies auch für die Ausgabe. N@2.0 Π, 100D 6.28319 Komplexen Zahlen à Eingabe Ein I oder ä kennzeichnet den imaginären Teil einer komplexen Zahl. Der Wert des reellen und imaginären Anteils wird mit ganzen, rationalen oder Gleitkommazahlen angegeben. Beispiel: 2.1 - 3 ä 5 3I 2.1 - 5 à Eigenschaften Obwohl eine komplexe Zahl als ein aus Real- und Imaginärteil zusammengesetztes Zahlentupel aufgefaßt werden kann, handelt es sich in Mathematica um einen atomaren Datentyp. Die Einführung eines separaten, atomaren Datentyps ermöglicht eine höhere Effizienz bei der Verabeitung komplexer Rechnungen. Komplexe Zahlen haben in Mathematica den "Kopf" Complex.
MmaCrashKurs.nb 9 Beispiel: Head@1 - 3.14 ID Complex Die numerischen Eigenschaften einer komplexen Zahl richten sich nach den Eigenschaften der Zahlen, die den Real- und Imaginärteil bestimmen. So werden beispielsweise komplexe Zahlen mit ganzahligen Koeffizienten exakt verrechnet. Beispiel: H4 + 6 äL H2 - äL 2 16 I + 5 5 Texte à Eingabe Texte werden durch Anführungsstriche oben gekennzeichnet. Die Anführungsstriche umrahmen den Text, welcher aus Buchstaben, Ziffern, Satz-, Sonder- und Formatierungszeichen bestehen kann. Einige Besonderheiten sind zu beachten: \" kodiert Anführungstriche innerhalb eines Textes. \t kodiert ein TAB (Tabulator-Zeichen). \n kodiert einen Zeilenumbruch. \\ kodiert einen backslash \. \xxx kodiert ein Zeichen im octalen ACII-Kode xxx. Beispiel: "Es gibt einige Ausnahmen:\n \\\" \t \\t \t \\n" Es gibt einige Ausnahmen: \" \t \n à Eigenschaften Ein Text wird in Mathematica durch den "Kopf" String gekennzeichnet und kann durch den boolschen Befehl StringQ verifiziert werden. Beispiel: Head@"Mein Name ist Hase."D String
10 MmaCrashKurs.nb StringQ@"Ich weiß von nichts!"D True Texte werden in Mathematica durch Text-spezifische Befehle verabeitet. Alle diese Befehle beginnen mit String. ? String* String StringPosition StringBreak StringQ StringByteCount StringReplace StringDrop StringReplacePart StringForm StringReverse StringInsert StringSkeleton StringJoin StringTake StringLength StringToStream StringMatchQ Symbole à Eingabe Eine beliebige Zeichenfolge, die mit einem Buchstaben beginnt und weiter aus bis zu 255 Buchstaben oder Ziffern besteht, wird von Mathematica als Symbolname und somit als Symbol aufgefaßt. Sonderzeichen (wie z.B. $, _, /, `, etc.) sollte man in Symbolnamen nicht verwenden, auch wenn dies Mathematica-intern geschieht (z.B. $Machine- Name). Außerdem ist zu beachten, daß zwischen Groß- und Kleinschreibung unterschieden wird. Seit Version 3.0 umfaßt Mathematica eine beachtliche Menge mathematischer, griechischer und internationaler Buchsta- ben und Sonderzeichen (wie z.B, Ω = Ω, ß = ß, ü = ü, ∑ = ∑). Diese können, sofern Sie nicht wie zum Beispiel ∑ mit einer Funktion behaftet sind, in Symbolnamen eingebaut werden. (Siehe hierzu A.12.1 Introduction) à Eigenschaften Symbole dienen als Platzhalter für alle erdenklichen Mathematica-Ausdrücke und als Namensgeber für Typendeklara- tionen oder Operationen. Da Symbole in einer SMP-Sprache wie Mathematica eine zentrale Rolle spielen, wollen wir an dieser Stelle nicht vorgreifen. Der Gebrauch der Symbole wird im Laufe dieses Kurses mehrfach eingehend diskutiert. Beispiele: Das Symbol Pi bzw. Π dient als Platzhalter einer numerischen Konstante. Head@ΠD Symbol Den numerischen Wert des Symbols Pi können wir mit der Funktion N extrahieren. ?N N@ausdrD ergibt den numerischen Wert von ausdr. N@ausdr, nD versucht, ein Ergebnis mit n-stelliger Präzision anzugeben.
MmaCrashKurs.nb 11 N@Pi, 50D 3.1415926535897932384626433832795028841971693993751 Das Symbol Sin dient als Name einer Funktion. Head@SinD Symbol Sin@Pi 3D !!! 3 2 Das Symbol Expand dient als Name eines Mathematica-Kommandos. Head@ExpandD Symbol Expand@Hx - 1L3 D -1 + 3 x - 3 x2 + x3 Listensemantik Wie bereits erwähnt, können atomare Ausdrücke zu komplexeren Ausdrücken zusammengesetzt werden. Es gibt zwei semantische Interpretations- bzw. Einsatzmöglichkeiten dieser Listenstrukturen. à Datenstrukturen Computerdaten bestehen immer aus zwei Teilen; aus den "reinen" Daten, die als Bits und Bytes gespeichert werden, und aus deren Semantik, die angibt, wie die "reinen" Daten zu interpretieren sind. In herkömmlichen Programmiersprachen wird die Semantik der Variablen und Konstanten zu Anfang eines jeden Programms durch eine Typendeklaration festgelegt. Die Zuweisung und Verarbeitung der "reinen" Daten wird hiervon getrennt später vorgenommen. In Mathematica werden die reinen Daten und deren Typendeklaration nicht voneinander getrennt. Alle Daten tragen zu jeder Zeit ihre Typendeklaration als Aushängeschild mit sich. In der oben angesprochenen Listenstruktur geschieht dies wie folgt: Typendeklaration[Daten...] Beispiel: Im Zusatzpaket Algebra`Quaternions` wird der Zahlentyp der Quaternionen, eine nicht-kommutative Erweiter- ung der komplexen Zahlen, definiert. Ein Quaternion a + b ä + c ü + d ä ü mit reellen a,b,c,d, sowie ä2 = ü2 = -1 und ä ü = -ü ä, besteht aus 4 Komponenten und ist in Mathematica wie folgt implementiert. a+bä+cü+däü ® Quaternion[a,b,c,d]
12 MmaCrashKurs.nb Die Definition mit dem Listekopf Quaternion ist zunächst willkürlich. Erst die im Zusatzpaket implementierten Funktionen und Operationen, die diese neue Listenstruktur verarbeiten, geben der Typendeklaration einen Sinn. Summation: Quaternion : Quaternion@a_, b_, c_, d_D + Quaternion@e_, f_, g_, h_D := Quaternion@a + e, b + f, c + g, d + hD Nicht-kommuntative Multiplikation: Quaternion : Quaternion@a_, b_, c_, d_D ** Quaternion@w_, x_, y_, z_D := Quaternion@ a w - b x - c y - d z, a x + b w + c z - d y, a y - b z + c w + d x, az + by - cx + dw D à Funktionsstrukturen InMathematicawerden auch Funktionen,Operationen und Anweisungen in Listenform eingegeben und gegliedert.In diesem Zusammenhang bezeichnet der Listenkopf die Funktion,Operation oder das Kommando.Die Listenargumente stellen die entsprechenden Argumente dar. Operation[Argumente...] Diese offensichtliche Konstruktion werden wir anhand einiger Beispiel erläutern. Beispiele: Einfache Addition: Plus@1, 1D Skalarprodukt (im Englischen: dot product) zweier 3-dimensionaler Vektoren: Dot@List@a, b, cD, List@x, y, zDD Integration der Funktion sin2 HxL mit der Integrationsvariablen x: Integrate@Power@Sin@xD, 2D, xD Listendarstellung Man hat bereits sehen können, daß für gewöhnlich die Ein- und Ausgaben nicht in Listenform übergeben wird. Mathe- matica bietet dem Benutzer die Möglichkeit andere Formate zu nutzen. Intern allerdings gilt für jeden Ausdruck die oben angegebene Listenstruktur. Eine jede Eingabe in ein Mathematica-Notebook wird gemäß der im Mathematica Buch unter A .2 .7 aufgeführten Umformungsregeln in eine Listenstruktur umgewandelt.
MmaCrashKurs.nb 13 Beispiele: a+b ® Plus@a, bD 81, 2, 3< ® List@1, 2, 3D exprPiT ® Part@expr, iD à f@xD â x ® Integrate@f@xD, xD Bei der Ausgabe kann man zwischen verschiedenen Formaten wählen. Ohne expliziete Anweisung stellt Mathematica die Listenstrukturen in StandardForm dar. Eine traditionelle mathematische Notation erhält man mit TraditionalForm. Beispiel: Integrate@Abs@Sin@2 xDD x ^ 2, xD StandardForm: Abs@Sin@2 xDD â x à x2 TraditionalForm: sinH2 xL¤ à x2 â x Um den Datenaustausch mit anderen Programmen zu vereinfachen, gibt es einige spezielle Ausgabeformate. Beispiel: Programmiersprache C CForm@Abs@Sin@2 xDD x ^ 2D Abs(Sin(2*x))/Power(x,2) Typesettingsystem TeX TeXForm@Integrate@Abs@Sin@2 xDD x ^ 2, xDD \int \frac{\Mfunction{Abs}(\sin (2\,x))}{{\Mfunction{x}}^2}\,dx Mathematica Verarbeitungsmechanismen Anwendung Eingebauter Befehle Viele Mathematica-Anwender beschränken sich auf den einfachen Einsatz der eingebauten Mathematica-Befehle. Selbst bei dieser simplen Nutzung des Systems werden einige Konzepte übersehen, die hier schnell angesprochen werden sollen.
14 MmaCrashKurs.nb Auffinden eines Mathematica-Befehls Es ist unmöglich alle Mathematica-Befehle zu kennen. Daher bietet das System einige Hilfestellungen, um die benötigten Befehle zu finden. à Systematische Namensgebung Alle Befehle beginnen mit einem Großbuchstaben. Befehle mit zusammengesetzte Befehlsnamen werden zusammengeschrieben. Jedes Teilwort beginnt mit einem Großbuchstaben. Die Befehlsnamen werden nicht abgekürzt. Außnahmen sind nur die Standardkürzel bei mathematischen Funktionen (Sin, Tan, etc.) sowie (N, D) Numerische Kommandos beginnen mit N Boolsche Funktionen enden mit Q Formatierungsbefehle enden mit Form etc. à Online Hilfe In einer Eingabezelle kann man mit ? ein Kurzbeschreibung eines Befehls erhalten. Außerdem kann man mit dem Jokerzeichen * Befehle leicht ausfindig machen. à Help Browser Der Help Browser im Mathematica-Menü gewährt eine ausführliche Hilfestellung. Insbesondere sind die Querverweise bei der Beschreibung eingebauter Funktionen hilfreich. à Input Menü Im Eingabemenü befinden sich Kommandos, die Mathematica-Befehle erstellen oder ergänzen. Angabe der Argumente Es gibt zwei Methoden einer Funktion oder einem Kommando Argumente zu überreichen. à Stellungsdefinierte Argumente Stellungsdefinierte Argumente sind in der Mathematik hinreichend bekannt.Bei einer geringen Anzahl von Argumenten werde diese bei der Übergabe an eine Funktion durch Ihre Stellung in der Argumentenkette definiert. Beispiel:
MmaCrashKurs.nb 15 Das erste Argument einer Besselfuntkion gibt die Ordnung der Funktion, das zweite Argument die komplexe Variable an. ? BesselJ BesselJ@n, zD gives the Bessel function of the first kind JHn, zL. ä BesselJA2, 3 - E N 2 0.521116 - 0.00874396 ä à Optionen In Mathematica gibt es eine ganze Reihe von Kommandos, die sehr viele Argumente haben können. In diesen Fällen ist die Verwendung von stellungsdefinierten Argumenten unpraktisch, da immer alle Argumente aufgelistet werden müßten. Stattdessen bekommen die Argumente einen Namen. Dieser Argumentenname muß bei der Argumentenüber- gabe mit angegeben werden. In Mathematica geschieht dies in Form einer Ersetzungsregel (siehe weiter unten). Beispiel: Das Plot3D-Kommando hat 3 stellungsdefinierte Argumente und ein große Anzahl von Optionen. gr = Plot3D@ Sin@x yD, 8x, -2, 2
16 MmaCrashKurs.nb Options@Plot3DD 8AmbientLight ® GrayLevel@0D, AspectRatio ® Automatic, Axes ® True, AxesEdge ® Automatic, AxesLabel ® None, AxesStyle ® Automatic, Background ® Automatic, Boxed ® True, BoxRatios ® 81, 1, 0.4
MmaCrashKurs.nb 17 Umbau von Listen Eine Listen kann als Baumstruktur interpretiert werden. Beispiel: x ^ 2 a - b * Sin@xD == x Dieser Ausdruck entspricht folgender Baumstruktur. Es gibt diverse Mathematica-Befehle, um eine derartige Baumstruktur zu analysieren und zu manipulieren. Man stellt schnell fest, daß die direkte Manipulation von Listenstruktur ein Μ-sames Geschäft ist. Daher gehen wir nicht näher darauf ein, sonderen widmen uns den Symbol-orientierten Ersetzungsregeln. Analyse ? Head ? Depth ? Length ? LeafCount ? Position Manipulation ? Part
18 MmaCrashKurs.nb ? Level ? Delete ? Insert ? ReplacePart Ersetzungsregeln Es ist ein leichtes die eingebauten Mathematica-Befehle durch lokal oder global wirkende Ersetzungsregeln Marke Eigenbau zu ergänzen. Eine Regel besteht immer aus zwei Teilen: 1. einer Bedingung, die angibt wann eine Regel angewendet werden kann. 2. einem ausführenden Teil, der angibt was geschehen soll, falls die Bedingung erfüllt ist. Bedingung ® ausführende Anweisung Komplexe, mathematische Bedingungen werden in Mathematica mit Musten, sogenannten Patterns, implementiert. Dies ist Thema des nächsten Unterkapitels. Hier befassen wir uns zunächst mit der Eingabe einfacher Ersetzungsregeln. Lokale Ersetzungsregeln Lokale Ersetzungsregeln werden durch einen Pfeil gekennzeichnet.Eine lokale Ersetzungsregel wirkt nur auf den Ausdruck,auf den sie explicit angesetzt wird. Beispiel: Rekursion der Fibonacci-Zahlen. ? ReplaceAll ausdr . regeln wendet eine Regel oder eine Liste von Regeln an und versucht so jeden Teil des Ausdrucks ausdr zu transformieren. ?ReplaceRepeated expr . regeln führt wiederholt Ersetzungen durch, bis sich der Ausdruck ausdr nicht mehr ändert. fib@5D . 8fib@0D ® 1, fib@n_D ® n fib@n - 1D< 5 fib@4D fib@5D . 8fib@0D ® 1, fib@n_D ® n fib@n - 1D< 120
MmaCrashKurs.nb 19 Globale Ersetzungsregeln Globale Ersetzungsregeln gelten für eine ganze Mathematica-Sitzung, es sei denn sie werden zwischenzeitlich gelöscht. Globale Ersetzungsregeln werden als Anweisung mit Gleichheitszeichen = implementiert.Sie kommen automatisch zur Anwendung, indem ein Symbol als Auslöser agiert. Ein Replace-Befehl oder dergleichen wird nicht mehr benötigt. Beispiel: Das Symbol a soll von Π3 repräsentiert werden. a = Π 3; Von nun an wird a immer mit Π3 substituiert, 1 - Sin@aD !!! 3 1 - 2 egal ob gewollt oder ungewollt. Expand@H1 - aL3 D Π2 Π3 1 - Π + - 3 27 Alle durch das Symbol a ausgelösten Ersetzungsregeln kann man mit ? in Erfahrung bringen. ?a Global`a Π a = 3 Um eine bestimmte globale Zuweisung zu löschen, nimmt man den linken Teil der Zuweisung und wendet =. darauf an. a =. Um alle mit einem Symbol assozierten globalen Ersetzungsregeln zu entfernen, benutzt man Clear. Clear@aD; Ersetzungsregeln mit verzögerter Evaluierung Den Mechanismus der verzögerten Evaluierung gibt es sowohl für lokale wie auch für globale Ersetzungsregeln.- Verzögerte Zuweisungen werden mit ¦ statt ® und := statt = gekennzeichnet. Der Unterschied zwischen Ersetzung- sregeln mit unmittelbarer und mit verzögerter Evaluierung besteht in der Verabeitung des zu substituierenden Aus- drucks auf der rechten Seite der Ersetzungsregel.Normalerweise wird die rechte Seite gleich bei der Eingabe der Ersetzungsregel evaluiert,also noch bevor die Ersetzungsregel zur Anwendung kommt.Bei der verzögerten Evaluierung ist dies nicht der Fall.Der zu substituierende Ausdruck wird ohne jede Änderung übernommen und erst nach der Susbtitution evaluiert. Beispiel:
20 MmaCrashKurs.nb Alle für das Beispiel relevanten Symbole werden zunächst gelöscht. Clear@a, bD Fall der unmittelbaren Evaluierung: Angenommen b hat einen beliebigen Wert .... also gleich 1. b = 1; Wir setzen a gleich b, genaugenommen a gleich dem Ergebnis von b und somit gleich 1. a = b 1 ?a Global`a a=1 Ändert sich b später, z.B. b = 2; hat dies keine Auswirkungen auf a, da vorhin ja das Ergebnis von b und nicht das Symbol b dem a zugeschrieben worden ist. a 1 Fall der verzögerten Evaluierung: Zunächst wird wieder alles gelöscht. Clear@a, b, cD Angenommen b hat einen beliebigen Wert .... also wieder die 1. b = 1; Wir setzen a gleich b, aber mit verzögerter Zuordnung. a := b ?a Global`a a := b a ist also gleich Symbol b und nicht unbedingt gleich 1, obwohl dies momentan aufgrund der obigen Wertzuweiung zutrifft. a 1 Ändert sich b später,
MmaCrashKurs.nb 21 b = 2; hat dies eine Auswirkungen auf a, da vorhin das b dem a zugeschrieben wurde. b hat nun einen anderen Wert und somit auch a. a 1 Das gleiche gilt für lokale Ersetzungsregeln. Beispiel: Fall der unmittelbaren Evaluierung: a sei eine Zufallszahl zwischen 0 und 1. a = Random@D 0.430789 Listet man a nun 3 mal auf, bekommt man 3 mal die selbe Zufallszahl. Do@Print@aD, 83
22 MmaCrashKurs.nb Eine NValue-Zuweisung erfolgt, wenn das Symbol zur Linken mit dem N-Operator versehen wird. N@cD = 2.99792458 10 ^ 8 Meter Second 2.99792 ´ 108 Meter Second ?c Global`c N@cD = H2.99792458*^8 * MeterL Second c wird bei der symbolischen Rechnungen nicht angetastet! c^2 c2 Erst wenn ein numerischer Wert berechnet werden soll, wird die Ersetzungsregel aktiviert. N@c ^ 2D 8.98755 ´ 1016 Meter2 Second 2 Die eingebauten Konstanten Pi und E verhalten sich ebenso. à OwnValue-Zuweisung Ersetzungregel wird auf jedes Symbol symb angewendet. symb = ausdr symb := ausdr à NValue-Zuweisung Ersetzungregel wird nur im numerischen Kontext auf das Symbol symb angewendet. N@symbD = ausdr N@symbD := ausdr à FormatValue-Zuweisung Ersetzungregel wird bei der Ausgabe in Format form auf das Symbol symb angewendet. Format@symb, formD = ausdr Format@symb, formD := ausdr à DownValue-Zuweisung Ersetzungregel für Funktionen, Operationen und Datentypen mit dem Listenkopf symb.
MmaCrashKurs.nb 23 symb@ausdr1D = ausdr2 symb@ausdr1D := ausdr2 à UpValue-Zuweisung Objektorientierte Ersetzungsregel für Funktionen, Operationen und Datentypen mit dem Argument symb. ausdr1@symbD ^= ausdr2 ausdr1@symbD ^:= ausdr2 symb : ausdr1@ ..., symb, ...D ^= ausdr2 symb : ausdr1@ ..., symb, ...D ^:= ausdr2 Mustererkennung Im Gegensatz zur Numerik ist die Syntaxerkennung in der Symbolik recht kompliziert. Um zum Beispiel eine Glei- chung auflösen zu können, muß man den Gleichungstyp (linear, quadratisch, transzendent,...) identifizieren. Dies ist natürlich schwieriger als zum Beispiel die Summanden in einer Summe zu lokalisieren. Derartige Aufgaben werden in der Numerik bereits automatisch von den Compilern und Interpretern der Computersprachen übernommen. In der Symbolik muß man selber aktiv werden. Um das Problem der mathematischen Syntaxerkennung bewältigen zu können, bedient man sich in Mathematica der eingebauten Mustererkennung. Die Mustererkennung arbeitet mit sogenannten Patterns, die wie Schablone gehandhabt werden. _ ein Muster für einen beliebigen Ausdruck x_ ein Muster mit dem Namen x für einen beliebigen Ausdruck x:pattern ein Muster mit dem Namen x pattern ? test ein Muster, das paßt, wenn der test True ergibt _h ein Muster für einen beliebigen Ausdruck mit Kopf h x_h ein Muster mit Namen x für für einen beliebigen Ausdruck mit Kopf h __ ein Muster für eine Folge von einem oder mehreren Ausdrücken ___ ein Muster für eine Folge von keinem oder mehreren Ausdrücken x__ und x___ ein Muster mit Namen x für eine Folge von Ausdrücken __h und ___h ein Muster für eine Folge von Ausdrücken mit Kopf h x__h und x___h ein Muster mit Namen x für eine Folge von Ausdrücken mit Kopf h x_:v ein Muster mit dem Vorgabewert v x_h:v ein Muster mit dem Vorgabewert v für einen Ausdruck mit Kopf h x_. ein Muster mit einem globale definierten Vorgabewert Optional@x_hD ein Muster mit einem globale definierten Vorgabewert für einen Ausdruck mit K muster.. ein Muster, das ein - oder mehrmals wiederholt wird muster... ein Muster, das kein oder mehrmals auftritt muster1 È muster2 È … ein Muster, das mindestens mit einem der musteri übereinstimmen muß muster ; cond ein Muster, das paßt, wenn die Bedingung cond True ergibt HoldPattern@musterD ein nicht evaluiertes Muster Verbatim@ausdrD ein Ausdruck, der wortwörtlich passen muß
24 MmaCrashKurs.nb Beispiele: Die Muster richten sich nach den Listenstrukturen und können somit alles mögliche erfassen. SäuferFunktion@x_D := Print@"Diese Funktion hat ", x, " intus!"D SäuferFunktion@2 Bier + SchnapsD Diese Funktion hat 2 Bier + Schnaps intus! Muster mit gleichem Namen können nur identische Listen erfassen. TennisFunktion@scoreA_, scoreB_D := Print@"Es steht ", scoreA, " zu ", scoreB, "!"D; TennisFunktion@score_, score_D := Print@"Einstand!"D; TennisFunktion@30, 40D Es steht 30 zu 40! TennisFunktion@40, 40D Einstand! Muster könne auf einen beliebigen Datentyp geeicht werden. PrimfaktorZerlegung@n_IntegerD := FactorInteger@nD; Die Oder-Verknüpfung der Muster (|) sollte nicht mit einer Boolschen Oder-Verknüpfung (||) verwechselt werden. RationalQ@Hx_Integer È x_RationalLD := True; RationalQ@x_D := False; Alles in Mathematica besteht aus Listenstrukturen. Folglich sind auch Muster als Listen angelegt. Sie können dementsprechend zusammengesetzt und kombiniert werden. log@3 a b ^ 2 cD log@Times@x_, y_DD := log@xD + log@yD; log@Power@x_, n_DD := n log@xD log@3 a b ^ 2 cD Listenattribute Einige wichtige Fähigkeiten von Mathematica laufen im Hintergrund ab und werden daher kaum wahrgenommen. Beispiele:
MmaCrashKurs.nb 25 Sin@80, Π 5, Π 3, Π 2, Π
26 MmaCrashKurs.nb Regelbasierte Sprachen (Prolog, Lisp) Funktionale Sprachen (APL, Excel) Dementsprechend werden wir hier vorgehen. Prozedurale Programmierung Der prozedurale Programmierstil ist der bekannteste. Wie beispielsweise in Fortran, Pascal oder C werden hier die Befehle einer Programmiersprache durch sogenannte Steuerbefehle (z.B. Goto, If, While, Do-Loops, etc.) zu einem Algorithmus zusammengestellt. Entsprechende Steuerbefehle gibt es auch in Mathematica. Der Gebrauch der Befehle Do, For, While, If, ... etc versteht sich von alleine. Befehle die einfach nacheinander ausgeführt werden sollen, müssen mit Semikolon getrennt werden. Mit den Mathematica-Befehlen Block und Module können lokale Variablenumgebungen geschaffen werden. Block schirmt die Werte der lokalen Variablen ab. Module gewährleistet auch eine Abgrenzung der Variablennamen. Beispiel: Berechnung der Fibonacci-Zahlen: FibonacciZahl@n_IntegerD := Block@ 8dummy, fib0 = 1, fib1 = 1< H*Initialisierung lokaler Variablen*L, Do@ dummy = fib0; H*Rekursion:*L fib0 = fib1; H*fib@nD=fib@n-1D+fib@n-2D*L fib1 += dummy, 8n - 2< D; Return@fib1D H*Ausgabe des Ergebnisses*L D; Table@FibonacciZahl@iD, 8i, 10
MmaCrashKurs.nb 27 Clear@MyDiffD Konstantenregel: MyDiff@c_, var_D := 0 ; FreeQ@c, varD Potenzregel (mit Kettenregel): MyDiff@var_, var_D := 1; MyDiff@expr_ ^ n_, var_D := n expr ^ Hn - 1L * MyDiff@expr, varD ; FreeQ@n, varD Summenregel: MyDiff@f_ + g_, var_D := MyDiff@f, varD + MyDiff@g, varD Produktregel: MyDiff@f_ g_, var_D := MyDiff@f, varD g + f MyDiff@g, varD Diese vier Differentiationsregeln genügen bereits, um alle Polynome mit einer Variable zu differenzieren MyDiff@2 x ^ 2 - x Ha - xL, xD -a + 6 x MyDiff@Ha - xL ^ 2 x, xD Ha - xL2 2 Ha - xL - - x2 x Funktionale Programmiergung Das Credo der funktionalen Programmierung ist die Vermeidung von Programmschleifen, die in prozeduralen Program- men häufig auftreten. Stattdessen versucht man Operationen einzuführen, die Listen, Matrizen usw. als ganzes verarbe- iten. Die Listen orientierte Datenstruktur Mathematica's kommt diesem Programmierstil entgegen. Da in der funktionalen Programmierung Programmschleifen vermieden werden, lassen sich die Programme als Ver- schachtelung von Funktionen schreiben. Daher der Terminus Technicus. In Mathematica gibt es von der Rekusrion einmal abgesehen verschiedene Methoden um Programmschleifen zu umgehen. Alle Funktionen, die mit dem Attribut Listable versehen sind, werden bei Anwendung auf eine Liste mit Kopf List automatisch auf deren Elemente projeziert. Attributes@LogD 8Listable, NumericFunction, Protected< Log@81, 2, 3, 4, 5
28 MmaCrashKurs.nb Außerdem gibt es eine Reihe von Steuerbefehlen, die die Verarbeitung ganzer Listenstrukturen ohne Schleifen ermöglichen. Map@f, 81, 2, 3
MmaCrashKurs.nb 29 1. eine lokale Variablenumgebung sichergestellt, und 2. eine Schnittstelle für den Anwender definiert. Packages werden in Dateien mit dem Kürzel .m abgespeichert. Die Dateien sind wie folgt strukturiert. Die erste Zeile signalisiert den Begin eines Mathematica-Package hier mit dem Namen "Seminar`". BeginPackage@"Seminar`"D Hiernach werden, falls erfoderlich, andere Packages hinzugeladen. Needs@"PackageXY`"D
30 MmaCrashKurs.nb Sodann werden alle Befehle, die dem Anwender zur Verfügung gestellt werden sollen, deklariert. Nehmen wir an die Befehle lauten MyFirstCommand und MySecondCommand. MyFirstCommand::usage = "Dies ist mein 1. Befehl!" MySecondCommand::usage = "Dies ist mein 2. Befehl. Er kann ..." Wie man sieht, kann bei der Deklaration der Befehle ein OnLine-Text angegeben werden. Nachdem das Benutzer-Interface implementiert worden ist, wird eine lokale Variablenumgebung hergestellt. Alles was nun folgt ist für den Anwender, der das Package Seminar` einlädt, unsichtbar. Begin@"`Private`"D In diesem Teil eines Packages kann nach belieben programmiert werden. Außer den im Interface mittels usage deklarierten Befehlen dringt nichts nach außen und auch nichts nach innen. Das Ende eines Packages wird durch folgende Kommandos festgelegt. End@ D EndPackage@ D Die im AddOns-Verzeichnis niedergelegten StandardPackages können als Vorlage dienen. Fazit Dieser Crash-Kurs vermag die Grundzüge der Mathematica-Grammatik zu vermitteln. Das Vokabular der Mathematica- Befehle kann jedoch nur durch täglichen Umgang mit dem Programm erarbeitet werden. Übung macht den Meister! Bei den alltäglichen Problemen helfen folgende Adressen: Wolfram Research Webseiten: http : www.wolfram.com http : www.wolfram.co.uk http : www.wolfram.co.jp Mathematica User Group: http : library.wolfram.com mathgroup Happy Computing!
Sie können auch lesen