Durch meine Nachhilfe für Mathematik habe ich den Taschenrechner TI nspire kennengelernt und bin total beeindruckt, was heute die »Technik in der Hosentasche« kann. Der Inhalt des Mathematikunterrichts hat sich (oder besser: sollte sich) dadurch stark verändert (haben), denn was ich in den 1990er Jahren noch mühsam per Hand berechnet habe, lässt sich heute durch den Taschenrechner blitzschnell beantworten.

Da ich selbst keinen solchen Taschenrechner besitze, aber dennoch einige Aufgaben berechnen musste, habe ich nach einem Programm unter Linux gesucht und bin mit Maxima auch fündig geworden.

Installation bei Debian

Das Hauptpaket mit dem Kommandozeilenprogramm heißt bei Debian maxima und als grafische Bedienoberfläche gibt es das Programm wxmaxima. In dem Zusatzpaket maxima-share sind noch diverse Erweiterungen für Maxima enthalten, die man zur Laufzeit laden kann.

Zum Paket wxmaxima sollte noch das Paket fonts-jsmath für eine bessere Darstellung der Ausgabe installiert werden.

apt install wxmaxima maxima-share fonts-jsmath

Für die Emacs-Nutzer gibt es auch das Paket maxima-emacs mit dem entsprechenden Modus.

Das Paket xmaxima bietet eine weitere grafische Oberfläche mit Tk/Tcl, die jedoch nicht so umfangreich wie wxmaxima ist und mehr wie eine Kommandozeile im Fenster wirkt.

Noch ein Wort zu wxmaxima: Bei mir ist (in der Version 19.07) die Symbolleiste übermäßig groß, was an meinem High-Res-Display liegen könnte. Andere Beeinträchtigungen sind mir bisher nicht aufgefallen.

Integration und Differentiation von Gleichungen

Grundlegende Bedienung

Maxima bietet Unterstützung für TeX, unter anderem die Ausgabe von TeX-Code, weshalb wxmaxima die Strukturierung von TeX-Dokumenten beherrscht. Über das Menü Zellen kann man diverse Gliederungen wie Überschriften und Textblöcke einfügen. Alle anderen Eingaben werden als Anweisung für Maxima verstanden. In einer (Eingabe-)Zelle können mehrere Anweisungen stehen, die mit Semikolon ; getrennt werden müssen, weshalb ein Druck auf Enter nicht zur Auswertung der Anweisung, sondern führt zu einem Zeilenumbruch führt. Die Auswertung erfolgt mit Shift+Enter, was sich aber in den Einstellungen auch umschalten lässt.

Mit Alt und den Cursor-Tasten Hoch und Runter kann man für die aktuelle Eingabe durch die Historie der Eingaben wandern und diese gegebenenfalls bearbeiten. Mit der Kombination Strg+K kann man sich für die aktuelle Eingabe eine Vervollständigung anzeigen lassen.

Funktionsdefinition

Definieren wir zuerst eine Funktion. Die Syntax ist sehr ähnlich zur TeX-Mathematiksyntax:

g(x) := x^2/(2 * %e^2);

Zur Definition einer Gleichung muss man := verwenden, denn = ist der Vergleichsoperator. Auch ohne die Angabe der Argumente betrachtet Maxima alle Buchstabenfolgen als Variablennamen, weshalb speziellen Zahlen wie der eulerschen Zahl e, der imaginären Einheit i oder der Zahl pi ein Prozentzeichen % vorangestellt werden muss.

g x :=x 2 2 2

Als Reaktion auf eine Anweisung liefert Maxima immer ein Ergebnis. Bei der obigen Zuweisung ist dies die Gleichung selbst. Die Rückmeldung des Ergebnisses kann auch unterdrückt werden, indem man die Anweisung mit dem Dollarzeichen $, anstatt des Semikolons abschließt.

»Gegeben ist noch die Funktion f mit dem Parameter t, wobei dieser größer Null seien muss.« Diese Einschränkung lässt sich mit assume Maxima vermitteln.

assume(t > 0)$
f(t,x):= x^2/2 * %e^-(x/t)$

Ableitungen und Extremwerte

»Von der Funktion f sind die Extremstellen in Abhängigkeit von t gesucht.« Hierfür benötigen wir die erste Ableitung und möchten wissen, für welche x diese null ist. Mit der Funktion diff können wir die Ableitung (der 3. Parameter bestimmt die Ordnung) einer Funktion berechnen lassen, wobei der zweite Parameter die Variable für die Ableitung bestimmt, und die Funktion solve löst eine Gleichung nach der Variablen auf, die im zweiten Parameter angegeben ist:

solve(diff(f(t,x), x) = 0, x);
x = 2 t ,x = 0

Verzögerte Berechnung

Da Maxima intern eine symbolische Repräsentation für die Ausdrücke nutzt, kann man die Auswertung dieser Ausdrücke mit dem Apostroph ' auch verhindern. Stellt man einem kompletten Term (oder nur einem Teil) einen Apostroph voran, so bleibt dieser als Formel stehen und wird nicht berechnet:

diff(f(1, x) - 'g(x), x);
diff('f(1, x) - 'g(x), x);
- x g x - x 2 -x 2 + x -x x f 1 ,x - x g x

Bei Maxima werden die Begriffe noun für eine Formel und verb für ein berechnetes Ergebnis verwendet.

Am Ende einer Anweisung können verschiedene Parameter stehen, die die Ausführung beeinflussen. Ein solcher Parameter ist nouns, der bewirkt, dass alle noun-Terme (Formeln) in verb-Terme (Werte) überführt werden.

Praktisch bei Maxima ist auch, dass man auf frühere Eingaben und Ergebnisse mit %iNUM bzw. %oNUM zugreifen kann, wobei _ eine Abkürzung für die letzte Eingabe und % eine Abkürzung für das letzte Ergebnis ist. Damit lässt sich leicht schrittweise eine Berechnungsfolge durchgehen:

'diff(x^2, x);
%,nouns;
'f(1, 2), nouns;
x x 2 2 x 2 -2

Gleichheitstest

Als nächstes soll gezeigt werden, dass die Extrempunkte von f auch auf g liegen. Ein Ausdruck 1 = 3 ist für Maxima jedoch eine Gleichung, die nicht ausgewertet wird. Dies kann man mit der Funktion is oder dem Ausführungsparameter pred erreicht werden.

is(g(0) = f(t,0));
g(2*t) = f(t, 2*t), pred;

Für beide Ausdrücke kommt das Ergebnis true heraus.

Integration

Nun soll die Fläche (in Abhängigkeit von t) zwischen von beiden Graphen zwischen den Extremstellen bestimmt werden.

An dieser Stelle wäre zu meiner Schulzeit Schluss gewesen, denn das Integral von f lässt sich nicht so leicht bestimmen. Aber Maxima bietet die Funktion integrate. In der ersten Anweisung soll noch nicht das Ergebnis berechnet werden, was mithilfe des Apostrophs erreicht wird. In der zweiten Anweisung soll das Ergebnis berechnet und in die Variable A gespeichert werden, da wir es später noch brauchen.

integrate('f(t,x) - 'g(x), x, 0, 2*t);
A: %,nouns;
0 2 t f t ,x - g x x -2 3 2 - 19 t 3 3

Auswertung von Ausdrücken

Nun lautet die Frage, wie das Verhältnis des Flächeninhalts bei der Verdoppelung von t zum Ursprung ist. Hierfür muss der Term in A mit t=2*t ausgewertet werden, was mit der Funktion ev möglich ist. Als Parameter akzeptiert diese Funktion Ausdrücke der gewünschten Form und die Berechnung ev(A, t=2*t) / A ergibt 8.

Die Funktion ev ist es auch, die hinter der Auswertung aller Ausdrücke steckt. So erklärt sich auch die ungewöhnliche Syntax, dass man bei einem Ausdruck noch Auswertungsparameter angeben kann. Unter anderem bietet die Funktion ev auch einen Parameter numer für die numerische Auswertung, womit Werte wie %e oder %pi als Zahlen berechnet werden. Somit ergibt die Anweisung A, t=3, numer; das Ergebnis 3.857666566539228.

Ableitung

Eine typische Extremwertaufgabe bei Funktionen ist: Von einem zu bestimmenden Punkt U auf dem Graphen von f mit t=2 und dem Koordinatenursprung entsteht ein Rechteck. Für welchen Punkt U entsteht das größte Rechteck?

Auch diese lässt sich leicht mit Maxima lösen:

rect: f(2, x) * x$
solve(diff(rect, x) = 0, x);

Es gibt zwei Lösungen dieser Gleichung: [x = 0, x = 6]. Damit diese Extremstellen auch ein Maximum sind, muss die zweite Ableitung an der Stelle negativ sein:

is(at(diff(rect, x, 2), x=0) < 0);
is(at(diff(rect, x, 2), x=6) < 0);

Somit ergibt sich, dass sich nur an der Stelle x=6 das größte Rechteck mit der Fläche von rund 5,3 (rect, x=6, numer;) befindet.

Weiterführende Funktionen von Maxima

Bei Maxima gibt es auch eine eingebaute Dokumentation. Mit ? … kann man für diverse Terme eine Information erfragen (wichtig ist das Leerzeichen hinter dem Fragezeichen): ? % oder ? integrate. Mit zwei Fragezeichen kann man nach Fragmenten suchen: ?? integr.

Ein komplettes Handbuch gibt es auch in der Shell mit info maxima.

MathML

Mit wxmaxima bekommt man bereits schön formatierte Ausgaben, was das Arbeiten erleichtert. Im Datei-Menü gibt es auch die Funktion, die aktuelle Sitzung als HTML zu exportieren. Ich habe aber auch das Paket alt-display gefunden, mit dem man auch MathML exportieren kann, so dass ich es hier in den Markdown-Text einbetten kann.

Über die Kommandozeile konnte ich so die Ausgaben von Maxima mit dem folgendem Programm generieren:

maxima -q --batch =(
  echo 'load("alt-display.mac")$ set_alt_display(2,mathml_display)$';
  sed '/^    /!d; s///; /apt/d' Maxima.md
) |sed '/<math/,/<\/math>/ { N;N;N;N;
  s/ *<math /<math display=block /; s+ML">.*,</mo>+ML">\n +;
  s, </mfenced> </math>,\n</math>,;
}; s/  *$//'

Der sed-Aufruf am Ende dient nur zum Aufhübschen des MathML, weil ich die Ausgabenummerierung nicht haben will. Hilfreich ist aber <math display=block zur abgesetzten Formatierung der Formeln.

Alternativen und Erweiterungen zu Maxima

MaximaOnAndroid

Von Maxima gibt es auch eine Android-App MaximaOnAndroid, aber leider nur im Play-Store, auch wenn der Quelltext bei Github zu finden ist, wird für F-Droid kein Paket gebaut, da die Abhängigkeiten zu groß sind.

Octave

Octave kannte ich als als Nachbau von Matlab zur Berechnung mit Vektoren und Matrizen. Früher habe ich es für die Algebra- und die Numerikvorlesungen genutzt. Es gibt für Octave aber auch ein Paket für symbolisches Rechnen, mit dem man Ableitungen oder Integrale bestimmen kann. Ausprobiert habe ich es jedoch nicht.

Cantor

Als grafische Oberfläche zu Maxima gibt es noch das Programm Cantor (im gleichnamigen Paket cantor). Dieses ist eine KDE-Oberfläche und sieht etwas ansprechender aus als wxmaxima, aber bietet nicht so viele Funktionen über das Menü. Die Eingabevervollständigung gibt es mit der Tabulatortaste.

Cantor ist eine Oberfläche für verschiedene Systeme und kann mit mehr als mit Maxima arbeiten. Es unterstützt zum Beispiel auch Octave, Python und R. Diese Backends müssen gezielt über die entsprechenden Pakete cantor-backend-… installiert werden.

Ich habe jedoch nur rudimentär damit experimentiert, so dass ich keine tiefer gehenden Erfahrungen schildern kann.

SageMath

SageMath ist ebenso wie Cantor ein Aufsatz, der verschiedene Mathematiksysteme (Maxima, Octave, Python, R) nutzen kann. Der Vortrag »System for Algebra and Geometry Experimentation (SageMath)« von den Grazer Linuxtagen 2019 wirkt beeindruckend, aber bei meinen Versuchen, die obigen Aufgaben zu lösen, bin ich nur auf Syntaxfehlermeldungen gestoßen. Bei einem anderen Anlass würde ich es jedoch noch einmal probieren.

Neben dem Schnelleinstieg habe ich von der Hochschule Mittweida noch eine Einführung in Sage gefunden, die zwar auf einer veralteten Oberfläche beruht, aber die grundlegende Arbeitsweise vermittelt. Weiterhin gibt es noch vom Initiator des Projekts eine englische Einführung in Sage mit der Geschichte, den Zielen und Beispielen (interessant ab der 38. Minute) und andere Videos.

Das Praktische an Sage ist die Weboberfläche. Da Sage von Beginn an als eine Webanwendung entwickelt wurde, lässt es sich auch ohne Installation (das Debian-Paket zieht massig Abhängigkeiten von über 1 GB hinterher) nutzen: