Kurs:PC-Praktikum/Maxima

Aus Wikiversity

Einsatzmöglichkeiten (in der Schule)[Bearbeiten]

  • Lösen von Gleichungssystemen
  • Integrieren und Differenzieren
  • 2D-/3D-Plots
  • Implementation von Algorithmen
  • Rechnen mit Matrizen
  • weitere algebraische Operationen

Einführung I[Bearbeiten]

Da wxMaxima derzeit mit MacOS nicht kompatibel ist, können Sie auch die Version unter http://maxima.cesga.es/ verwenden.
Maxima hat viele Funktionen, vor allem aus der Analysis und der Linearen Algebra, wie Differenzieren, Integrieren, Matrizenrechnung, Lösen von Gleichungssystemen, Entwicklung von verschiedenen Potenzreihen und vieles mehr. Mithilfe der graphischen Oberfläche können vor allem einfacherer Befehle sehr schnell und einfach durchgeführt werden, ohne den Code für die Befehle zu kennen. Auch das Schreiben von Algorithmen ist möglich.

Einführung II[Bearbeiten]

Es gibt Eingabezeilen und Ausgaben, wobei Ersters mit %i(Nummer) bezeichnet und Zweiteres mit %o(Nummer) gekennzeichnet wird. Durch diese Bezeichnungen ist auch ein späteres Zugreifen auf die Inhalte möglich.

Mit shift return wird eine Ausgabe ausgewertet, ggf. ergänzt Maxima zur Eingabe noch ein Semikolon (falls nicht vorhanden), um die Eingabe abzuschließen. Eine Funktionszuweisung erfolgt mit ":=":

 f(x):=x^3-2*x 

Einführung III[Bearbeiten]

Durch Einsetzen in die Funktion kann diese an der entsprechenden Stelle ausgewertet werden:

 f(2) 

Variablen können durch ":" Werte zugewiesen werden:

 a:2 

Angenommen, dieser Befehl ist Input %i2, somit wird %o2 zu 2, also ist

 f(%o2) 

die Auswertung von f an der Stelle 2 ebenso wie

 f(a) 

Matrizen[Bearbeiten]

Matrizen können mit "matrix()" erzeugt werden. Die einzelnen Zeilen werden in eckigen Klammer [] angegeben und die Werte ebenso wie die Zeilen mit , getrennt:

 A:matrix([0,1,2],[1,3,0],[1,2,1])

Eine komponentenweise Multiplikation der Matrix mit sich selbst erfolgt mit "*" beziehungsweise "^", wohingegen die normale Matrixmultiplikation von mit sich selbst mit "." oder "^^" durchgeführt wird.

 A*A = A^2 
 A.A = A^^2

Determinaten werden mit "determinant()" bestimmt:

 determinant(A)

und das Inverse der Matrix mit "invert()":

invert(A)

Aufgaben[Bearbeiten]

Matrizenrechnung[Bearbeiten]

Gegeben seien die Matrizen , und :

Bestimmen Sie , , und .
Woran erkennen Sie, welche Multiplikation gemeint ist?

Stochastische Matrix[Bearbeiten]

Betrachten Sie die stochastische Matrix

und den Zustandsvektor

welcher die aktuelle Population in den entsprechenden Gebieten angibt.
Bestimmen Sie die Populationen in den Gebieten vor Jahren und in Jahren.

Gleichungen/-ssysteme lösen I[Bearbeiten]

Es gibt in Maxima verschiedene Befehle zum Lösen von Gleichungen, die verschiedenen Rahmenbedingungen genügen.
Die Befehle "linsolve" und "solve" lösen lineare oder kubische Gleichungssysteme sowie lineare Differentialgleichungssysteme. "solve" kann darüber hinaus auch Terme mit einer Unbekannten lösen. Sofern die Unbekannte eindeutig ist, ist deren Angabe nicht notwendig. Terme werden = 0 gesetzt. Der Befehl "algsys" löst Gleichungssysteme und setzt Polynome = 0. "algsys" funktioniert auch, wenn die Anzahl der Gleichungen ungleich der Anzahl der Variablen ist. Weiter Informationen zu den Befehlen sind im Maxima Manual zu finden.

Gleichungen/-ssysteme lösen II[Bearbeiten]

Im Weiteren wird hauptsächlich der "solve"-Befehl verwendet.

 solve([x^5-1 = 0],[x])

Dieser Befehl gibt für die Gleichung fünf Lösungen für aus. Dabei steht "%e" für die Eulersche Zahl. Die gleichen Ergebnisse gibt auch

 solve([x^5-1])
 solve([x+y],[x,y])

gibt Lösungen für die Gleichung aus, dabei steht "%ri", für eine beliebeige Zahl.

Gleichungen/-ssysteme lösen III[Bearbeiten]

 solve([x+y, x = a],[x,y])

liefert Lösungen für das Gleichungssystem aufgelöst nach und , jedoch abhängig von .

 solve([x+y],[x,y,z] 

liefert ebenfalls Lösungen für das Gleichungssystem, zusätzlich noch eine Lösung für , welche, da nicht in der Gleichung vorkommt, die Lösung "z=%ri", .

Gleichungen/-ssysteme lösen IV[Bearbeiten]

Die Gleichung liefert mit "solve" keine Lösung, der Befehl "algsys" liefert hingegen fünf komplexwertige Lösungen.

solve([x^5 - x^3 + 1 = 0],[x])
algsys([x^5 - x^3 + 1 = 0],[x])

Das Gleichungssystem bestehend aus den Gleichungen und liefert keine Lösungen, dies wird mit "[]" angegeben.

 linsolve([6 * x +12 * y = 30, 3 * x + 3 * y = 9],[x,y])

liefert für die Gleichungssysteme und ebenso wie

 algsys([6 * x +12 * y = 30, 3 * x + 3 * y = 9],[x,y])

die Lösungen und .

Aufgaben[Bearbeiten]

Lineare Gleichungssysteme[Bearbeiten]

Lösen Sie die linearen Gleichungssysteme.

Schnittpunkte von Funktionen[Bearbeiten]

Betrachten Sie die Funktionen und und bestimmen Sie deren Schnittpunkte mittels verschiedener Maxima-Funktionen.

Nullstellen[Bearbeiten]

Der Befehl "find_root()" mit den durch "," getrennten Argumenten Funktion, Variable, obere Intervallgrenze und untere Intervallgrenze gibt alle reelwertigen Nullstelllen einer Funktion in einem Intervall an. Zum Beispiel für die Funktion im Intervall liefert

 find_root(f(x),x,-2,2)

die Lösung. "allroots()" liefert alle Lösungen, auch die komplexwertigen. Als Argument genügt die Funktion.

 allroots(f(x))

"realroots()" liefert mit der Funktion als Argument die rationale Nullstelle, ggf. wird ein gerundeter Wert für reele Lösungen ausgegeben:

 realroots(x^2-2)

Aufgabe[Bearbeiten]

Nullstellen[Bearbeiten]

Bestimmen Sie alle Nullstellen der Funktion auf unterschiedliche Arten.

Beispiel-Funktion[Bearbeiten]

Die Beispielfunktion "example()" liefert mit einer Maxima-Funktion als Argument eines, zumeist mehrere Beispiele für eine Funktion.

example(solve)

Gängige mathematische Objekte I[Bearbeiten]

 %pi

liefert die Kreiszahl und die Wurzel von wird dargestellt mit

 sqrt(x)

"float()" mit dem Argument einer Zahl gibt die Fließkommazahl aus.

 float(%e)
 sum(i^2,i,1,4)

liefert die Summe über von bis analog zum Befehl "product()", welches mit den gleichen vier Argumenten das Produkt ausgibt.

Gängige mathematische Objekte II[Bearbeiten]

"makelist()" mit den analogen Argumenten wie "sum()" und "product()" gibt eine Menge endlicher Werte aus, welche über die Vorschrift im ersten Argument kreiert werden. Wird im Anschluss ein "[i]" mit i zwischen dem letzten und vorletzten Argument, so wird der Wert an der i-ten Stelle ausgegeben.

 makelist(1/n,n,1,10)
 makelist(1/n,n,1,10)[3]

Gängige mathematische Objekte III[Bearbeiten]

Der Grenzwert von Folgen oder Funktionen kann mit dem "limit()"-Befehl ermittelt werden. Dabei wird zwischen Folgen und Funktionen nicht unterschieden. Argumente sind die Vorschrift, die Variable, für welche der Grenzwert ausgegeben werden soll und wogegen diese laufen soll.

 limit(1/(n+1),n,0)

Um Grenzwerte gegen zu bestimmen, wird als Grenze das Argument "inf" verwendet.

Aufgaben[Bearbeiten]

Summen und Produkte[Bearbeiten]

Bestimmen Sie die nachfolgenden Ausdrücke:

Folgen[Bearbeiten]

Erzeugen Sie eine Liste mit den Folgegliedern der Folge

und bestimmen Sie das Produkt von .

Umformungen und Vereinfachen[Bearbeiten]

Grundsätzlich vereinfacht Maxima eingegebene Ausdrücke wie zum Beispiel

 (x+x)/(3 * x)

und gibt aus. Vereinfacht Maxima den Ausdruck wie zum Beispiel nicht, so kann der Befehl "ratsimp()" verwendet werden.

ratsimp((x+1)/(x^2-1))

ergibt . Faktorisieren ist mit dem Befehl "factor()" möglich:

 factor(x^3+4*x^2-11 * x - 30)

liefert somit die Faktoren.

Aufgaben[Bearbeiten]

Vereinfachen[Bearbeiten]

Vereinfachen Sie den Term

Faktorisieren[Bearbeiten]

Faktorisieren Sie den Ausdruck

Plotten I[Bearbeiten]

Für das Plotten von zweidimensionalen Graphen gibt es zwei Befehle: "wxplot2d()" und "plot2d()", in den Klammern stehen die Funktionsvorschrift gefolgt von einer eckigen Klammer. Die Argumente werden durch ein Komma getrennt. In der eckigen Klammer steht der Name der Funktionsvariable sowie die obere und untere Intervallgrenze, in welcher der Graph geplottet werden soll. Der Unterschied zwischen den beiden Befehlen liegt darin, dass der erste Befehl den Plot in Maxima öffnet wohingegen der zweite Befehl ein separates Fenster öffnet und bei der Ausgabe wird der entsprechende Dateipfad angegeben, unter welchem die Datei zu finden ist.

 wxplot2d([x^3-2*x],[x,-20,20])
plot2d(x^3-2*x,[x,-20,20])

Plotten II[Bearbeiten]

Für dreidimensionale Graphen können mit den analogen Befehlen "wxplot3d()" und "plot3d()" geplottet werden. Als zusätzliches Argument wird der Name der zweiten Variable sowie deren obere und untere Intervallgrenze benötigt, ebenfalls in eckigen Klammern.

 plot3d(cos(y)+sin(x),[x,-5,5],[y,-10,10])
wxplot3d(cos(y)+sin(x),[x,-5,5],[y,-5,5])

Differenzieren und Integrieren I[Bearbeiten]

Das (mehrfache) Differenzieren oder auch Integrieren erfolgt durch die Befehle "diff()" und "integrate()". Die Argumente für das Differenzieren sind der Funktionsname oder die Funktionsvorschrift, die Funtionsvaraible, nach der differenziert wird sowie die Häufigkeit der Differentation.

 diff(x^3-2*x,x,1)
diff(g(x,y),y,1)

Der Gradient kann dargestellt werden, indem die Matrix über die partiellen Ableitungen gebildet wird:

grad_g:matrix([diff(g(x,y),x)],[diff(g(x,y),y)])

Differenzieren und Integrieren II[Bearbeiten]

Für das Bilden der Stammfunktion werden lediglich der Name der Funktion bzw. die Funktionsvorschrift und die Variable, nach welcher integriert werden soll.

 integrate(f(x),x)

Für das Bestimmen des Wertes eines bestimmten Integrals werden zusätzlich die untere und obere Grenze benötigt. Alle Argumente werden durch Kommata getrennt.

 integrate(f(x),x,1,10)

Aufgaben[Bearbeiten]

Plotten und Differenzieren I[Bearbeiten]

Plotten Sie die Funktion

und bilden Sie die ersten beiden Ableitungen.

Plotten und Differenzieren II[Bearbeiten]

Plotten Sie die Funktion

und bestimmen Sie den Gradienten.

Integration[Bearbeiten]

Bestimmen Sie die Stammfunktion von und das Integral

Wahrscheinlichkeitsdichte[Bearbeiten]

Zeigen Sie, dass

eine Wahrscheinlichkeitsdichte ist.

Bestimmen Sie den Erwartungswert sowie die Wahrscheinlichkeit .

Äquivalenzumformungen[Bearbeiten]

Auch Äquivalenzumformungen können von Maxima durchgeführt werden: Dafür kann die Gleichung direkt in Klammern dargestellt werden und die Umformungsoperation dahiinter angegeben werden

 (a*x+b=c)-b

Alternativ kann der Gleichung auch eine Bezeichnung zugeordnet und die Operation mit dem Namen verknüpft werden.

 gl1:a*x+b=c
gl1-b

Weitere Befehle I[Bearbeiten]

Der Ausdruck "print()" gibt den in Klammern dargestellten Ausdruck als Ausgabe aus. Dies wird für spätere Algorithmen benötigt.

 a:2
 print(a)

Auch Division mit Rest kann mit "mod()" durchgeführt werden. Die Argumente sind der Dividend und der Divisor.

 mod(5,3)

bestimmt somit den Rest der Division .

Weitere Befehle II[Bearbeiten]

Eine Zufallszahl kann generiert werden mittels "random(x)", wobei die Zufallszahl kleiner als x ist. Ist , so ist auch die Zufallszahl aus . Ist x hingegen eine Fließkommazahl, so ist auch die Ausgabe eine. Zum Beispiel gibt

random(3)

eine Zufällige Zahl kleiner 3 aus, also 2 oder 1 oder 0.

Sequenz[Bearbeiten]

Eine Sequenz ist eine Hintereinanderausführung von Befehlen, wobei diese durch runde Klammern eingeschlossen sind.

If - then - else I[Bearbeiten]

Analog zum Wenn-Befehl aus TKP gibt es bei Maxima die if-then-else-Befehlsstruktur. Nach "if" folgt die Bedingung, welche abgefragt wird, dann folgt nach "then" der Befehl, der ausgeführt werden soll, falls die Bedingung erfüllt ist und nach "else" folgt der Befehl, der auszuführen ist, wenn die Bedingung nicht erfüllt ist. Als Beispiel soll die Struktur betrachtet werden, welche die größere von zwei Zahlen ausgibt.

 a : 5
 b : 6 
 if a > b then print (a) else if a = b then print("beide gleich") else print(b)

If - then - else II[Bearbeiten]

Wichtig ist bei diesem Beispiel zu berücksichtigen, dass es bei zwei Zahlen nicht zwei, sondern drei Relationsmöglichkeiten, also mögliche Ausgaben, gibt. Daher wird eine doppelte if-then-else-Bedingungen benötigt, die verschachtelt ist.

Aufgabe[Bearbeiten]

If-Befehl[Bearbeiten]

Erstellen Sie eine if-Abfrage, durch deren Anwendung bestimmt werden kann, ob zwei Zahlen ein ganzzahliges Vielfaches voneinander sind.
Hinweis: Benutzen Sie dazu die Modulo Funktion.

For-Schleife I[Bearbeiten]

Flow chart für eine For-Schleife.

For-Schleife II[Bearbeiten]

Bei einer For-Schleife werden Befehle so oft wiederholt, bis der Befehl für alle Elemente der Zählvariable durchgeführt wurde. Nach "for" folgt der Name der Variable, für welche mit ":" ein Anfangswert festgelegt wird. Dann steht hinter dem angeschlossenen "step" die Schrittweite gefolgt vom "thru" und dem Endwert. Abschließend folgt ein "do" mit der Befehlsequenz, d.h. die durchzuführenden Befehle werden durch "," getrennt aneinander gereiht. Als Minimalbeispiel soll die for-Schleife dienen, welche die Zahlen 1 bis 10 ausgibt:

 for a: 1 step 1 thru 10 do print(a)

Aufgabe[Bearbeiten]

for-Schleife[Bearbeiten]

Erstellen Sie eine for-Schleife, deren Ausführung Ihnen die Quadratzahlen von 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 ausgibt.

While-Schleife I[Bearbeiten]

Flowchart einer While-Schleife.

While-Schleife II[Bearbeiten]

Eine While-Schleife führt so lange einen Befehl aus, bis die genannte Bedingung nicht mehr erfüllt ist. Die Bedingung steht dabei hinter dem "while" und die auszuführenden Befehle hinter dem anschließenden "do". Als Beispiel soll auch hier die Ausgabe von Zahlen mit dem Startwert 1 bis 10 dienen. Jedoch wird bei der While-Schleife hier zuerst der Zähler erhöht und dann ausgegeben, weshalb die Ausgabe mit 2 beginnt.

 (a:1, while a < 10 do (a:a+1, print(a)))

Aufgabe[Bearbeiten]

while-Schleife[Bearbeiten]

Erstellen Sie eine while-Schleife, durch deren Ausführung Ihnen die Quadratzahlen von 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 ausgegeben werden.

Blöcke[Bearbeiten]

Um Befehle hintereinander auszuführen, gibt es den Befehle "block([], )", wobei in der eckigen Klammer die genutzten Variablen mittels "," getrennt aufgeführt werden, danach folgen durch "," getrennt die Befehle. Um Eingabeparameter angeben zu können, werden zusätzlich Funktionsdefinitionen benötigt. Als Beispiel soll ein Algorithmus für das Heron-Verfahren vorgestellt werden.

Heron(x):=block([y], y:x, while (abs(x-y*y)>10^-6) do y:(y+x/y)/2,y)

Der Eingabewert ist "x", zusätzlich wird die Variable "y" für die Befehlsstruktur definiert, danach folgt mittels der "while"-Befehlsstruktur der Algorithmus und die Ausgabe von y, wenn die Bedingung nicht mehr erfüllt ist.

Aufgaben[Bearbeiten]

Newton[Bearbeiten]

Erstellen Sie eine Funktion, die das Newton-Verfahren für eine (z.B. vorher global definierte Funktion) durchführt.
Hinweis: Verwenden Sie den Block-Befehl und erzeugen Sie eine Funktion der "newton(Anfangswert):= (Befehl1, Befehl2, ......, Befehl n)".
Die Iterationsvorschrift lautet .

Monte Carlo[Bearbeiten]

Erstellen Sie eine Funktion "montecarlo(n)".
Diese soll über die Monte Carlo Methode (siehe Tabellenkalkulation) anhand von Zufallspunkten eine Näherung für berechnen.

Euklidische Algorithmus[Bearbeiten]

Implementieren Sie den Euklidischen Algorithmus in Maxima.


Literatur/Quellennachweise[Bearbeiten]


Siehe auch[Bearbeiten]

Seiteninformation[Bearbeiten]

Diese Lernresource können Sie als Wiki2Reveal-Foliensatz darstellen.

Wiki2Reveal[Bearbeiten]

Dieser Wiki2Reveal Foliensatz wurde für den Lerneinheit Kurs:PC-Praktikum' erstellt der Link für die Wiki2Reveal-Folien wurde mit dem Wiki2Reveal-Linkgenerator erstellt.