<<

. 10
( 11 .)



>>

figure
Matlab, ein mathematisches Labor 51




fprintf(™\node23s:\n™)
[t3,x3] = ode23s(™dgl_f3™, tt, x0, options);
plot(t3,x3,™rx™,t3,x3);
title(™ode23s™)
axis([0 0.5 -1 1])
input(™Druecke RETURN™)
clear
options = odeset(™Stats™, ™on™, ™Refine™, 1);

fprintf(™\node45:\n™)
[t1,x1] = ode45(™dgl_f4™, [0 3], [1;0;0],options);
plot(t1,x1(:,2),™rx™,t1,x1(:,2));
title(™ode45™)
figure

fprintf(™\node15s:\n™)
[t2,x2] = ode15s(™dgl_f4™, [0 3], [1;0;0], options);
plot(t2,x2(:,2),™rx™,t2,x2(:,2));
title(™ode15s™)
figure

fprintf(™\node23s:\n™)
[t3,x3] = ode23s(™dgl_f4™, [0 3], [1;0;0], options);
plot(t3,x3(:,2),™rx™,t3,x3(:,2));
title(™ode23s™)

Man sieht im zweiten Beispiel: Die impliziten Verfahren ode15s und ode23s sind
nicht nur viel e¬zienter, sondern liefern auch ™glattere™ und damit sch¨nere und
o
exaktere L¨sungen.
o
Zum Schluss noch eine kurze Beschreibung weiterer MATLAB DGL-Loser: ¨
ode113: explizites Mehrschrittverfahren, d.h. x(i+1) wird mittels einer expli-
ziten Formel aus meheren vorhergehenden Werten x(i-s), x(i-s+1), ..., x(i) be-
rechnet. Konsistenzordnung p = 1 bis 13 Nicht geeignet fur steife DGL.
¨
ode23tb: Implizites eingebettetes Runge-Kutta-Verfahren Konsistenzordnung
p = 2 und 3 Geeignet fur steife DGL.
¨
ode23t: Auf der Trapezregel basierendes implizites Verfahren. Konsistenzord-
nung p = 2 und 3 Geeignet fur moderat steife DGL.
¨
Eindimensionale zeitabh¨ngige Di¬erentialgleichung als Beispiel fur MATLABs
a ¨
DGL-L¨ser
o
52 Matlab, ein mathematisches Labor




(Beispiel ohne praktische Bedeutung)

function y = dgl_f1(t,x)
y = -x - 5.*exp(-t).*sin(5.*t);

Dreidimensionale Di¬erentialgleichung (™R¨ssler-System™) als Beispiel fur MATLABs
o ¨
DGL-Loser
¨
Enth¨lt weitere Parameter, die vor der L¨sung spezi¬ziert werden mussen
a o ¨

function y = dgl_f2(t,x,flag,a,b,c)
y = [-x(2)-x(3); x(1)+a*x(2); b+x(3)*(x(1)-c)];

Eindimensionale zeitabh¨ngige Di¬erentialgleichung als Beispiel fur MATLABs
a ¨
DGL-L¨ser
o
(Beispiel fur eine sehr einfache ™steife™ Di¬erentialgleichung)
¨

function y = dgl_f3(t,x)
y = -1000.*x;

Dreidimensionale Di¬erentialgleichung als Beispiel fur MATLABs DGL-L¨ser
o
¨
Die Gleichung modelliert eine chemische Reaktion (™Robertsons Modell™) und
ist ein Beispiel fur eine sogenannte ™steife™ DGL
¨

function y = dgl_f4(t,x)
y = [-0.04*x(1) + 1e4*x(2)*x(3); ...
0.04*x(1) - 1e4*x(2)*x(3) - 3e7*x(2)^2; ...
3e7*x(2)^2 ];
Kapitel 3

Sonstiges

3.1 E¬zienzsteigerung in Matlab
3.1.1 Grundlagen
In diesem Abschnitt wollen wir eine Reihe von Tricks besprechen, mit denen man
Operationen schneller ausfuhren kann
¨
Zuerst stellen wir die Standard-Ausgabe passend ein.

format long
format compact

Um dis Auswirkungen verschiedener Programmiertechniken zu sehen, sollte man
die Zeit messen, mit der eine Anweisung oder Anweisungsfolge ausgefuhrt wird.
¨
Dazu gibt es die MATLAB Befehle ™tic™ und ™toc™

fprintf(™\n\ntic und toc:\n\n™)
tic
for i=1:10000
x = i.^2;
end;
toc
for i=1:10000
x = i.^2;
end;
z=toc
input(™Druecke RETURN™)

Mit der Eingabe von ™tic™ beginnt die Zeitmessung. Bei jeder folgenden Eingabe
von ™toc™ wird die seit dem letzten ™tic™ vergangene Zeit ausgegeben oder kann

53
54 Sonstiges




einer Variablen zugewiesen werden. Gemessen wird die CPU-Zeit, d.h. nur die
Zeit, in der die Zentralrecheneinheit wirklich aktiv war. Beachte, dass andere
parallel zu MATLAB laufende Programme diese Zeit beein¬‚ussen k¨nnen.
o
MATLAB ist sehr genugsam bei der De¬nition von Matrizen bzw. Vektoren
¨
(wir werden im Allgemeinen von ™Feldern™ sprechen), in dem Sinne, dass Fel-
der komponentenweise belegt werden k¨nnen, ohne dass man vorher die Gr¨sse
o o
festlegen muss:

fprintf(™\n\nFelder mit und ohne vorheriger Definition:\n\n™)
clear;
tic
for i=1:10000
z(i) = i.^2;
end
toc

Dies erm¨glicht zwar sehr ¬‚exible Programmierung, fuhrt aber zu sehr langsa-
o ¨
mer Ausfuhrung der Zuweisungen, da intern bei jeder Zuweisung erst der n¨tige o
¨
Speicherplatz reserviert werden muss.
Viel schneller ist die folgende Variante, bei der zuerst ein Vektor der ben¨tigten
o
Gr¨sse de¬niert wird.
o

tic
y = zeros(1,10000);
for i=1:10000
y(i) = i.^2;
end
toc
input(™Druecke RETURN™)

Dieses Verfahren hat nicht nur bei der Zuweisung Vorteile sondern auch beim
Auslesen der Werte (wenngleich der Unterschied hier nicht so drastisch ist und
stark von dem verwendeten Rechner abhangt).
¨

fprintf(™\n\nAuslesen von Feldern:\n\n™)
tic
for i=1:10000
x = z(i);
end
toc
tic
for i=1:10000
Sonstiges 55




x = y(i);
end
toc
input(™Druecke RETURN™)
Daruberhinaus belastet die Zuweisung von Feldern ohne vorherige De¬nition auch
¨
die Gesamtleistungsf¨higkeit, da im Voraus de¬nierte Felder als Block im Speicher
a
abgelegt werden k¨nnen und so eine viel e¬zientere Speicherverwaltung erm¨gli-
o o
chen.
Zur De¬nition eines Feldes, das spater mit Werten belegt werden soll, emp-
¨
¬ehlt sich der ™zeros™ Befehl, siehe oben. Hier wird jeder Eintrag mit Null vor-
belegt. Aber auch wenn man Felder mit anderen Werten als 0 vorbelegen will,
gibt es geeignete MATLAB Routinen. Der Befehl ™ones™ funktioniert v¨llig ana-
o
log zu ™zeroes™ und erzeugt Einser als Vorbelegung. ACHTUNG: ™zeros(N)™ bzw.
™ones(N)™ erzeugen keinen N-dimensionalen Vektor sondern eine N x N Matrix!
™ones™ kann im Prinzip auch benutzt werden, um beliebige (gleiche) Eintr¨ge
a
zu erzeugen, z.B. eine 100 x 100 Matrix mit lauter Zweiern.
fprintf(™\n\nZuweisung von Matrizen:\n\n™)
clear;
tic
A = zeros(1000);
A = 2.*ones(1000);
toc
Fur sehr grosse Felder (nicht fur kleine) geht dies schneller mit dem ™repmat™
¨ ¨
Befehl, der eine Matrix mit dem Eintrag aus dem ersten Argument erzeugt:
clear;
tic
B = zeros(1000);
B = repmat(2,1000);
toc
Erkl¨rung: Im ersten Fall wird 1000 x 1000 = 1 000 000 mal eine Multiplikation
a
durchgefuhrt; im zweiten Fall nur zugewiesen. Noch schneller als ™repmat™ ist
¨
allerdings die folgenden Zuweisung, bei der mit A(:) jedes Element der Matrix
ausgew¨hlt wird.
a
clear;
tic
C = zeros(1000);
C(:) = 2;
toc
56 Sonstiges




™repmat™ ist deswegen langsamer, weil es nicht explizit ausnutzt, dass die ™2™ hier
ein skalarer Wert ist. Tats¨chlich kann das erste Argument von ™repmat™ selbst
a
ein Feld sein, dass dann mittels ™repmat™ entsprechend oft aneinandergefugt wird.
¨
MATLAB ist eine Vektor- bzw. Matrix-orientierte Programmierumgebung mit
vielen eingebauten Routinen, die direkt auf Vektoren bzw. Matrizen arbeiten.
Diese Routinen sind in MATLAB als hochoptimierte C-Routinen implementiert
und in fast jedem Fall deutlich schneller als die Verwendung von ™for™ Schleifen.
Die Zuweisung

fprintf(™\n\nSchleife vs. Vektoroperation:\n\n™)
clear;
tic
y = zeros(1,10000);
for i=1:10000
y(i) = i.^2;
end
toc

kann man z.B. auch so programmieren:

clear;
tic
y = zeros(1,10000);
t = [1:10000];
y = t.^2;
toc

<<

. 10
( 11 .)



>>