MLTutor - Hints: Unterschied zwischen den Versionen

Aus Physik
Zur Navigation springen Zur Suche springen
Zeile 33: Zeile 33:
 
das Ergebnis 2 liefern würde.
 
das Ergebnis 2 liefern würde.
   
Bei folgenden typen von Aufgaben sollte man ganz Besonders an die Reihenfolge der Abarbeitung denken:
+
Bei folgenden Typen von Aufgaben sollte man ganz Besonders an die Reihenfolge der Abarbeitung denken:
(a + b) / (a-b)
+
(a + b) / (a - b)
 
(a + b) / a - b % Gleich wie ((a + b) / a) - b
 
(a + b) / a - b % Gleich wie ((a + b) / a) - b
 
a + b / a - b % Gleich wie a + (b / a) - b
 
a + b / a - b % Gleich wie a + (b / a) - b
a^(3/2)
+
a^(3 / 2)
a^3/2 % Das Ergebnis von a^3 wird durch 2 dividiert
+
a^3 / 2 % Das Ergebnis von a^3 wird durch 2 dividiert
 
(a + b)^2
 
(a + b)^2
 
a + b^2 % Nur b wird quadriert
 
a + b^2 % Nur b wird quadriert
  +
  +
== Einfache Funktionen ==
  +
Funktionen können in folgender Form aufgerufen werden
  +
x1 = sin(1.5);
  +
x2 = cos(pi/2); Cosinus von pi/2
  +
x3 = cos(pi/4) / 2; Cosinus von pi/4, dann das Ergebnis durch 2 dividiert
  +
x4 = 5 + tan(3);
  +
a = pi/4;
  +
b = sin(a)^2 % Sinus von a, dann das Ergebnis quadriert
   
 
= Workspace =
 
= Workspace =

Version vom 26. Februar 2006, 17:36 Uhr

Einführung

Assignment

Für die Zuweisung von Werten zu einer Variablen wird das Zeichen = verwendet:

a = 3;
b = 7.5; % Der Punkt steht für Komma
c = 1.7e-5; % 1.7 * 10^(-5)
d = pi; % Die Zahl Pi ist bekannt

Variablen werden überschrieben, daher hat nach

a = 1;
a = 2;
a = 3;

die Variable a den Wert 3 und jeglicher Bezug zu den vorherigen Werten ist verloren.

Einfache Rechnungen

Einfache Rechnungen mit arithmetischen Operatoren funktionieren so

x1 = 3 + 4;
x2 = x1 * 2;

wäre identisch mit

x2 = (3 + 4) * 2;

Die runden Klammern dienen hier der Gliederung. Wie bei normalen Rechnungen ist die Reihenfolge der Abarbeitung

Potenzieren
Multiplizieren, Dividieren
Addieren, Subtrahieren

Daher liefert

x3 = 3 + 4 * 2

etwas anderes als x2 von oben.

Ansonsten erfolgt die Abarbeitung von Links nach Rechts

2 / 2 / 2 

liefert als Ergebnis 0.5, wohingegen

2 / (2 / 2)

das Ergebnis 2 liefern würde.

Bei folgenden Typen von Aufgaben sollte man ganz Besonders an die Reihenfolge der Abarbeitung denken:

(a + b) / (a - b)
(a + b) / a - b % Gleich wie ((a + b) / a) - b
a + b / a - b % Gleich wie a + (b / a) - b
a^(3 / 2)
a^3 / 2 % Das Ergebnis von a^3 wird durch 2 dividiert
(a + b)^2 
a + b^2 % Nur b wird quadriert

Einfache Funktionen

Funktionen können in folgender Form aufgerufen werden

x1 = sin(1.5);
x2 = cos(pi/2); Cosinus von pi/2
x3 = cos(pi/4) / 2; Cosinus von pi/4, dann das Ergebnis durch 2 dividiert
x4 = 5 + tan(3);
a = pi/4;
b = sin(a)^2 % Sinus von a, dann das Ergebnis quadriert

Workspace

clear

Mit dem Befehl clear können lokale und globale Variablen im Matlab-Wokspace gelöscht werden. Bei allen Übungsabgaben soll das nicht gemacht werden. In MLTutor-Tests ist der Befehl clear lahm gelegt und mit der Variablen MLTutor_CLEAR_COUNT kann gezählt werden, wie oft clear verwendet wird.

Formatierung

Strichpunkt

Matlab Skripts und Funktionen sollten so geschrieben werden, dass sie keine Ausgabe am Schirm machen, die nicht explizit durch disp oder fprintf im Program veranlasst wird. Daher muss man am Ende von Anweisungen, die eine Ausgabe erzeugen einen Strichpunkt verwenden.

Korrekt:

x = 1:5; 
y = x.^2;
plot(x,y)

Ebenfalls korrekt sind Befehle in einer Zeile:

x = 1:5; y = x.^2; plot(x,y)

Ebenfalls korrekt, da jetzt auch Ausgabe vom Befehl plot:

x = 1:5; y = x.^2; ph=plot(x,y);

Syntax korrekt, erzeugt aber unerwünschte Ausgabe:

x = 1:5
y = x.^2
plot(x,y)

Syntax korrekt, erzeugt aber unerwünschte Ausgabe, da Beistrich satt Strichpunkt als Trennzeichen verwendet wird:

x = 1:5, y = x.^2, plot(x,y)

Syntax nicht korrekt, da Befehle in einer Zeile nicht einfach aneinander gereiht werden können:

x = 1:5 y = x.^2 plot(x,y)

In MLTutor Tests können fehlende Strichpunkte an Hand der Variablen MLTutor_DISPLAY_COUNT überprüft werden. Ist dieser Wert nicht Null fehlen Strichpunkte. Alle Übungsabgaben sollen so geschrieben sein, dass sie keine fehlenden Strichpunkte enthalten.

Kommentare

Kommentare kann man in Matlab schreiben, wenn man das Zeichen % verwendet. Das kann am Anfang der Zeile oder aber nach Befehlen gemacht werden:

% Initialisieren von Werten
x_start = 0; % Startwert
x_end = pi; % Endwert

Kommentare sollen sinnvoll zur Dokumentation von Programmen eingesetzt werden.

Hilfe

Der erste zusammenhängende Block von Kommentarzeilen in einem Skript oder einer Funktion wird bei Verwendung des Befehls help am Schirm ausgegeben. Dieser Text soll über den Aufruf bzw. die Aufgaben eines Matlab-Skrips oder einer Matlab-Funktion Auskunft geben:

function h = secansh(x,x_0,s)
% Funktion: secansh
% Aufruf: h = secansh(x,x_0,s)
% Berechnet fuer den Vektor x die Werte der normierten Secans Hyperbolicus 
% Funktion mit dem Maximum bei x_0 und mit der Halbwertsbreite s
% Input:  Vektor x, Skalar x_0, Skalar s
% Output: Vektor h(x)
%
% Name: Winfried Kernbichler
% Datum: 15.02.2006

% Beginn des eigentlichen Programms
h = ...

Unter der Annahme, dass dieses Programm im File secansh.m abgespeichert ist, liefert der Befehl help secansh die Zeilen

Funktion: secansh
Aufruf: h = secansh(x,x_0,s)
Berechnet fuer den Vektor x die Werte der normierten Secans Hyperbolicus 
Funktion mit dem Maximum bei x_0 und mit der Halbwertsbreite s
Input:  Vektor x, Skalar x_0, Skalar s
Output: Vektor h(x)

Name: Winfried Kernbichler
Datum: 15.02.2006

als Output am Schirm.

Solche Hilfetexte sollen bei allen Übungsbeispielen erstellt werden, manchesmal wird der Inhalt explizit überprüft. Dies wird aber in der Angabe zur Übung festgehalten.

disp

Formatierte Ausgabe am Schirm wird am einfachsten mit dem Befehl disp gemacht.

disp('Kernbichler')
name = 'Kernbichler'; disp(name)

gibt in beiden Fällen die Zeichenkette (string)

Kernbichler

aus.

Skalare, Vektoren, Matrizen können natürlich auch mit disp ausgegeben werden. So liefert

n = 5; disp(n) % Skalar
    5

z = 1:5; disp(z) % Zeilenvektor
    1     2     3     4     5

s = z.'; disp(s) % Spaltenvektor; z.' bedeutet transpose(z)
    1
    2
    3
    4
    5

o = ones(3,4); disp(o)
    1     1     1     1
    1     1     1     1
    1     1     1     1

Will man die Ausgabe von Zahlen mit der Ausgabe von Zeichen kombinieren, muss man die Zahlen in Zeichen verwandeln. Dazu gibt es unter anderem die Befehle num2str und mat2str. Damit kann man schreiben:

disp(['n = ',num2str(n)])
    n = 5

disp(['v = ',num2str(v)]) 
    v = 1  2  3  4  5

Die Klammern [] verbinden mehrere Zeichenketten zu einer

str1 = 'Mein'; str2 = 'Name';
str3 = [str1,str2]; disp(str3)
    MeinName

str3 = [str1,' ',str2]; disp(str3) % Mit Leerzeichen
    Mein Name

Die Befehle

disp(['s = ',num2str(s)])
disp(['o = ',num2str(o)])

würden Fehler der Art

??? Error using ==> horzcat
All matrices on a row in the bracketed expression must have the same number of rows.

liefern, da man nicht Variablen mit einer verschiedenen Anzahl von Zeilen nebeneinandet verbinden kann. Hier kann man sich mit mat2str behelfen

disp(['s = ',mat2str(s)])
    v = [1;2;3;4;5]

disp(['o = ',mat2str(o)])
    o = [1 1 1 1;1 1 1 1;1 1 1 1]

wobei hier der Strichpunkt die Zeilen trennt.

Graphik

plot

Die einfachste Möglichkeit Kurven darzustellen bietet die Matlab-Funktion plot. In diesem Beispiel erzeugt man mit linspace einen Vektor x_d mit n Zahlen zwischen x_s und x_e, berechnet dann für all diese Werte die Funktion sin und stellt die Werte in Form einer Kurve dar.

x_s = -pi; x_e = pi; n = 400;
x_d = linspace(x_s,x_e,n);
y_1 = sin(x_d);
plot(x_d,y_1);

Natürlich kann man das Aussehen der Kurve selbst bestimmen. Eine Zusammenfassung über die verschiedenen Spezifikationen für Linien liefert Informationen über Linienart, Markierungen, Farben, Liniendicke, usw.. So kann man obige Linie z.B. rot und strichliert zeichnen:

plot(x_d,y_1,'r--');

Will man mit dem Befehl plot mehrere Linien in einem Achsensystem zeichen, hat man zwei Möglichkeiten. Man kann die Anweisungen in einer Zeile schreiben

y_2 = cos(x_d);
plot(x_d,y_1,x_d,y_2);  % Ohne Angabe von Linienspezifikationen
plot(x_d,y_1,'r-',x_d,y_2,'b:'); % durchgehend rot, punktiert blau

oder als Folge von Anweisungen

plot(x_d,y_1,'r-'); % erste Linie; löscht vorhandenes Achsensystem
hold on % Modus "Hinzufügen"
plot(x_d,y_2,'b:'); % zweite Linie; zeichnet in das bereits vorhandene Achsensystem
hold off % beendet Modus "Hinzufügen"

Der Befehl hold schaltet dabei zwischen dem Modus zum Hinzufügen (on) und zum Neuzeichnen (off) um.

Matlab selbst bietet auch eine Einführung in die einfache Erstellung von Graphiken.

Ein Überblick über einige Möglichkeiten für einfache Graphiken wurde in diesem Matlab Skript zusammengestellt.

Programmeinheiten

Skript

Ein Matlab-Skript läuft im Workspace ab und kann alle Variablen im Workspace verwenden und verändern. Somit verhält es sich nicht anders, als wenn man die Befehle Zeile für Zeile eingeben würde. Es stellt somit nur eine Vereinfachung gegenüber der händischen Eingabe dar, da man die Befehle abspeichern und somit immer wieder aufrufen kann.

Funktion

Im Unterschied zu einem Skript läuft eine Matlab Funktion in einem abgeschlossenen Arbeitsbereich ab und kann daher nicht auf Variablen im Basis-Workspace zugreifen oder diese verändern.

Eine Funktion braucht eine Deklarationszeile am Anfang

function out = name_func(in1,in2,in3,...)
function [out1,out2,out3,...] = name_func(in1,in2,in3,...)

mit dem Keyword function, den Namen der Outputvariablen, einem =, dem Namen der Funktion und den Namen der Inputvariablen.

So würde die Funktion

function res = test(a,b)
% Wurzel aus der Summe der Quadrate von a und b
% Name des Autors
% Datum
res = sqrt(a.^2 + b.^2);

die Wurzel aus der Summe der Quadrate von a und b berechnen. Der erste Block von Kommentarzeilen wird beim Aufruf von

help test

ausgegeben.

Die Werte von a und b werden erst beim Ausführen der Funktion übergeben

r_1 = test(1,2);  % a wird 1, b wird 2, r_1 wird sqrt(5) (innerhalb res)

oder

x = 2;
y = 3;
r_2 = test(x,y);  % a wird 2 (x), b wird 3 (y), r_2 wird sqrt(13) (innerhalb res)

Die Namen der Variablen innerhalb der Funktion und ausserhalb können gleich sein, müssen es aber nicht. Auch bei gleichen Namen haben die Variablen nichts miteinander zu tun, da sie in verschiedenen Workspaces (Arbeitsbereichen) existieren. Der Austausch findet nur über die Übergabeparameter (Input und Output) statt. Wäre der Ablauf also

a = 10; b = 20; x = 2; y = 3;
r_2 = test(x,y);  % a in test wird 2 (x), b in test wird 3 (y), r_2 wird sqrt(13) (innerhalb res)
disp(a) % ist noch immer 10, da in einem anderen Workspace
disp(b) % ist noch immer 20

Links

Folgende Linkarten sind vordefiniert:

mltutor://Projektname Interner Link zu MLTutor Projekt
matref://Funktionsname Link zu Matlab Hilfe wird zu http://itp.tugraz.at/matlab/techdoc/ref/sin.html
itpwiki://Wikieintrag Link zu ITP Wiki
appsoftkapitel://7 Link zu Applikationssoftwareskriptum Kapitel 7
appsoftskriptum Link zu Applikationssoftwareskriptum