Sie sind auf Seite 1von 3

Das Wichtigste zu MATLAB

(1) Um ein Programm zu schreiben: Rollfenster ’le’, wähle ’new M-le’, oder öne vorhandenes, um es weiter zu bearbeiten

(2) Zum Speichern: Links oben im Editor ist ein Rollfenster ’ le’, darin ndet man die entsprechenden Befehle. (3) Um ein eigenes Programm aufzurufen: Vom MATLAB - Direktmodus oder auch von einem Programm aus

oder auch entsprechend Kürzeres, wenn

es keine Inputs/Outputs gibt. (4) Ein Matlabprogramm benötigt keine ’begin’, ’end’.

gibt man die Befehlszeile: ’[out1,out2,

]=functionname(in1,in2,

);’

Zum Programmieren selbst

(1) Wir benötigen, um uns zu bewegen, nur zwei Datentypen:

(a)

Matrizen (mit beliebigen Namen wi e ’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( Losung¨ der

Differentialgleichung ) 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ückgegrien 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äu ge) 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 z ur 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 e zient 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

und analog

for k = 1: n

( Befehle)

end

if x = =1

( Befehle ) end

und wieder analog

while (Bedingung) (Befehle)

end

(b)

(c)

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.

Logische Veknüpfungen von Bedingungen mit den Zeichen & für ’und’ und | (senkrechter Strich) für

’oder’, also etwa: if x <= a | ( x == b (4) Wichtige Befehle zum Zeichnen:

& x == c) .

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

plot 3( x, y, z ) zeichnet entsprechend eine Raumkurve.

(c)

Mit Matrizen x, y , welche die xund yKoordinaten 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 b eachte: 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 xKoordinate a, yKoordinate 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 verschaen. 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 e xt liefert. (Natürlich darf man Matrizen auch groß schreiben in Matlab, etwa exp( At) .)

(6) Zur Implementierung der numerischen Lösung einer Dierentialgleichung (explizit, 1. Ordnung), also x 0 = f ( t, x) in unserer Notation:

(a)

Der Grundbefehl lautet [t, x] = ode45(@dglfunktion, tspan, x 0, [], p1, p2,

).

Dabei sind die Inputs: Name der Funktion, die f ( t, x) berechnet, dazu schreibt man eine eigene function in Matlab. Dann Zeitbereich, etwa hat man vorher tspan = [0, 2]; befohlen. Dann Startvektor (Vektor, wichtig: als Spaltenvektor), dann Klammer für Opti onen (bei Leere nimmt das Programm die Standarop- tionen), dann Parameter, die man der function dglfunktion’ ü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

= dglfunktion( t, x, p1, Befehle

)

Dabei müssen die Befehle dx als Spaltenvektor liefern. Etwa:

 

dx = [p 1 t x(1) + p 2 x(2); p3 x(1)ˆ2].

Oder: dx = zeros (2, 1); dx(1) = p1 t x(1) + p2 x(2); dx(2) = p 3 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 function 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 e 10 über die Lösung der Dierentialgleichung 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 e 20 noch drastischer. Noch eine technische Bemerk ung 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);