Technische Universität München M2 - Numerische Mathematik Dr. Lorenz John 1.2. Übung. Einführung in die Programmierung (MA 8003) Hinweis: Alle Aufgaben können ohne Schleifen gelöst werden. Aufgabe 1.2.1: Der Befehl [L,R] = lu(A) erzeugt eine Zerlegung einer invertierbaren Matrix A in eine obere und untere Dreiecksmatrix. Es gilt A = LR. Sei A = 2*eye(10) + rand(10) eine Zufallsmatrix und b=2*rand(10,1) ein Zufallsvektor. Erzeugen Sie die LR-Zerlegung mit dem obigen Befehl. • Lösen Sie das Gleichungssystem LRx=b mit dem Backslash-Operator ohne die Matrix A zu verwenden. • Lösen Sie dasselbe System nun durch zweimaliges Anwenden des Backslash-Operators und ohne dabei das Produkt LR zu bilden. Überprüfen Sie Ihre Ergebnisse. Lösung 1.2.1: • x = (L*R)\b • x = R\(L\b) Aufgabe 1.2.2: Mit Hilfe des Befehls inv kann die Inverse einer quadratischen Matrix bestimmt werden. Diesen Befehl sollte man allerdings nur dann verwenden, wenn die Inverse explizit benötigt wird und nicht zum Lösen von linearen Gleichungssystemen. Erzeugen Sie mit R=rand(1500); r=0.5*(1:1500)’; eine Matrix und einen Vektor mit Zufallseinträgen. Lösen Sie das LGS Rx = r einmal mit der Inversen und einmal mit dem Backslash-Operator. Messen Sie die Zeit, die jeweils zum Lösen benötigt wird, mit tic und toc (vgl. Hilfe). Lösung 1.2.2: >> tic; x = R\r; toc; Elapsed time is 0.160578 seconds. >> tic; x = inv(R)*r; toc; Elapsed time is 0.313383 seconds. In diesem Beispiel ist das Lösen mit Hilfe des Backslash-Operators um Faktor 2 schneller. Aufgabe 1.2.3: Gegeben sei eine invertierbare 10 × 10-Matrix A. Verwenden Sie den BackslashOperator, um mit einem Befehl die Inverse von A zu berechnen und überprüfen Sie das Ergebnis. Lösung 1.2.3: IA = A\eye(10); Aufgabe 1.2.4 (*): Lösen Sie die erste Aufgabe von Project Euler (http://projecteuler.net): Add all the natural numbers below one thousand that are multiples of 3 or 5. Tipp: Die Lösung ist 233168. Seite 1 von 4 Lösung 1.2.4: sum(3:3:999)+sum(5:5:999)-sum(15:15:999) oder direkt 3*333*334/2 + 5*199*200/2 - 15*66*67/2 Aufgabe 1.2.5: Lösen Sie die sechste Aufgabe von Project Euler: Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. Tipp: Die Lösung ist 25164150. Lösung 1.2.5: sum(1:100).^2 - sum((1:100).^2) oder direkt (100*101/2)^2 - 100*101*201/6 Aufgabe 1.2.6 (*): Gegeben sei ein Vektor v mit allen Zahlen von 1 bis n nicht sortiert, in dem eine zufällige Zahl fehlt. a) Wie kann man mit Matlab einen solchen Vektor schnell erzeugen? Tipp: Suchen Sie in der Hilfe nach „permutation“ b) Lassen Sie sich mit einer Matlab-Zeile die fehlende Zahl eines solchen Vektors ausgeben. Lösung 1.2.6: a) v=randperm(n); v(1)=[]; b) n*(n+1)/2 - sum(v) Aufgabe 1.2.7: Schreiben Sie eine Matlab-Zeile, die für eine vorgegebene ganze Zahl n die Fakultät n! berechnet. Benutzen Sie dabei nicht die Matlab-Funktion factorial. Lösung 1.2.7: prod(1:n) Aufgabe 1.2.8: Erstellen Sie eine beliebige 2 × 2 Matrix A und eine 4 × 4 Matrix B. Addieren Sie A zu einer 2 × 2 Submatrix von B. Lösung 1.2.8: Aufgabe 1.2.9: z.B. B([1,2],[1,2]) = B([1,2],[1,2]) + A Erzeugen Sie einen Vektor r = 1:10. Ändern Sie r mit einem Befehl so, a) dass die Zahlen in umgekehrter Reihenfolge in r stehen, b) dass die ersten fünf Einträge mit den letzten fünf Einträgen vertauscht werden. Funktioniert Ihre Methode auch für Vektoren beliebiger gerader Länge? Schreiben Sie Ihre Methode ggf. längenunabhängig um. Lösung 1.2.9: a) r = r(end:-1:1) b) r = r([end/2+1:end 1:end/2]) Aufgabe 1.2.10 (*): Sei v ein Zeilenvektor. Geben Sie eine andere Möglichkeit an, die Ausgabe des Befehls repmat(v,15,1) zu erzeugen ohne den Befehl repmat zu verwenden. Lösung 1.2.10: v(ones(1,15),:) oder ones(15,1)*v Seite 2 von 4 Aufgabe 1.2.11 (*): Gegeben sei eine 10 × 10-Matrix R mit Zufallseinträgen. Setzen Sie die Diagonalelemente von R auf den Wert 1. Lösung 1.2.11: R = rand(10); R(1:11:end) = 1; Aufgabe 1.2.12: Erzeugen Sie mit Hilfe des Doppelpunktoperators und geeigneter Indizierung einen Vektor a mit den Zahlen zwischen 0 und 20, die folgenden Sequenzen entsprechen: a) 0,0,2,2,4,4,6,6,8,8,. . . b) 0,1,3,4,6,7,9,10,12,. . . Lösung 1.2.12: a) a = 0:20; a(2:2:22) = 0:2:20 alternativ a = 0:2:20; a = a([1 1],:); a = a(:); b) a = 0; a(1:2:14) = 0:3:20; a(2:2:14) = 1:3:20; alternativ a = [0:3:18;1:3:19]; a(:)’ Aufgabe 1.2.13 (*): Erzeugen Sie möglichst einfach die 10 × 10-Matrix A mit Einträgen a) aij = 10 ∗ j + i Tipp: lineares Indizieren! b) aij = i ∗ j Tipp: Geeignetes Produkt c) aij = i + j Tipp: repmat Lösung 1.2.13: a) A = zeros(10); A(:) = 11:110; alternativ A = (1:10)’*ones(1,10) + 10*ones(10,1)*(1:10) b) A = (1:10)’*(1:10) c) v = 1:10; A = repmat(v,10,1) + repmat(v’,1,10); alternativ A = (1:10)’*ones(1,10) + ones(10,1)*(1:10) Aufgabe 1.2.14 (*): Folgender Code stammt aus einer Matlab-Funktion: m = max([1; n(:)]); N = [1 1 cumprod(2:m)]; n(:) = N(n+1); Finden Sie heraus, was dieser Code macht. Aus welchem Raum sollten die Werte in n stammen, damit dieser Code seine Aufgabe sinnvoll erledigt? Lösung 1.2.14: Dieser Code berechnet für eine Matrix oder Vektor mit Einträgen aus N die Fakultät komponentenweise. Aufgabe 1.2.15: Erweitern Sie möglichst schnell eine nicht quadratische Matrix um so viele 0-Zeilen bzw. -Spalten, dass sie quadratisch wird. Lösung 1.2.15: B(length(B),length(B)) = 0 Seite 3 von 4 Aufgabe 1.2.16: Gegeben sei der Vektor x=1:12. Machen Sie sich anhand der Beispiele reshape(x,3,4) und reshape(x,6,2) klar, wie der reshape-Befehl die Zahlen anordnet. Was macht reshape(x,3,[])? Wie kann man mit Hilfe des reshape-Befehls aus x die folgende Matrix erzeugen: 1 5 9 2 6 10 3 7 11 4 8 12 Lösung 1.2.16: Der reshape Befehl ordnet die Elemente Spaltenweise an. Um die obige Matrix zu erzeugen, verwende reshape(x,4,3)’. Seite 4 von 4