Das Kommandofenster
Wir zeigen Dir, wie's geht!
"Hello, World!" und einfache Ausdrücke
Ah ja, der Klassiker. Dein erstes Programm in jeder Programmiersprache ist immer "Hello, World!". Wir wollen Dich da nicht enttäuschen, deswegen fangen auch wir mit diesem einfachen Beispiel im Kommandofenster an.
Falls du noch unsicher bist, welches das ist: unten im Hauptfenster findest Du einen lang gezogenen Abschnitt, in dem Text (u.A. die aktuelle Version) zu lesen ist. Wenn dieser Abschnitt nicht zu sehen ist, drücke [F2] um ihn wieder einzublenden. In der letzten Zeile solltest Du einen Pfeil am Anfang der Zeile (|<-) sehen können. Hier bist Du richtig.
Gebe nun
<- "Hello, World!"
ohne den führenden Pfeil in das Kommandofenster ein und bestätige mit [ENTER] (der Pfeil verdeutlicht in NumeRe immer Ein- und Ausgaben). NumeRe wird daraufhin mit
-> ans = "Hello, World!"
antworten. Glückwunsch! Du hast Deine erste Interaktion mit NumeRe soeben erfolgreich abgeschlossen.
Nun zu einer etwas fortgeschritteneren Aufgabe. Wir wollen, dass NumeRe Deinen Namen kennt und Dich mit der aktuellen Uhrzeit begrüßt. Dazu definieren wir eine Variable, die Deinen Namen enthält:
<- my_name = "Erik"
-> ans = "Erik"
Des Weiteren benötigen wir Deine Begrüßung. Dazu verwenden wir die Funktion timeformat() zusammen mit time() als Quelle für die aktuelle Zeit. Wir geben also in das Kommandofenster das folgende ein und bestätigen mit [ENTER]:
<- "Hallo " + my_name + "! Es ist jetzt " + timeformat("hh:mm", time()) + "."
-> ans = "Hallo Erik! Es ist jetzt 10:21."
Nochmals Glückwunsch! Du hast zum ersten Mal mit Variablen und Funktionen gearbeitet. Dabei sind Dir sicher ein paar Dinge aufgefallen: das Pluszeichen wird (auch) verwendet, um Zeichenketten miteinander zu verknüpfen. Außerdem erscheinen im Kommandofenster Zeichenketten, Funktionen und Operatoren in unterschiedlichen Farben. Das erleichtert die Arbeit, da du die verschiedenen Typen direkt auf den ersten Blick unterscheiden kannst.
Wenn Du willst, kannst Du Die letzte Zeile nochmals ausführen. Verwende dazu [PFEILTASTE-HOCH] und danach [ENTER]. Du wirst sehen, dass die Pfeiltasten ein Anwählen der letzten Befehle ermöglicht und nach der Ausführung entsprechend eine neue Ausgabe mit der aktualisierten Zeit erscheint.
Neben Zeichenketten kann NumeRe besonders gut numerische Ausdrücke verarbeiten. Auch dazu machen wir hier ein Beispiel. Das können ganz einfache Rechnungen oder richtig komplexe Ausdrücke sein, in denen mit Variablen und Funktionen hantiert wird.
<- 1+2+3
-> ans = 6
<- my_var = 3*_pi / 2
-> ans = 4.712389
<- cos(my_var) + sin(my_var)
-> ans = -1
<- 3i+15+7+21i
-> ans = 22+24i
Es ist auch möglich, mehrere Ausdrücke in einem Befehl auszuwerten, wie in dem folgenden Beispiel der Fakultät:
<- 1!, 2!, 3!
-> ans = { 1, 2, 6}
Berechnete Ergebnisse können auch als Zeichenketten verwendet werden, wenn man das Zeichen # zum Umwandeln in eine Zeichenkette voranstellt:
<- meaning_of_life = 5! / 4 + 2 * 3!
-> ans = 42
<- "Die Antwort auf das Leben, das Universum und den ganzen Rest lautet: " + #meaning_of_life
-> ans = "Die Antwort auf das Leben, das Universum und den ganzen Rest lautet: 42"
Arbeiten mit Kommandos
Kommandos unterscheiden sich von Funktionen darin, dass immer nur ein Kommando pro Ausdruck verwendet werden kann und dass Kommandos immer das Ende des Ausdrucks definieren. Außerdem geben nicht alle Kommandos Werte zurück. Diese können dann kein Teil eines anderen Ausdrucks sein, sondern müssen einzeln verwendet werden.
Beginnen wir mit einem Beispiel: um Funktionen numerisch zu integrieren, kann das Kommando integrate verwendet werden.
<- integrate x^2 -set [0:2]
-> ans = 2.666668
Das Ergebnis hat offensichtlich Rundungsfehler. Diese sind durch die recht grobe Standard-Schrittweite bedingt, welche man aber auch erhöhen kann. Dieses Kommando gibt also einen Wert zurück und kann damit auch der Abschluss eines Ausdrucks sein:
<- int_res = 2 * integrate x^2 -set [0:2] steps=10000
-> ans = 5.333333
Das Kommando print gibt dagegen keinen Wert zurück und wird verwendet, um Zeichenketten ohne die umschließenden Anführungszeichen darzustellen. Es muss am Anfang des Ausdrucks eingesetzt werden.
<- print "Die Antwort auf das Leben, das Universum und den ganzen Rest lautet: " + #meaning_of_life
-> Die Antwort auf das Leben, das Universum und den ganzen Rest lautet: 42
Ebenso gibt auch das Kommando define keinen Wert zurück, sondern definiert eine eigene Funktion, die dann wie alle anderen Funktionen in einem Ausdruck verwendet werden kann.
<- define my_func(x) := cos(x) + sin(x)
-> [...]
<- my_func(my_var)
-> ans = -1
Hinweis: Beachte dabei, dass Funktionen, die mittels define (und ähnlichen Kommandos) definiert wurden, nicht dasselbe sind, wie beispielsweise Funktionen in MATLAB. Deren Funktionalität wird von den sogenannten NumeRe-Prozeduren bereitgestellt (kommt in einem späteren Abschnitt). Durch define definierte Funktionen verbessern insbesondere die Lesbarkeit und vereinfachen die Parametrisierung von Ausdrücken.
Die ersten Plots
Um Daten zu visualisieren kennt NumeRe viele Plotting-Kommandos, die von ein- bis dreidimensional reichen. Für unseren Fall genügt uns zunächst einmal das 1D-Kommando plot, das verwendet werden kann, um einfache Funktionen oder Datenreihen zu visualisieren. Wir verwenden es mit Deiner im vorherigen Abschnitt neu definierten Funktion:
<- plot my_func(x)
Wie rechts zu sehen ist, wurde ein einfacher Linienplot von -10 bis 10 unter Verwendung der von Dir definierten Funktion erzeugt. Außerdem wird Dir auffallen, dass die y-Achse etwas größer gewählt wurde, als die Funktion eigentlich benötigte. Damit stellt NumeRe sicher, dass Ober- und Unterkante des Plots stets deutlich zu erkennen sind.
Auch wenn wir hier eine vorher selbst definierte Funktion verwendet haben, könntest Du den gleichen Plot auch durch die direkte Eingabe des Ausdrucks erzeugen. Lediglich die Legende des Plots wäre dann anders. Probiere es gerne mal aus:
<- plot cos(x) + sin(x)
Mit ein paar Optionen kann man das letzte Ergebnis nun noch aufhübschen und erreicht damit den Stil, der am häufigsten in Veröffentlichungen eingesetzt wird:
<- plot cos(x) + sin(x) "Meine Funktion" -set box title="Mein erster Plot"
Nun wird eine Box um den Plot angezeigt, wir haben einen schönen Titel und eine eigene Legende. Es gibt noch viele weitere Optionen, mit denen man seinen Plot modifizieren kann. So kann man ein zusätzliches Gitter hinterlegen (Option grid), die Achsen mit eigenen Beschriftungen versehen, z.B. xlabel="Zeit t [s]", oder unkompliziert auf logarithmische Skalierung umschalten (Optionen xlog und ylog).
Bei Legenden, Titeln und Achsenbeschriftungen wird auch eine vereinfachte LaTeX-Syntax unterstützt. Es können somit auch griechische Buchstaben mit der üblichen LaTeX-Syntax (z.B. \alpha oder \delta) verwendet werden.
Mit dem Kommando surf kann ein zweidimensionales Skalarfeld dreidimensional dargestellt werden. Wir demonstrieren das mit einem 2D-Sinus Kardinalis, der sogenannten "Sombrero-Funktion":
<- surf sinc(norm(x, y)) -set light
Hier wurde die umfassende Box vom vorherigen Plot automatisch übernommen. Dieses Verhalten hat das Ziel, den Stil der Plots untereinander stets möglichst beizubehalten. So werden alle Einstellungen, die für mehrere Plots in einer Reihe Sinn machen, übernommen. Plotspezifische Einstellungen, wie z.B. Titel oder Achsenbeschriftungen, werden selbstverständlich nicht für folgende Plots übernommen.
Hier wird übrigens keine Legende angezeigt, weil es bei solchen Darstellungen unüblich ist eine zu haben. Verwende hier lieber eine Überschrift über Deinem Plot. Das sieht professioneller aus.