1.2. Übung. Einführung in die Programmierung (MA 8003)

Werbung
Technische Universität München
M2 - Numerische Mathematik
Dr. Laura Scarabosio
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
Aufgabe 1.2.16: Erstellen Sie eine 4 × 4 Matrix A mit dem Befehl magic und berechnen Sie
die Summe der Spalten, die Summe der Zeilen und die Summe der Diagonale.
Seite 3 von 4
Lösung 1.2.16:
>>
>>
>>
>>
A=magic(4);
sum(A,1)
sum(A,2)
sum(diag(A))
Man bemerkt, dass alle Summen den gleichen Wert ergeben.
Aufgabe 1.2.17: 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.17: Der reshape Befehl ordnet die Elemente Spaltenweise an. Um die obige Matrix
zu erzeugen, verwende reshape(x,4,3)’.
Seite 4 von 4
Herunterladen