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):

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

Diskussion: [Name der Diskussion]