TU München April 2009 2. Übungsblatt Ferienkurs Matlab Boris von Loesch 2 http://ferienkurse.ma.tum.de/ logische Indizierung, Kontrollstrukturen, Funktionen Aufgabe 2.1 Erzeugen Sie eine 40 × 40-Matrix mit Zufallswerten zwischen −0.5 und 2. Finden Sie mit einem Befehl raus, a) ob, alle Einträge positiv sind, b) ob alle Spalten negative Einträge haben, c) ob ein Eintrag gröÿer als 1.99 ist. d) die Nummern der Zeilen, die einen negativen und einen Eintrag gröÿer als 1.99 hat. Aufgabe 2.2 Permutationen auf {1 . . . n} können als Permutationsmatrix oder in folgender Form dargestellt werden: σ= 1 2 ··· n σ(1) σ(2) · · · σ(n) Im letzteren Fall reicht es, die zweite Zeile zu speichern. Finden Sie Wege, in MATLAB die eine in die andere Form umzuwandeln und umgekehrt. 0 0 1 Z.B. P = 1 0 0 korrespondiert zu s = (2, 3, 1) 0 1 0 1 Aufgabe 2.3 0 Es sei die Matrix A = 4 16 25 1 1 1 1 0 2 3 8 9 4 28 1 3 4 5 1 0 1 gegeben. 2 6 T a) Lösen Sie das lineare Gleichungssystem Ax = b für b = 25 25 134 166 147 . 19 25 26 19 18 20 20 23 20 17 b) Lösen Sie Ax = B mit B = 111 139 166 105 115 118 206 294 90 148 128 118 149 90 108 Überprüfen Sie die Lösungen! TU München April 2009 2. Übungsblatt Ferienkurs Matlab Boris von Loesch http://ferienkurse.ma.tum.de/ 1 3 5 1 1 2 Aufgabe 2.4 T Es sei die Matrix A = 1 −1 0 und b = (0.9, 0.7, 0.5, 20, 4) gegeben. 1 −3 2 1 0 5 Bestimmen sie x so, dass kAx − bk2 minimal ist, einmal mit Hilfe des Backslash Operators, einmal durch Lösen der Normalengleichung (AT Ax = AT b). Stimmen die Lösungen überein? Aufgabe 2.5 Erzeugen Sie die Hilbertmatrix H der Dimension 10 × 10 und den Vektor b mit den Zahlen von 1 bis 10. Lösen Sie das lineare Gleichungssystem Hx = b mit folgenden Methoden: a) Explizit mit der inversen Hilbertmatrix (invhilb(10)), b) mit dem Backslash Operator, c) durch eine LR-Zerlegung mit Pivotierung ([L,R,P]=lu(H)) d) durch eine QR-Zerlegung. Vergleichen Sie die Ergebnisse, wo ist der Fehler in der 2-Norm am gröÿten? Welchen Algorithmus verwendet der Backslash Operator intern? (Tipp: Hilfe zu mldivide) Ferienkurs Matlab Boris von Loesch TU München April 2009 2. Übungsblatt http://ferienkurse.ma.tum.de/ Aufgabe 2.6 x sei ein Zeilenvektor (z.B. x=1:10). Eliminieren Sie die for-Schleife: a) n=0; for i=1:length(x) n = n + x(i)^2 end b) y = zeros(1,length(x)); y(1) = x(1) + 2*x(end); for i=2:length(x); y(i) = x(i) + 2*x(i-1); end c) max_err = 0; n=100; f0 = sin(pi/4); f1 = sin(1); for x=linspace(0,1,n), p=x*f1+(1-x)*f0; err=abs(sin(x)-p); max_err=max(max_err,err); end Überzeugen Sie sich, dass Ihre Ergebnisse stimmen, indem Sie die Rückgabe Ihrer Lösung mit dem angegeben Programm vergleichen. Aufgabe 2.7 Erzeugen Sie mit dem inline Befehl die Funktion (x2 · y 2 )/2. Funktioniert die Funktion auch, wenn man einen Vektor als Argument übergibt? Ändern Sie Ihre Funktion ggf. ab. Was macht der Befehl vectorize. Aufgabe 2.8 Erstellen Sie eine Funktion f, die für die Eingabe x ∈ R+ den Mittelwert aus x und 2/x berechnet. Speichern Sie in y eine beliebige positive Zahl. Konvergiert die Iteration y = f(y)? Implementieren Sie eine while-Schleife, die bei Konvergenz abbricht (|y − f (y)| ≤ 10−16 ). Haben Sie eine Idee was das Ergebnis ist? Aufgabe 2.9 Bearbeiten Sie Aufgabe 1.25, wenn Sie es noch nicht gemacht haben. TU München April 2009 2. Übungsblatt Ferienkurs Matlab Boris von Loesch http://ferienkurse.ma.tum.de/ Aufgabe 2.10 Schreiben Sie eine Funktion H=hilb_gen(n), die eine n x n Hilbertmatrix erzeugt. Verwenden sie möglichst wenig for-Schleifen. Hilbertmatrizen sind deniert als Hn = 1 i+j−1 i,j=1,··· ,n 1 1 2 = .. . 1 n 1 2 1 3 ··· ··· 1 n 1 n+1 1 n+1 ··· 1 2n−1 .. . .. . Überprüfen sie für n = 1, · · · , 5, ob ihre eben geschrieben Funktion die gleiche Matrix ausgibt wie hilb(n). Aufgabe 2.11 Finden Sie einen möglichst kurzen Weg, der Diagonalen einer Matrix den Wert 0 zuzuweisen. Schreiben Sie eine Funktion zero_diag, die als Eingabe eine Matrix erhält und die wie oben veränderte Matrix zurückgibt. Erweitern Sie diese Funktion um einen zweiten Parameter k , der angeben soll, welche Diagonale überschrieben wird (z.B. k = −1 für die Subdiagonale). Testen Sie ihre Funktion an einer zufälligen 5 × 5-Matrix und einer 3 × 6Matrix. Aufgabe 2.12 Schreiben Sie eine Funktion, die als Parameter eine Funktionsreferenz, eine natürliche Zahl n und zwei double-Werte a, b hat. Sie soll nun die Funktionsreferenz an n gleich weit voneinander entfernten Stellen, beginnend bei a bis zur Obergrenze b, auswerten und die Ergebnisse in einem Vektor y speichern, der dann zurückgegeben wird. Testen Sie ihre Funktion mit der x2 Funktionsreferenz √12π e− 2 , n = 60, a = −3, b = 3. Aufgabe 2.13 Implementieren Sie eine eigene Variante der MATLAB-Funktion primes. Diese Funktion berechnet die Primzahlen von 2 bis n. Dabei soll weder die Matlab-Funtion primes noch die Funktion isprime verwendet werden. >> myprimes(11) ans = 2 3 5 7 11 Verwenden Sie dazu das Sieb des Eratosthenes : Legen Sie einen Vektor mit allen Zahlen von 2 bis n an. Streichen bzw. markieren Sie nun alle Vielfachen der ersten Zahl des Vektors. Wiederholen Sie das Vorgehen mit der nächsten nicht markierten Zahl im Vektor und so fort. Brechen Sie ab, wenn Sie die letzte Zahl erreicht haben.