Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf ·...

16
Steuerung von Programmabl¨ aufen Vorlesung Computergest¨ utzte Mathematik zur Linearen Algebra Lehrstuhl f¨ ur Angewandte Mathematik Sommersemester 2009 7. und 14. Mai 2009

Transcript of Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf ·...

Page 1: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Steuerung von Programmablaufen

Vorlesung

Computergestutzte Mathematik zur Linearen Algebra

Lehrstuhl fur Angewandte MathematikSommersemester 2009

7. und 14. Mai 2009

Page 2: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

For-Schleifen

I Bisher: Matlab -Kommandos Befehl fur Befehl am Prompteingegeben oder im m-File (Script) gespeichert

I Folge: Matlab arbeitet die Befehle nacheinander, von obennach unten ab

I Heute: Automatische Berechnung sich wiederholenderAnweisungen

Page 3: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Beispiel: geometrische Reihe

Berechnung von∑n

j=0 2j , n = 10

x=1;x=x+2;x=x+2^2;x=x+2^3;x=x+2^4;x=x+2^5;x=x+2^6;x=x+2^7;x=x+2^8;x=x+2^9;x=x+2^10

Page 4: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Beispiel: geometrische Reihe, II

einfache Vorschrift fur beliebiges n:

x ← 0, x ← x + 2j , j = 0, . . . , n

Umsetzung in einer Programmiersprache:

allgemeine Form

for j = arrayMatlab-Befehle

end

hier

x=0; n=10;for j = 0:n

x = x+2^j;end

Page 5: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

for-Schleifen

Varianten:

I array = 1:n

I array = anf:inkrement:end

I array = linspace(anf,end,anzahl)

I array = 0:0.1:5

I array = [ 2 7 5 1]

Page 6: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Anwendungen von for-Schleifen

for-Schleifen sind anwendbar, falls

I die Anzahl der Schleifendurchlaufe und

I die Werte der Schleifenvariablen

bekannt sind

I for-Schleifen konnen in Matlab haufig durch vektorisierteAusdrucke ersetzt werden (Programme konnen kurzer,schneller und besser lesbar werden)

I Programmierstil: die Schleifenvariable sollte nicht in derSchleife verandert werden (obwohl dies erlaubt ist)

I verwenden Sie nicht i oder j als Schleifenvariablen

Page 7: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Vektorisierung

Beispiel: y(n) = sin(

πn10

), n = 1, . . . , 10

for n=1:10y(n) = sin(n*pi/10);

end

kann ersetzt werden durch

n = 1:10;y = sin(n*pi/10);

oder

y = sin([1:10]*pi/10);

Vorteile:

I intuitiver

I weniger zu tippen

Page 8: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Bemerkungen zu Dimensionen

for n=1:10y(n) = sin(n*pi/10);

end

Beobachtung: Dimension von y wachst bei jedemSchleifendurchlauf, Matlab muss daher die Dimension in jedemDurchlauf anpassen−→ sehr teuer bei vielen Durchlaufen.

besser: Initialisierung vor der Schleife:

y = zeros(1,n);for n=1:10

y(n) = sin(n*pi/10);end

Page 9: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

while-Schleifen

allgemeine Form

while BedingungMatlab-Befehle

end

wobei Bedingung eine logische Variable sein muss.

I Die Schleife wird solange ausgefuhrt, bis die Bedingung nichterfullt ist (d.h. die logische Variable falsch (= 0) ist).

I Vorteil gegenuber for-Schleifen: man muss nicht vorherwissen, wie oft eine Schleife durchlaufen wird.

I Vorsicht: Man muss sicherstellen, dass die Bedingungirgendwann falsch wird (= 0), sonst lauft die Schleife endlos(Abbruch mit Ctrl-c).

Page 10: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Beispiel

Berechnung der Maschinengenauigkeit als kleinste, positive, imRechner darstellbare Zahl, die zu eins addiert werden kann, so dassdie Summe großer als eins ist.

n = 0; % Zaehler fuer die% Schleifendurchlaeufe

EPS = 1;while (1+EPS) > 1

EPS = EPS/2;n = n+1;

endEPS = EPS*2 % letzte Division der Schleife

% war zuviel

Page 11: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

if-Anweisungen / Fallunterscheidungen

allgemeine Form

if BedingungMatlab-Befehle

end

wobei Bedingung eine logische Variable sein muss.

Die Matlab-Befehle werden nur ausgefuhrt, wenn die Bedingungwahr (= 1) ist, sonst ubersprungen.

bei zwei Alternativen

if BedingungMatlab-Befehle (falls Bedingung wahr)

elseMatlab-Befehle (falls Bedingung falsch)

end

Page 12: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

if-Anweisungen II

bei drei oder mehr Alternativen

if Bedingung 1Matlab-Befehle (falls Bedingung 1 wahr)

elseif Bedingung 2Matlab-Befehle (falls Bedingung 1 falsch

und Bedingung 2 wahr)elseif Bedingung 3

...else

Matlab-Befehle (falls alle Bedingungenvorher falsch)

end

Die Bedingungen werden nur so oft ausgewertet, bis eine wahr ist.Alle folgenden Bedingungen werden ignoriert.

Page 13: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Schleifen – allgemein

Aus allen Schleifen kann man vorzeitig mit break ausssteigen.

Beispiel: Berechnung der Maschinengenauigkeit mit einerfor-Schleife

EPS = 1;for n=1:1000 % hoechstens 1000

% SchleifendurchlaeufeEPS = EPS/2;if (1+EPS) <= 1EPS = EPS*2break % Ausstieg aus der for-Schleife

endend

Page 14: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Beispiel: ggt(m,n), Variante I

Euklidischer Algorithmus:Falls m = n ist ggt = n, sonst subtrahiere kleineren Wert vongroßerem und wiederhole dies mit den neuen Werten.

while m ~= nif m > n % m ist groesserm = m-n;

elsen = n-m; % n ist groesser

endendg = n;

Page 15: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Beispiel: ggt(m,n), Variante II

Weitere Verbesserung: richtige Eingaben sicherstellen,z.B. m, n > 0:

if (m > 0 & n > 0) % vermeide Endlosschleifewhile m ~= nif m > n

m= m-n;else

n= n-m;end

endg = n;fprintf(’ggt ist: %g\n’,g)

else % Fehlermeldungerror(’fehlerhafte Eingabedaten’);

end

Page 16: Steuerung von Programmabl aufen Vorlesung …luo/de/lehre/matlabss09/.../schleifen.pdf · For-Schleifen I Bisher: Matlab -Kommandos Befehl f ur Befehl am Prompt eingegeben oder im

Beispiel: Approximation von log x

log x =∞∑

k=1

(−1)k+1 (x − 1)k

k, 0 < x ≤ 2

Losung: s1 = x − 1,

sk = sk−1 + (−1)k+1 (x − 1)k

kk > 1,

Abbruch, falls |sk − log x | < 10−10

s(1)=x-1;k=1;while abs(s(k)-log(x))>=1e-10

k=k+1;s(k)=s(k-1) + (-1)^(k+1)*(x-1)^k/k;

endfprintf(’k=%i, s(%i)=%g, Fehler=%g\n’,k,k,s(k),abs(s(k)-log(x)));