MLTutorBeispielerstellung: Unterschied zwischen den Versionen

Aus Physik
Wechseln zu: Navigation, Suche
(Allgemeine Fragen und Antworten zum Adaptieren der Übungsbeispiele)
(Allgemeine Fragen und Antworten zum Adaptieren der Übungsbeispiele)
Zeile 4: Zeile 4:
 
** <span style="color:green"> JA, jedes Beispiel als eigenes Projekt; Referenzprogramm heißt immer '''main.m'''. Das gilt nur für ein eventuell notwendiges Script. Funktionen werden gleich benannt wie in der Angabe, und ein Projekt kann mehr als eine Funktion enthalten. </span>
 
** <span style="color:green"> JA, jedes Beispiel als eigenes Projekt; Referenzprogramm heißt immer '''main.m'''. Das gilt nur für ein eventuell notwendiges Script. Funktionen werden gleich benannt wie in der Angabe, und ein Projekt kann mehr als eine Funktion enthalten. </span>
 
***<span style="color:red"> ÄNDERUNG: Sogar jede Funktion soll ein eigenes Projekt werden. Eine Übung besteht dann aus der Aufgabe mehrere Projekte zu programmieren! Deshalb bitte merken, welche Projekte zu welcher Übung gehören!</span>
 
***<span style="color:red"> ÄNDERUNG: Sogar jede Funktion soll ein eigenes Projekt werden. Eine Übung besteht dann aus der Aufgabe mehrere Projekte zu programmieren! Deshalb bitte merken, welche Projekte zu welcher Übung gehören!</span>
 +
****<span style="color:blue">Wenn in der Übung gefordert wird, eine Funktion und ein Script zu schreiben wobei in diesem Script die Funktion aufgerufen wird, da sollte ein Projekt reichen? Wenn die Funktion in einem anderen Projekt sein sollte, dann ist sie auch in einem anderen Verzeichniss. Das Script könnte dann die Funktion nur mit dem entsprechenden Pfad aufrufen...</span>
 +
  
 
* <span style="color:blue"> Wie werden Funktionen getestet?</span>
 
* <span style="color:blue"> Wie werden Funktionen getestet?</span>

Version vom 24. November 2005, 14:07 Uhr

Allgemeine Fragen und Antworten zum Adaptieren der Übungsbeispiele

  • Soll jedes Beispiel einer Übung ein eigenes Projekt sein? Wenn nicht sollen wir die Benennung so wie auf Angabe für Referenzprogramm übernehmen?
    • JA, jedes Beispiel als eigenes Projekt; Referenzprogramm heißt immer main.m. Das gilt nur für ein eventuell notwendiges Script. Funktionen werden gleich benannt wie in der Angabe, und ein Projekt kann mehr als eine Funktion enthalten.
      • ÄNDERUNG: Sogar jede Funktion soll ein eigenes Projekt werden. Eine Übung besteht dann aus der Aufgabe mehrere Projekte zu programmieren! Deshalb bitte merken, welche Projekte zu welcher Übung gehören!
        • Wenn in der Übung gefordert wird, eine Funktion und ein Script zu schreiben wobei in diesem Script die Funktion aufgerufen wird, da sollte ein Projekt reichen? Wenn die Funktion in einem anderen Projekt sein sollte, dann ist sie auch in einem anderen Verzeichniss. Das Script könnte dann die Funktion nur mit dem entsprechenden Pfad aufrufen...


  • Wie werden Funktionen getestet?
    • Es wird eine Referenzfunktion geschrieben und beide Funktionen werden aufgerufen. Danach werden die Variablen verglichen.
  • Ist Laden von Übungsdaten noch notwendig?
    • NEIN
  • Haben wir eine Möglichkeit Plots zu vergleichen?
    • JA; Es muss ein Linehandle vorhanden sein, mit dem der Zugriff auf die Daten der Figure ermöglicht wird.
  • Wie werden Variablen gesetzt?
    • ENTWEDER es wird ganz klar gefordert welche Werte den Variablen zugewiesen werden müssen,
    • ODER es werden Variablen im Praescript definiert und in der Angabe wird mitgeteilt, dass diese Variablen existieren.
  • ist es noch möglich (sinnvoll?) input zu verwenden
    • Eher nicht (Außer dort wo noch Freiheiten bestehen oder wenn die nächste Frage mit JA beantwortet werden kann)
  • Kann man beim Ausführen eines Skriptes input umgehen bzw. Werte vordefinieren, die dann verwendet werden?
    •  ?? NOCH UNGELÖST
  • Können wir die korrekte Handhabung von rand überprüfen (Ob die Skalierung auf das gewünschte Intervall tatsächlich richtig durchgeführt wurde)?
    • JA, vor dem Ausführen muss der SEED des Zufallszahlengenerators gesetzt werden. Ist noch nicht geklärt, ob das der Autor machen muss oder von der Software gemacht wird.
  • Was passiert wenn jemand "clear all" in seinem Script stehen hat? Ist ja ansich lobenswert wenn man es verwendet, nur wird dann die Initialisierung durch ml_test1_before.m gelöscht.
    • Naja, ich sehe das als Fehler des Benutzers, da er ja weiß dass Variablen vorgegeben werden.
      Eine andere Möglichkeit wäre das aufmerksam machen des Benutzers auf seinen Fehler. Muss man noch entscheiden..
  • Soll die Abgabe generel mit Regulären Ausdrücken überprüft werden? Etwa wenn etwas ohne for Schleifen programmiert werden sollte.
    • Nein, es gibt einen Punkt in der XML-Datei, die zum Test gehört, wo man einfach angibt, welche Funktionen der Benutzer nicht verwenden darf. Wenn du kompliziertere Tests des Script schreiben willst, könnte man natürlich in ml_test?_after.m eine Variable ausrechnen und diese mit ml_test?_check.m überprüfen
  • Wie wird das mit der LaTeX-Angabe geregelt? (Referenzen, Kurzbefehle die für das Skriptum definiert wurden...)
    • Dafür ist noch eine Lösung zu finden. Es wird einen Header geben, der in den Angaben zu den einzelnen Projekten eingebunden werden wird können. Für \section und subsection werden eigene Befehle zur Verfügung stehen.
  • Überprüfung ob eine Funktion eine Fehlermitteilung produziert.
    • Dafür wird eine Funktion bereitgestellt werden.

Beispiel2

Projektverzeichnissname: andrej.sommer2005.aufgabe2a
Weis nicht ob es so gedacht war, aber jedenfalls die erste aufgabe mit Testscript:

Nur eine Anmerkung: Das Überprüfen des Ergebnisses vom Studenten übernimmt das MLTutor-Programm, aber im Prinzip läuft es genau so ab, wie du es geschrieben hast. Wenn du selber die Überprüfung übernehmen willst, dann kannst du natürlich gerne deine eigene Routine schreiben, aber im ml_test1_check.m würde bei diesem Test nur

V2,F2,R2,r2 

drinnenstehen, damit das Programm weiß, welche Variablen überprüft werden sollten. Im XML-File, dass man dazu erstellt, kann man dann definieren, mit welcher Genauigkeit der Check abläuft und ähnliches. --Camhy 15:39, 3 Nov 2005 (CET)

Ich bin total dagegen, dass jemand eigene Überprüfungsroutinen schreibt. Das gehört total zum mlTutor und hat überhaupt nichts mit den Beispielen selbst zu tun. Bitte unbedingt nur die Syntax von David verwenden. Wenn irgendetaws für den gewünschten Test nicht ausreicht, dann unbedingt als Anregung an David und mich leiten. Dann müssen wir uns auf Seite des mlTutor darum kümmern. --Winny 16:40, 8 Nov 2005 (CET)

Die Variablen würden dann beim Scriptausführen als Text ausgegeben werden um vom ml_tutor weiterverarbeitet zu werden? Habe das Beispiel jatzt umgeschrieben: --Golubkov 13:03, 10 November 2005 (CET)

Nein, der MLTutor muss nur wissen, welche Variablen überprüft werden sollen. Dh. es soll wirklich wie oben nur z.B.

V2,F2,R2,r2 

drinnenstehen, od. ähnliches. z.B. würde ich in diesem Fall aus dieser for Schleife mit typ einfach mehrere Tests machen, da ja unterschiedliche Eigenschaften der vom Studenten geschriebenen Funktion überprüft werden. Die StudentIn soll ja wissen, bei welchem Typ es funktioniert und bei welchem nicht. Diese Syntax wurde nur deswegen gleich gewählt wie eine Ausgabe, um das Testen ohne fertigen MLTutor leichter zu machen. In den Beispielen camhy.testbeispiele.* ist es eh vorgeführt. Siehe auch Erstellen eines MLTutor Beispiels mit Eclipse. Von der technischen Seite läuft es dann so ab, dass der MLTutor aus dieser Datei herausliest, welche Variablen überprüft werden sollen, dann die Variablen als XML aus Matlab ausgibt, dieses XML von der MLTutor Oberfläche geparst wird und mit dem Ergebnis der StudentIn verglichen wird. Mit einer Ausgabe als Text wäre das Parsen komplexerer Datentypen wie Structures od. Cells, die aus verschachtelten Matrizen bestehen nicht möglich. --Camhy 13:19, 11 November 2005 (CET)


main.m

function [V,F,R,r]=main(typ,a)

switch lower(typ(1))
     case 't'
		V=a^3/12*sqrt(2);
		F=a^2*sqrt(3);
		R=a/4*sqrt(6);
		r=a/12*sqrt(6);
     case 'w'
		V=a^3;
		F=6*a^2;
		R=a/2*sqrt(3);
		r=a/2;
	case 'o'
		V=a^3/3*sqrt(2);
		F=2*a^2*sqrt(3);
		R=a/2*sqrt(2);
		r=a/6*sqrt(6);
	case 'd'
		V=a^3/4*(15+7*sqrt(5));
		F=3*a^2*sqrt(5*(5+2*sqrt(5)));
		R=a/4*(1+sqrt(5))*sqrt(3);
		r=a/4*sqrt((50+22*sqrt(5))/5);
	case 'i'
		V=5*a^3/12*(3+sqrt(5));
		F=5*a^2*sqrt(3);
		R=a/4*sqrt(2*(5+sqrt(5)));
		r=a/2*sqrt((7+3*sqrt(5))/6);
end

ml_test1_after.m

typ = {'t','w','o','d','i'};
a=2;
[V,F,R,r] = regpol(typ(1),a);

ml_test2_after.m

ptyp = {'t','w','o','d','i'};
a=[1:10];
[V,F,R,r] = regpol(typ(2),a);

ml_test3_after.m

typ = {'t','w','o','d','i'};
a=4;
[V,F,R,r] = regpol(typ(3),a);

ml_test4_after.m

typ = {'t','w','o','d','i'};
a=2;
[V,F,R,r] = regpol(typ(4),a);

ml_test5_after.m

typ = {'T','w','O','d','I'};
a=3;
[V,F,R,r] = regpol(typ(5),a);

Als Referenz müsste nun ml_tutor hier statt regpol auch mal main einsetzen. War das so gedacht?

Nein, du kannst die Funktion nennen, wie du willst, nur bei Skriptbeispielen muss das Hauptskript main.m heißen, damit das Programm weiß, welches das Hauptskript ist. Generell muss der Student alle *.m Dateien schreiben, die nicht mit ml_ beginnen. Siehe Erstellen eines MLTutor Beispiels mit Eclipse. Dort gibt es auch ein Funktionsbeispiel. camhy.testbeispiele.function1 In der MLTutor-Oberfläche gibt es mittlerweile auch einen Menüpunkt, der das richtige "Layout" eines Beispiels überprüft. Macht zwar noch ein paar Schwierigkeiten, aber diese sind mittlerweile behoben und stehen am Montag allen zur Verfügung. --Camhy 16:39, 17 November 2005 (CET)


ml_test1_check.m

V,F,R,r

Mit ml_test1_check.m bis ml_test5_check.m sind identisch.

Dokumentation

document.tex: Entsprechendes pdf
Statt \matref habe ich vorerst einfach matref stehen gelassen, bis sich eine Lösung für die definierten Kurzbefehle findet.

\documentclass[12pt,a4paper]{article}
\usepackage[german,english]{babel}
\usepackage[latin1]{inputenc}
\usepackage{palatino}
\usepackage{verbatim}
\usepackage{typearea}
\usepackage{graphicx}
\usepackage[usenames]{color}
\usepackage{ifthen}
\usepackage{longtable} 
\usepackage{makeidx} 
\usepackage{float}
\usepackage{alltt}
\usepackage{amsmath,amssymb,amsthm}
\usepackage[colorlinks,breaklinks,backref,pdfstartview=FitH]{hyperref}
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt}
\usepackage[top=1mm,left=5mm,right=0mm,bottom=5mm]{geometry}
\pagestyle{empty} 
\newcommand{\bsp}{\vspace{1em}\hrulefill\\[1em]\underline{Anschauungsbeispiel:}\\[0.5em]}
\newcommand{\zus}{\vspace{1em}\hrulefill\\[1em]\underline{Zusammenfassung:}\\[0.5em]}
\newcommand{\hw}{\vspace{1em}\underline{Hinweis:}\\[0.5em]}
\newcommand{\geg}{Gegeben: }
\newcommand{\ges}{Gesucht: }
\newcommand{\ii}{\textrm{i}}
\newcommand{\define}{\stackrel{\textrm{\tiny def}}{=}}
\newcommand{\field}[1]{\mathbb{#1}}
\newcommand{\R}{\field{R}}
\newcommand{\corrs}{\stackrel{\textrm{\tiny $\wedge$}}{=}}

\begin{document}
\section{Aufgabe}
Schreiben Sie eine \verb°regpol.m°, die folgende Aufgaben
erfüllt:
\begin{enumerate}
\item Für eine vorgegebene Kantenlänge $a$ soll das Volumen $V$, die
	Oberfläche $F$, der Radius der umbeschriebenen Kugel $R$ und der Radius der
	einbeschriebenen Kugel $r$ wahlweise für einen der 5 regulären konvexen
	Polyeder (Tetraeder, Würfel, Oktaeder, Dodekaeder, Ikosaeder) berechnet werden.
\item Mit der String-Variablen {\tt typ} soll der Typ des regulären Polyeders
	übergeben werden. Verwenden sie die Buchstaben 't','w','o','d' bzw. 'i' um einen der Polyeder auszuwählen.
\item Das Programm soll für einen Vektor von $a$-Werten funktionieren und
	gleichlange Vektoren mit den Resultaten für $V$, $F$, $R$ und $r$
	zurückgeben. 
\item Im Programm soll zur Unterscheidung der Fälle die 
	matref{switch}{switch}-Konstruktion verwendet werden:
	\begin{verbatim}
	  switch lower(typ(1))
	     case 't'
	        ...
	     case 'w'
	        ...
	     ...
	  end
	\end{verbatim}
	Überlegen Sie, welche Zeichenkette man als {\tt typ} eingeben kann, was {\tt
	  typ(1)}  bewirkt, und was
	der Befehl matref{lower}{lower} dabei bewirkt.
\item
	Stellen Sie auch den Unterschied zwischen folgenden Aufrufen der
	Funktion fest und versuchen Sie das Verhalten zu verstehen.
	\begin{verbatim}
	  regpol(typ,a)
	  V = regpol(typ,a)
	  [V,F] = regpol(typ,a)
	  [V,F,R] = regpol(typ,a)
	  [V,F,R,r] = regpol(typ,a)
	\end{verbatim}
\end{enumerate}


\section{Mathematische Grundlagen}
\begin{enumerate}
  \item Tetraeder
    \begin{align*}
      &V = \frac{a^3}{12} \sqrt{2} 
      &F = a^2 \sqrt{3} \\
      &R = \frac{a}{4} \sqrt{6} 
      &r = \frac{a}{12} \sqrt{6} 
    \end{align*}
  \item Würfel
    \begin{align*}
      &V = a^3 
      &F = 6a^2 \\
      &R = \frac{a}{2} \sqrt{3} 
      &r = \frac{a}{2} 
    \end{align*}
  \item Oktaeder
    \begin{align*}
      &V = \frac{a^3}{3} \sqrt{2} 
      &F = 2a^2 \sqrt{3} \\
      &R = \frac{a}{2} \sqrt{2} 
      &r = \frac{a}{6} \sqrt{6} 
    \end{align*}
  \item Dodekaeder
    \begin{align*}
      &V = \frac{a^3}{4} \left(15 + 7\sqrt{5}\right) 
      &F = 3a^2 \sqrt{5\left(5 + 2\sqrt{5}\right) } \\
      &R = \frac{a}{4} \left( 1 + \sqrt{5} \right) \sqrt{3} 
      &r = \frac{a}{4} \sqrt{ \frac{50 + 22\sqrt{5}}{5} } 
    \end{align*}
  \item Ikosaeder
    \begin{align*}
      &V = \frac{5a^3}{12} \left(3 + \sqrt{5}\right) 
      &F = 5a^2 \sqrt{3} \\
      &R = \frac{a}{4} \sqrt{ 2 \left( 5 + \sqrt{5} \right) } 
      &r = \frac{a}{2} \sqrt{ \frac{7 + 3\sqrt{5}}{6} } 
    \end{align*}
\end{enumerate}


\ges Funktion \verb°regpol.m° mit Inputparametern: Polyeder-typ \verb°typ° und Polyeder-kantenlänge \verb°a°.
Rückgabewerte: Kantenlänge \verb°a°, Volumen \verb°V°, Oberfläche \verb°F°, 
Radius der umbeschriebenen Kugel \verb°R°, Radius der einbeschriebenen Kugel \verb°r°

\bsp
\begin{verbatim}
[V,F,R,r] = regpol('w',3)
V = 27
F = 54
R = 2.5981
r = 1.5000

\end{verbatim}

\end{document}