You are on page 1of 3

Das Wichtigste zu MATLAB

(1) Um ein Programm zu schreiben: Rollfenster ’file’, wähle ’new M-file’, oder öffne vorhandenes, um es weiter zu
bearbeiten
(2) Zum Speichern: Links oben im Editor ist ein Rollfenster ’file’, darin findet man die entsprechenden Befehle.
(3) Um ein eigenes Programm aufzurufen: Vom MATLAB - Direktmodus oder auch von einem Programm aus
gibt man die Befehlszeile: ’[out1,out2,...]=functionname(in1,in2,...);’ oder auch entsprechend Kürzeres, wenn
es keine Inputs/Outputs gibt.
(4) Ein Matlabprogramm benötigt keine ’begin’, ’end’.

Zum Programmieren selbst


(1) Wir benötigen, um uns zu bewegen, nur zwei Datentypen:
(a) Matrizen (mit beliebigen Namen wie ’x’, ’y’, ’startzeitpunkt’ usw.)
(b) Strings (also Zeichenfolgen), die Namen sind wieder beliebig, also nicht von den Namen für Matrizen zu
unterscheiden.
Zu a: Eine Zahl ist speziell eine (1×1)− Matrix, ein Zeilenvektor eine (1 × n) − Matrix, ein Spaltenvektor
entsprechend eine (m × 1) − Matrix. Den k. Spaltenvektor von einer Matrix a bildet man mit a (:, k) ,
entsprechend den k. Zeilenvektor mit a(k, :). Mit size(a) bekommt man Zeilen- und Spaltenzahl von a
gesagt, bei einem Vektor kann man auch mit length(a) die Länge, d.h. die Dimension bekommen.
Zu b: Man braucht strings einmal für Beschriftungen von Zeichnungen, also etwa title(’Lösung der
Dif f erentialgleichung...’) als Befehl, eine Überschrift über ein Bild zu setzen, oder auch xlabel (’Geschwindigkeit’)
für die Beschriftung einer Abszisse. Besonders wichtig sind strings jedoch dann, wenn man einen Befehl
wie eval(’y = sin(x)’) ausführt: Damit kann man einen komplizierten Ausdruck in ein Programm variabel
eingeben.
Wichtige Bemerkungen: Man braucht Variablen nicht zu deklarieren, grundsätzlich gilt:
(i) Ein Befehl, in dem auf x zurückgegriffen wird, ist nur dann ausführbar, wenn zuvor x einen festen
Wert (bzw. festen Wertevektor oder Wertematrix) bekommen hat. x hat nicht etwa den Wert
Null vorab, sondern gar keinen!
(ii) x existiert in diesem Sinne und kann benutzt werden, wenn x über inputs in ein Programm oder
auch direkt (zumindest vorläufige) Werte erhalten hat, also mit einem Befehl wie x = 1.
(iii) Wird x etwa über einen rekursiven Prozess (Schleife) hergestellt und ist die endgültige Dimensio-
nierung vorab bekannt, so lohnt es stark für die Rechenzeitverkürzung, etwa vorweg zu schreiben:
x = zeros(1, n) etc. Dann muss nicht stets neuer Platz für x gemacht werden.
(iv) Mehrere Zufallsmechanismen stehen zur Verfügung, z.B. produziert der Befehl x = rand(10, 10) eine
(10 × 10) − Zufallsmatrix mit gleichverteilten Zufallszahlen im Bereich [0, 1], und x = randn(10, 10)
eine ebensolche Zufallsmatrix mit standard-normalverteilten Zufallszahlen, x = poissrnd(λ, 10, 10) :
Poissonverteilte Zufallszahlmatrix (10 × 10) mit Erwartungswert λ.
(v) x = x0 : δ : x1 produziert einen Zeilenvektor mit Zahlen, welche bei x0 beginnen und immer um δ
größer werden, bis hin zu x1. (Im allgemeinen wird der letzte Eintrag echt kleiner als x1 sein, weil
man eben nicht genau auskommt.)
(vi) Möchte man Matrizen x, y herstellen, die ein Gitter von Punkten darstellen, so kann man etwa
x = 0 : 0.01 : 1 bilden und anschließend befehlen [x, y] = meshgrid(x); dann hat man mit x(i, j)
und y(i, j) die Gitterpunkte eines entsprechenden zweidimensionalen Gitters. (Es dürfte auch y
zunächst anders als x eindimensional sein, dann liefert [x, y] = meshgrid(x, y) das Gewünschte.
(2) Der Zuweisungsbefehl:
x = Ausdruck (a, b, c...) ;
Man beachte das Semikolon am Ende: Dies verhindert die Ausgabe auf den Bildschirm. Man muss es nur
weglassen, um diese Ausgabe zu bekommen. Es wird der Wert des Ausdrucks gebildet und unter dem Namen ’x’
gespeichert. Mit diesem Befehl werden alle wesentlichen Rechenschritte getan. Bei der Nutzung der Operationen
1
2

in MATLAB ist die grundlegende Datenstruktur ’Matrix’ zu berücksichtigen und vor allem effizient zu nutzen.
Beispiele:
(a) Ist x ein Vektor, so ist sin(x) der Vektor der zugehörigen Sinuswerte, und x. ∗ sin(x) der Vektor, der
durch komponentenweise Multiplikation entsteht. Die komponentenweise Multiplikation und Division so-
wie Potenzierung wird mit dem Punkt vor dem Operationszeichen kenntlich gemacht, im Gegensatz zu
Matrizenmultiplikationen. Sind a, b Matrizen, so führt a ∗ b die Matrixmultiplikation aus, sofern die Di-
mensionen das zulassen (sonst erscheint entsprechende Fehlermeldung). Dagegen bildet man mit a.∗b (mit
dem Punkt!) die punktweise Matrixmultiplikation, was ausführbar ist genau dann, wenn a, b dieselben
Zeilen- und Spaltenzahlen haben.
(b) In einem Ausdruck darf man sämtliche Funktionen benutzen, die einerseits von Matlab, andererseits von
eigenen Funktionen (im selben Verzeichnis, in dem man arbeitet!) bereitgestellt werden.
(3) Logische Abfragen, Verzweigungen und Schleifen:
(a) Man bildet
f or k = 1:n
(Bef ehle)
end
und analog
if x = = 1
(Bef ehle)
end
und wieder analog
while (Bedingung)
(Bef ehle)
end
(b) Die typischen Bedingungen: x == a, x˜ = a, x < a, x <= a. Man beachte das doppelte Gleichheitszeichen,
das dazu dient, die Bedingungsabfrage vom Zuweisungsbefehl zu unterscheiden.
(c) Logische Veknüpfungen von Bedingungen mit den Zeichen & für ’und’ und | (senkrechter Strich) für
’oder’, also etwa: if x <= a | (x == b & x == c) .
(4) Wichtige Befehle zum Zeichnen:
(a) plot(x, y,’∗r’) mit einem Vektor x und einem gleich dimensionierten y trägt y gegen x auf, normalerweise
blau und ´mit durchgezogener Linie, hier mit der Zusatzoption ’∗r’ nur die Punkte als Sternchen und mit
roter Farbe.
(b) plot3(x, y, z) zeichnet entsprechend eine Raumkurve.
(c) Mit Matrizen x, y, welche die x− und y− Koordinaten von Gitterpunkten in der Ebene angeben und z einer
Matrix von Werten, die man in Abhängigkeit von x, y berechnet hat (man bedenke, dass ein Befehl wie z =
x. ∗ y.ˆ2 genügt, man benötigt keine Indizes!), zeichnet surf (x, y, z) die entsprechende Gebirgslandschaft
in ein dreidimensionales Koordinatensystem. Man beachte: Man kann auch eine parametrisierte Fläche
zeichnen, indem man x, y, z alle in Abhängigkeit von den beiden Parametern ausrechnet und anschließend
den Befehl surf (x, y, z) eingibt.
(d) contour(z) zeichnet einige Niveaukurven zum Skalarfeld z(x, y).
(e) quiver(x, y, a, b) zeichnet ein Vektorfeld, wobei die Vektoren mit x− Koordinate a, y− Koordinate b
jeweils am Ort (x, y) gezeichnet werden. Wichtig ist wieder, dass x, y ein Gitter liefern wie bei surf
beschrieben.
(5) Von Matlab eingebaute Routinen sind unübersehbar viele, man kann sich über die Hilfe und Befehlslisten einen
Überblick verschaffen. Man setze voraus, dass alle wichtigen Funktionen vorhanden sind. Als Beispiel sei nur
3

erwähnt, dass exp (xt) für eine quadratische Matrix x die bekannte Matrix ext liefert. (Natürlich darf man
Matrizen auch groß schreiben in Matlab, etwa exp(At).)
(6) Zur Implementierung der numerischen Lösung einer Differentialgleichung (explizit, 1. Ordnung), also x0 =
f (t, x) in unserer Notation:
(a) Der Grundbefehl lautet [t, x] = ode45(@dglf unktion, tspan, x0, [], p1, p2, ...).
Dabei sind die Inputs: Name der Funktion, die f (t, x) berechnet, dazu schreibt man eine eigene f unction
in Matlab. Dann Zeitbereich, etwa hat man vorher tspan = [0, 2]; befohlen. Dann Startvektor (Vektor,
wichtig: als Spaltenvektor), dann Klammer für Optionen (bei Leere nimmt das Programm die Standarop-
tionen), dann Parameter, die man der f unction ’dglf unktion’ übergeben möchte, etwa vorn im Programm
variieren will.
Die Outputs sind: Vektor der Zeitpunkte, zu denen man die Lösungkurvenpunkte bekommt, dann Matrix
der Werte, genauer: x(i, j) gibt den Wert der j. Vektorkomponente zur Zeit t(i).
’ode45’ steht für das Standard - Runge - Kutta - Verfahren, das für allgemeine Zwecke sehr gut ist. Man
hat aber viele weitere Optionen.
(b) Nun kann man plotten wie plot(t, x(:, 1)). (Gezeichnet wird die erste Vektor-Komponente der Lösung in
Abhängigkeit von t.) Oder plot(x(:, 1), x(:, 2)). (Gezeichnet wird die Lösungskurve im Phasenraum bei
zwei Dimensionen.)
(c) Die Funktion ’dglfunktion’ hat so auszusehen (Reihenfolge der Inputs wichtig!)
dx = dglf unktion(t, x, p1, ...)
Bef ehle
Dabei müssen die Befehle dx als Spaltenvektor liefern. Etwa:
dx = [p1 ∗ t ∗ x(1) + p2 ∗ x(2); −p3 ∗ x(1)ˆ2].
Oder: dx = zeros(2, 1); dx(1) = p1 ∗ t ∗ x(1) + p2 ∗ x(2); dx(2) = −p3 ∗ x(1)ˆ2; Vor allem in solchen
Unterprogrammen denke man an das Setzen der Semikola!
Hinweis: Diese Funktion kann man einfach unten an das Hauptprogramm anhängen, aber nur, wenn
man das Hauptprogramm als f unction schreibt!
(d) Zu den Optionen, die man setzen kann bei einem Befehl wie ode45: Der Befehl zur Einführung lautet:
options = odeset(’abstol’,1e-10,’reltol’,1e-10)
Anschließend fügt man options ein für die leere Klammer oben. Durch kleine Werte bei ’abstol’, ’reltol’
erreicht man entsprechend größere Genauigkeiten, welche das Programm mittels kleinerer Schrittweiten
und daher auch längeren Rechenzeiten hervorbringt. Dabei wird automatisch auch die Punktezahl in den
plots erhöht, die man aber auch regulieren kann, indem man bei tspan einen Vektor wie 0 : 0.01 : 2
eingibt. Damit wird unabhängig von den Genauigkeitsoptionen das Punktegitter dimensioniert.
Zur Bedeutung der Genauigkeitsoptionen: Rechnet man ohne Setzen verschärfter Optionen e10
über die Lösung der Differentialgleichung für exp aus, so erhält man einen absoluten Fehler von etwa
4. Dagegen mit ’reltol’,1e-15: Fehlerbetrag etwa 3/1000, zusätzlich mit ’abstol’,1e-15: Fehlerbetrag nur
noch unter 10−9 ! Und das geht immer noch in einer halben Sekunde. Selbstverständlich wird das bei
e20 noch drastischer. Noch eine technische Bemerkung zum Setzen der Optionen: Hat man mit
einem mehrdimensionalen Problem zu tun, sind also die Phasenraumelemente Vektoren, so hat man bei n
Dimensionen etwa einzugeben (die absolute Toleranz muss als Vektor eingegeben werden, und der Vektor
mit vier Einträgen desselben Wertes wird bequem mit dem Befehl ’repmat’ (repeat matrix) wie folgt
erzeugt):
odeset(’Vectorized’,’on’);
w1 = repmat(1e-8,4,1);
options = odeset(’RelTol’,1e-8,’AbsTol’,w1);

You might also like