Um einen Wert oder einen Ausdruck für die spätere Verwendung zu speichern, musst du ihn einer Variablen zuweisen:
zaehler := a + b
nenner := x + sqrt(5)
zaehler/nenner
Das Zuweisungszeichen wird := geschrieben; diese Schreibweise folgt den Regeln der Programmiersprache Algol 60 und weiterer Sprachen wie z.B. Pascal.
Du siehst, dass die Namen zaehler, nenner durch die ihnen zugewiesenen Ausdrücke ersetzt wurden.
Eine nicht mehr benötigte Benennung entfernst du mit dem Befehl kill:
kill(zaehler);
Nach der Ausführung dieses Befehls steht der Name zaehler wieder für sich selbst:
zaehler/nenner;
Die große Stärke von Reduce ist die Fähigkeit, mit symbolischen Ausdrücken zu rechnen:
frac1: 1/(x**2 + 1)
frac2: 3/(1 - x**2)
frac1 + frac2
Ab hier nicht durchgesehen
Eine Anweisung an Maxima beginnt mit dem Namen des Befehls, den du ausführen lassen möchtest. Zusätzliche Angaben werden in runden Klammern hinter den Befehlsnamen geschrieben. Ein Befehl kann sich über so viele Eingabezeilen erstrecken, wie erforderlich sind. Jeder Befehl muss durch ein Semikolon oder durch ein Dollarzeichen abgeschlossen werden.
Wurzelausdrücke im Nenner eines Bruchs sind nicht immer zweckmäßig. Wenn sie stören, wird man versuchen, sie durch Erweiterung des Bruchs mit einem passend gewählten Faktor zu beseitigen.
expr: 1/(sqrt(x) + 1); ratsimp(expr),algebraic:true;
Das war ziemlich einfach: Um die Wurzel aus dem Nenner zu entfernen, wird der Bruch mit erweitert. Dieser Multiplikator ergibt sich aus der dritten binomischen Grundformel.
Du kannst dir wesentlich kompliziertere Aufgaben überlegen:
summe: sqrt(x) + x**(1/3); expr: 1/summe; ergebnis: ratsimp(expr),algebraic:true;
Das ist ein erstaunliches Ergebnis. Aus dem Beispiel kannst du im übrigen den von Maxima verwendeten Erweiterungsfaktor ablesen, da der nicht erweiterte Bruch den Zähler 1 hat.
Beachte übrigens, dass das Ergebnis der Kehrwert von summe ist. Das Produkt von summe und ergebnis sollte also 1 sein. Das probierst du doch jetzt gleich mal aus:
summe*ergebnis;
Das Ergebnis ist leider nicht ausmultipliziert:
Du musst also noch vereinfachen lassen. Der Befehl ratsimp leistet das hier erforderliche Ausmultiplizieren:
ratsimp(summe*ergebnis);
1
Voila !
Im Schulberieb wird die dritte binomische Grundformel verwendet, um Nenner rational zu machen, in denen eine Quadratwurzel vorkommt. Das allgemeine Verfahren für das Rationalmachen eines Nenners geht weit über den Schulstoff hinaus, es ist auch in Formelsammlungen nicht zu finden.
solve((a + b)*x - c/(d - e) = 0, x);
ratsimp vereinfacht die erhaltene Lösung nicht, aber factor schafft es dann doch, den Nenner als Produkt zu schreiben.
Hier löst du eine quadratische Gleichung:
solve(2*x^2 + 12*x - 48 = 0, x);
Die beiden Lösungen dieser quadratischen Gleichung werden durch ein Komma getrennt in eckigen Klammern angegeben. In der Terminologie von Maxima heißt eine solche Aufzählung eine Liste. Genauer gesprochen werden die Lösungen der Gleichung als eine zweielementige Liste angezeigt.
Du kannst Gleichungen automatisch lösen lassen, bekommst aber die Rechenschritte, die zur Lösung führen, nicht angezeigt. Maxima ist also nicht der ideale Hausaufgabenassistent. Das ist bei anderen Computeralgebrasystemen allerdings genauso: Sie sind nun einmal keine Hausaufgabenhelfer, sondern darauf getrimmt, Rechenergebnisse so schnell als möglich zur Verfügung zu stellen.
Die Lage ist allerdings nicht hoffnungslos. Du kannst eine Gleichung eingeben und schrittweise umformen:
3*x - d = 4*b + 11; % + d; %/3;
Dieses Verfahren funktioniert, weil Maxima eine Grundregel beachtet, die auch du beachten musst, wenn du eine Gleichung umformst:
Jede Rechenoperation, die auf eine Gleichung angewendet wird, muss auf beide Seiten der Gleichung angewendet werden.
Das Verfahren der schrittweisen Umformung einer einer Gleichung kannst du nutzen, um die Richtigkeit aller Rechenschritte in deinen selbstgerechneten Hausaufgben zu prüfen. Gelegentlich kann es aber vorkommen, dass deine Ergebnisse etwas anders aussehen als die von Maxima, obwohl sie richtig sind.
Gucken wir uns das folgende Beispiel an:
3*x - d = 4*b + 11/7; % + d; %/3;
Eine Bruchzahl im Zähler eines Bruchs ist nicht schulüblich - also weg damit.
ratsimp(%);
Wenn dich der gemeinsame Bruchstrich stört, kannst du das Ergebnis auch in eine Summe von Brüchen umwandeln:
ratexpand(%);
Diese Umwandlung hat den schönen Nebeneffekt, dass die rationalen Koeffizienten der einzelnen Summanden gleich gekürzt werden.
Die Scheitelpunktform der Parabelgleichung hat eine der Formen
Aus diesen Formen kann die y-Koordinate des Scheitelpunkts sofort abgelesen werden; sie ist .
Die x-Koordinate des Scheitelpunkts ergibt sich als die Lösung der Gleichung .
Um die Scheitelpunktform zu erhalten, muss der Teilausdruck zu einem vollständigen Quadrat ergänzt werden.
y = x**2 + 5*x - 7; % - 7; % + (5/2)**2; factor(%); % - 53/4;
Faktorisierung mit factor kann für die Herstellung der Scheitelpunktform nur verwendet werden, wenn der Koeffizient des linearen Glieds nicht irrational ist. Für einen irrationalen Koeffizienten muss im Aufruf von factor das Minimalpolynom dieses Faktors angegeben werden, damit im richtigen Erweiterungskörper faktorisiert werden kann.
Als weitere Übung für Fortgeschrittene könnte man dieses Verfahren programmieren.
Mit dem Befehl solve können nicht nur Gleichungen, sondern auch Gleichungssysteme gelöst werden. Dafür musst du allerdings die Schreibweise von Gleichungssystemen kennen und die ist ziemlich gewöhnungsbedürftig.
Beispiel 1:
g1: -2*x - 3*y = 3$ g2: -3*x + 2*y = -4$ solve([g1, g2]);
Du kannst die Liste mit den zwei Gleichungen auch direkt in den Befehl solve eingeben:
solve([-2*x - 3*y = 3, -3*x + 2*y = -4]);
Wenn du eine Rechenprobe machen willst, solltest du das Gleichungssystem benennen:
glsys: [-2*x - 3*y = 3, -3*x + 2*y = -4]$ loesungen: solve(glsys)$ ev(glsys, loesungen);
f(x) := x^2;
Funktionen mehrerer Veränderlicher werden ganz ähnlich angeschrieben:
f(x, y) := x^2 + y^2;
makelist(i, i, -5, 5);
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Bei der Herstellung von Zahlenfolgen kannst du natürlich deinem Ideenreichtum freien Lauf lassen:
makelist(i^2 - i, i, -5, 5);
[30, 20, 12, 6, 2, 0, 0, 2, 6, 12, 20]
Du kannst Folgen auch mit symbolischen Ausdrücken bilden. Hier hast du ein paar Beispiele zum Ausprobieren. Überlege dir, welches Ergebnis du erwartest und vergleiche dnn mit dem tatsächlichen Ergebnis:
makelist((x + y)^i, i, -5, 5);
[]
makelist(expand((a + b)^i), i, -5, 5);
[]
Zahlenfolgen sind kein Selbstzweck, sie werden bei der Herstellung von Wertetabellen und Diagrammen häufig als Hilfsmittel verwendet.
Für die Herstellung einer Wertetabelle verwendest du eine Zahlenfolge, um festzulegen, für welche Werte du einen Ausdruck oder eineFunktion auswerten lassen willst.
Die Berechnung der Werte eines Ausdrucks geschieht anders als die Berechnung der Werte einer Funktion.
create_list(x^2, x, makelist(i, i, -5, 5));
[25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
f(x) := x^2;
map(f, makelist(i, i, -5, 5));
[25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
Die Funktion map verwendest du, um eine Funktion auf alle Elemente einer Liste anzuwenden. Du könntest auch sagen, dass map die Funktionswerte für alle in der Liste enthaltenen Argumentwerte berechnet.
Anstelle einer Wertetabelle wirst du oft einen Funktionsgraph bevorzugen.
Hier enthält MaximaOnAndroid im Augenblick einen Fehler: Nach der Rückkehr aus der Diagrammsicht wird die Maxima-Sitzung nicht vollständig wiederhergestellt. Die Funktionsdefinition geht verloren, was die Verwendbarkeit des Diagramms stark vermindert.
f(x) := exp(-x/2)*sin(x); plot2d(f, [x, 0,4*%pi]);
Das ist das Diagramm einer gedämpften Schwingung. Der Wertebereich der y-Achse wurde automatisch so bestimmt, dass der Funktionsverlauf vollständig sichtbar ist
Den Wertebereich der y-Achse kannst du natürlich ebenfalls festlegen:
f(x) := exp(-x/2)*sin(x); plot2d(f, [x, 0,4*%pi], [y, -10, 10]);
f(x) := exp(-x/2)*sin(x); g(x) := exp(-x/2)*cos(x); plot2d(f, g, [x, 0, 4*%pi]);.
10. Klasse
Das ist jetzt schon ziemlich trickreich.
Der Differenzenquotient ist ein ziemlich raffinierter Begriff und die Berechnung des Diferenzenquotienten für eine vorgegebene Funktion kann ziemlich aufwendig sein. In Maxima kannst du die Definitionen aber fast so hinschreiben, wie sie im Mathematikbuch stehen. Die Rechnungen erledigt dann dein Computer.
Hier berechnest du den Differenzenquotienten der Funktion 1/x:
f(x) := 1/x; diffQ: (f(x0 + h) - f(x0))/h; vereinf: ratsimp(diffQ); res: limit(vereinf, h, 0); ev(res,x0=3);
Der Übergang von diffQ zu vereinf muss erklärt werden: Maxima vereinfacht hier nicht automatisch; du musst die Funktion ratsimp (rational simplification, rationales Vereinfachen) verwenden, um den Doppelbruch wegzubekommen.
Wenn du den Differenzenquotienten aus der Quadratwurzel berechnest, ist gar kein rationales Vereinfachen erforderlich:
r(x) := x^(1/2); diffQ: (r(x0 + h) - r(x0))/h; res: limit(diffQ, h, 0); ev(res,x0=3);
Die bekannten trigonometischen Identitäten ermöglichen eine geradezu unübersehbare Vielfalt von Umformungen, von denen etliche nur in speziellen Situationen hilfreich sind.
Bei der Umformung trigonometischer Ausrücke können zwei grundsauml;tzliche Umformungsziele unterschieden werden:
Die Entfernung von Potenzen trigonometischer Funktionen - im Gegenzug erhält man Funktionen des vielfachen Winkels
Die Entfernung von Funktionsausdrücken, die ein Vielfaches eines Winkels enthalten - im Gegenzug erhält man Potenzen trigonometrischer Funktionen des einfachen Arguments.
Das erste Umformungsziel - Entfernung von Potenzen trigonometrischer Funktionen - wird mit dem Befehl trigreduce erreicht, das zweite Umformungsziel mit dem Befehl trigexpand.
...
Es verdient erwähnt zu werden, dass Maxima alle sechs trigonometrischen Funktionen kennt - auch die Funktionen Secans und Cosecans, die im Schulunterricht überhaupt keine Rolle spielen.
trigrat(1/sec(x));
cos x
trigrat(1/csc(x));
sin x