Netzwerk Mathematik/Physik + E-Learning
Ziel dieses Bausteins ist es, eine Liste kurz umrissener Szenarien und UseCases in der Verwendung von MAXIMA in ONYX-Aufgaben zusammenzutragen, für die es lohnenwert erscheint, in einem zweiten Schritt ggf. eine nützliche Dokumentation (Erläuterung / Anwendungsbeispiel) im ONYX Hilfesystem zu erstellen.
Funktionsbibliothek ONYX-MAXIMA - Ideensammlung
In diesem Bereich soll eine erste Sammlung an Vorschlägen für Funktionen entstehen, die häufige/übliche Nutzungsszenarien von MAXIMA in ONYX kapseln. Diese Funktionen könnten dann in einer Library bereitgestellt und so bei Bedarf nachgeladen werden.
Bereits integriert sind (MAXIMA-code hier):
- CompareLR zum Formellückenvergleich
- SimpleLR zur Auswertung der LEARNERRESPONSE mit einigen weiteren Funktionen zur Verarbeitung der LR von IDbasierten Aufgabentypen
Konkrete Vorschläge
- Maxima-Matrix als Latex-Array mit Formatierungen
Beispiel:
tex_table(matrix([1,2,3],[4,5,6])\(\begin{array}{|c|c|c|} \hline 1 & 2 & 3\\ \hline 4 & 5 & 6\\ \hline \end{array}\)
tex_table(matrix([1,2,3],[4,5,6]),rownames = ["Zeile 1","Zeile 2"], colnames =["Spalte 1","Spalte 2","Spalte 3"], rowformat = "|| |",colformat = "|l|lcr|");
\(\begin{array}{|l|lcr|} \hline \text{} & \text{Spalte 1} & \text{Spalte 2} & \text{Spalte 3}\\ \hline \text{Zeile 1} & 1 & 2 & 3\\ \text{Zeile 2} & 4 & 5 & 6\\ \hline \end{array}\)
sconcat(tex_text("Davor noch Text"),"\\\\",tex_table(matrix([1,2,3],[4,5,6]),rownames = ["Zeile 1","Zeile 2"], colnames =["Spalte 1","Spalte 2","Spalte 3"], rowformat = "|| |",colformat = "|l|lcr|"),"\\\\",tex_text("Danach auch noch Text"));
\(\text{Davor noch Text}\\\begin{array}{|l|lcr|} \hline \text{} & \text{Spalte 1} & \text{Spalte 2} & \text{Spalte 3}\\ \hline \text{Zeile 1} & 1 & 2 & 3\\ \text{Zeile 2} & 4 & 5 & 6\\ \hline \end{array}\\\text{Danach auch noch Text}\)
Implementierung:
/* bjoern.boettcher at tu-dresden.de */ tex_text(s) := sconcat("\\text{",s,"}"); /* string to latex */ tex_table(M,[options]) := block( [rownames,colnames,rowformat,colformat,rowhline,rowformatlist,pretext,posttext,out], rownames : assoc(rownames,options), colnames : assoc(colnames,options), rowformat : assoc(rowformat,options), colformat : assoc(colformat,options), /**/ if not matrixp(M) then M:apply(matrix,M), /* turns a nested list into matrix */ if listp(rownames) then M : addcol(transpose(matrix(map(tex_text,rownames))),M), if listp(colnames) then ( if (length(M[1])>length(colnames)) then /* first column header might be blank */ colnames: append([""],colnames), M : addrow(matrix(map(tex_text,colnames)),M) ), /**/ /* standard colformat is centered with vertical lines */ if not(stringp(colformat)) then colformat : concat("|",simplode(map(lambda([x],"c"),M[1]),"|"),"|"), /**/ /* rowformat one of " " and "|" for top, followed be one for each line. */ if (stringp(rowformat)) then ( rowformatlist:charlist(rowformat), rowhline:makelist(is(rowformatlist[i]="|"),i,1,length(M)+1) ) else ( rowhline:makelist(true,i,1,length(M)+1) ), if not(stringp(pretext)) then pretext:"", if not(stringp(posttext)) then posttext:"", /**/ out: concat("\\begin{array}{",colformat,"} ",if rowhline[1] then "\\hline " else ""), for i: 1 thru length(M) do out: concat(out,simplode(M[i]," & "),"\\\\ ", if rowhline[i+1] then "\\hline " else ""), out: concat(out, "\\end{array}"), out );
- Korrekte Kommazahldarstellung in Latex
num2comma(x) := ssubstfirst(",\\!",".",string(x));
Grund: Zahlen, die als Gleitkommazahlen in Onyx zugewiesen werden, werden bei der Einbindung in Latexumgebungen falsch dargestellt: Nach dem Komma ist eine Lücke oder wenn man es in \text{} setzt, wird ein Minus (negatives Vorzeichen) falsch gesetzt. Ein Umweg ist es die Variable als Text-Variable in Onyx zuzuweisen, wenn man dann ein Komma möchte, erzeugt obige Funktion den korrekten Abstand nach dem Komma.
- kaufmännisches Runden
round_com_n(x,n) /* kaufmaennisches Runden auf n Nachkommastellen */
Begründung: Wir wollen stets präzise Antworten mit einer vorgegebenen Anzahl von Nachkommastellen. Dafür wollen wir den Studierenden keine neuen Rundungsregeln erklären, was mit den aktuellen Möglichkeiten nötig wäre (Abschneiden von Nachkommastellen; oder Runden zur nächsten geraden Zahl bei 5).
Implementierung:
round_com_n(x,n):= block( /* kaufmaennisches Runden auf n Nachkommastellen */ [xn,d:10^n], xn:x*d, if oddp(floor(abs(xn))) then float(round(xn)/d) else float((round(xn+1)-1)/d) );
Beispiele:
round_com_n(3.9959,3); (%o) 3.996
L:makelist(i,i,-3.5,3.5,0.25); (%o) [-3.5,-3.25,-3.0,-2.75,-2.5,-2.25,-2.0,-1.75,-1.5,-1.25,-1.0,-0.75, -0.5,-0.25,0.0,0.25,0.5,0.75,1.0,1.25,1.5,1.75,2.0,2.25,2.5,2.75,3.0, 3.25,3.5] map(lambda([x],round_com_n(x,0)),L); (%o) [-4.0,-3.0,-3.0,-3.0,-3.0,-2.0,-2.0,-2.0,-2.0,-1.0,-1.0,-1.0,-1.0,0.0, 0.0,0.0,1.0,1.0,1.0,1.0,2.0,2.0,2.0,2.0,3.0,3.0,3.0,3.0,4.0]
Varianten: Bei obigem wird immer eine Nachkommastelle angezeigt, auch wenn diese auf 0 gerundet wurde. Das könnte man noch beheben...
round_com_n_0(x,n):= block( /* kaufmaennisches Runden auf n Nachkommastellen */ [xn,d:10^n,res], xn:x*d, res: if oddp(floor(abs(xn))) then float(round(xn)/d) else float((round(xn+1)-1)/d), if (n<= 0) then floor(res) else res /* ohne Nachkommastellen - auch keine Anzeigen */ );
Laufzeitvergleich (lokal, daher nur für relative Vergleichen sinnvoll):
showtime:true$ n: 100000$ for i thru n do round_com_n(5.34536,1); (%o) Evaluation took 0.9530 seconds (0.9530 elapsed) using 164.800 MB. for i thru n do round_com_n_0(5.34536,1); (%o) Evaluation took 1.1720 seconds (1.1690 elapsed) using 199.930 MB.
- nächster Vorschlag
Weitere Ideen
- eine '"tex2" -Funktion, die einige typische Darstellungsprobleme gerade zieht (z.B. Abstände nach Dezimalkomma, Reihenfolge der Summanden in $a+b*%i$,...)
- zukünftig wird in IDbasierten Aufgaben die CORRECTRESPONSE schreibbar sein. Benötigt wird dann eine Funktion zur Erzeugung korrekter CRs, quasi als Gegenstück zu SimpleLR