Sitzung 3

Werbung
Sitzung 3
Weiteres zu for -Schleifen. Automatisches Erzeugen von Vektoren.
Benutzereingabe abfragen. if-Abfragen.
Weiteres zu for-Schleifen
In der letzten Sitzung haben wir mit for-Schleifen die Möglichkeit kennengelernt, Befehle mehrfach auszuführen. Die allgemeine Syntax für eine for-Schleife lautete:
for ( Variablenname ) = ( Vektor )
( Befehle )
end
Dabei werden die (Befehle) für alle (Variable) ∈ (Vektor) ausgeführt. Für unsere Schleifen wird der Vektor oft eine sehr einfache Form
wie [1 2 3 . . .] haben, wir werden uns daher zunächst damit beschäftigen, wie wir solche Vektoren automatisch (und mit beliebig vielen Einträgen) erzeugen können.
Exkurs: Aufzählvektoren erzeugen
Vektoren mit einer einfachen Gestalt wie [1 2 3 4 5] kann man in MATLAB automatisch mit der Notation 1:5 erzeugen. Allgemein entspricht
n:m dem Vektor [n n+1 n+2 ... m]:
>> 1:5
ans =
1
>> 2:4
ans =
2
2
3
3
4
4
5
Wir können auch z.B. einen Vektor nur mit geraden Zahlen erzeugen,
in dem wir eine dritte Zahl in die Mitte einfügen: n:k:m erzeugt einen
Vektor mit Werten zwischen n und m mit Schrittweite k. Die Schrittweite
ist dabei die Differenz zwischen zwei aufeinanderfolgenden Elementen:
1
Sitzung 3
>> 0:2:9
ans =
0
>> 5: -1:1
ans =
5
2
4
6
8
4
3
2
1
Diese Notation ist nicht nur kürzer, sondern erlaubt auch für eine Variable n, Vektoren wie 0:n oder (2*n):-1:0 zu erzeugen.
Aufgabe 1. Für q ∈ (−1, 1) und n ∈ N sei an die geometrische Summe
n
∑
qk =
k=0
1 − qn+1
1−q
erinnert.
Schreiben Sie ein Skript, welches die geometrische Summe berechnet
und testen Sie es für den Fall q = 0.1 und n = 20.
Bemerkung: Verwenden Sie nun den Potenz-Operator: a∧ b entspricht ab .
♢
Bei komplexen Programmen mit vielen Schleifendurchläufen kann es
vorkommen, dass die eigentlich wichtige Information auf dem Bildschirm
unter anderen, unwichtigen Ausgaben, verloren geht.
Man kann die Ausgabe unterdrücken, in dem man einem Ausdruck
mit einem Semikolon beendet:
>> a = 2;
>> b = 5;
Dies ist nur bei Ausdrücken erlaubt, welche auch tatsächlich eine Ausgabe erzeugen. Nach for ... z.B. darf kein Semikolon stehen.
Aufgabe 2. Führen Sie das folgende Programm auf einem Blatt Papier
von Hand durch. Was wird berechnet?
n = 4;
f_n = 0;
f_nm1 = 1
f_nm2 = 1
for i =3: n
f_n = f_nm1 + f_nm2
2
Sitzung 3
f_nm2 = f_nm1 ;
f_nm1 = f_n ;
end
♢
Eingabe
Bislang haben wir alle Variablenwerte direkt im Programm festlegen müssen. Wir wollen nun eine Möglichkeit kennenlernen, den Benutzer beim
Ausführen des Programms nach Informationen zu fragen.
Die Syntax von solch einer Abfrage sei an einem Beispiel demonstriert:
x = input ('x = ? ');
Wird dieser Befehl ausgeführt, erscheint in MATLAB eine Zeile mit
dem Text x = ? und MATLAB wartet darauf, dass der Benutzer (also Sie)
eine Zahl eingibt und Enter drückt. Diese Zahl wird dann in der Variable
x gespeichert und die Ausführung des Programms fährt fort.
Wollen Sie Ihr Programm bei der Eingabe vorzeitig abbrechen, so können Sie dies mit der Tastenkombination strg + c tun. Diese Tastenkombination ist auch generell ein nützliches Werkzeug, falls Sie Programme beenden wollen, deren Ergebnis Sie nicht mehr interessiert, weil Ihnen zum
Beispiel ein Programmierfehler aufgefallen ist und das vom Programm
berechnete Ergebnis somit falsch wäre.
input ist ein Beispiel für eine Funktion von MATLAB. Diese Funktion
erwartet als Argument eine Zeichenkette (einen String), welche den Text
enthält, der auf dem Bildschirm bei der Eingabe erscheint. Der Text in
der Zeichenkette ist von einfachen Anführungszeichen umgeben, um ihn
vom normalen MATLAB-Programmcode zu unterscheiden. Funktionen
behandeln wir erst später, im Augenblick können Sie das Beispiel einfach
kopieren.
Der Inhalt der Zeichenkette in der input-Funktion hat keine Bedeutung für das Programm, wir könnten auch x = input('y = ? ') schreiben.
Aufgabe 3. Schreiben Sie ein Programm, welches den Benutzer nach Zahlen a, b und t fragt und die lineare Interpolation (1 − t)a + tb berechnet.
♢
3
Sitzung 3
if-Abfragen
Mit Schleifen können wir nun schon komplexe Programme schreiben. Bisher fehlt uns jedoch die Möglichkeit, Befehle nur unter bestimmten Bedingungen ausführen zu lassen. Beispielsweise ist eine Pivotisierung bei der
Gaußschen Elimination nötig, wenn das Pivotelement der aktuellen Zeile
Null ist.
Für solche Fallunterscheidungen benötigen wir if-Abfragen. Mit diesen können wir Befehle nur dann ausführen lassen, wenn eine Bedingung
zutrifft. Sie wird geschrieben als:
if ( Bedingungen )
( Befehle , falls Bedingungen wahr )
end
Wollen wir nun auch andere Befehle ausführen, wenn die Bedingung
nicht zutrifft, so können wir zusätzlich einen else-Block einfügen:
if ( Bedingungen )
( Befehle , falls Bedingungen wahr )
else
( Befehle , sonst )
end
Man achte darauf, dass end nun auch erst nach dem else-Block kommt.
Nur so kann MATLAB wissen, dass der else-Block zu der if-Abfrage gehört.
Bevor wie nun dazu kommen, wie genau Bedingungen auszusehen
haben, wollen wir als Beispiel das Minimum z zweier Zahlen x und y
berechnen:
x = input ('x = ');
y = input ('y = ');
if x < y
z = x;
else
z = y;
end
z
Hier haben wir als Bedingung die <-Relation verwendet, ebenso können wir natürlich auch >, aber auch =, ̸==, ⩽ und ⩾ verwenden. Das
4
Sitzung 3
Gleichheitssymbol = wird bereits für die Zuweisung von Variablen verwendet, daher wird die Gleichheit im Sinne eines Vergleichs mit zwei
Gleichheitszeichen == dargestellt, ̸= als ~=:
x == y
x ~= y
Da ⩽ und ⩾ auf der Tastatur nicht einfach einzugeben sind, werden
statt dessen <= und >= verwendet:
x <= y
x >= y
Das Ergebnis der Vergleichsoperationen ist ein Wahrheitswert und wird
in MATLAB mit den Zahlen 1 (wahr, auch true) und 0 (falsch, auch false)
kodiert. Diese Wahrheitswerte können nicht nur in if-Abfragen verwendet werden, sondern lassen sich auch als ganz normale Zahlen behandeln,
in Variablen speichern, etc.:
>> 1 < 3
ans =
1
>> is1eq3 = (1 == 3)
is1eq3 =
0
Aufgabe 4. Schreiben Sie ein Programm, welches den Benutzer nach Zahlen x und y fragt und das Ergebnis aller bisher vorgestellter Vergleichsoperationen ausgibt:
(.. x , y mit input () erfragen ..)
% Vergleiche x und y:
x < y
x > y
(.. hier weitere Vergleichsoperatoren ..)
Bemerkung: Speichern Sie Ihre Skriptdatei nicht unter dem Namen input.m!
Dies führt zu einem Konflikt, denn MATLAB weiß dann nicht mehr, ob
Sie nun die MATLAB-Funktion oder Ihre .m-Datei aufrufen wollen, dies
führt daher zu einem Fehler.
♢
Als letztes Konstrukt werden wir nun elseif-Blöcke kennenlernen,
welche if-Abfragen mit mehr als zwei Bedingungen erlauben. Zu beachten ist, dass der elseif-Block nur dann ausgeführt wird, wenn die Bedingung der eigentlichen if-Abfrage falsch war.
5
Sitzung 3
if ( Bed . 1)
( Befehle , falls Bed . 1 wahr )
elseif ( Bed . 2)
( Befehle , falls Bed . 1 falsch , Bed . 2 wahr )
end
Es können beliebig viele elseif-Blöcke eingefügt werden, dabei wird
ein Block immer nur ausgeführt, wenn alle vorherigen Blöcke nicht erfüllt
wurden. Ein else-Block ist ebenfalls möglich, dieser wird dann ausgeführt, wenn alle vorherigen Bedingungen nicht erfüllt waren.
Aufgabe 5. Gehen Sie alle Zahlentripel (a, b, c) ∈ N3 mit a, b, c ⩽ 100
durch. Prüfen Sie für jedes Tripel, ob dieses pythagoreisch ist, d.h. ob gilt:
a2 + b2 = c2 .
Hinweis: Sie benötigen mehrere Schleifen.
♢
6
Herunterladen