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