Einf ¨uhrung in die Numerik ( Wintersemester 2015/16 ) Aufgabenblatt 7
Prof. Dr. Peter Bastian, Dominic Kempf Abgabe 11. Dezember 2015
IWR, Universit¨at Heidelberg
Ubung 1¨ LR Zerlegung im Besonderen
SeiA∈Rn×ngegeben durch
aij =
+1 wenni=j oderj =n
−1 wenni > j 0 sonst.
a) Begr ¨unden Sie, dass die LR Zerlegung ohne Pivotisierung vonAdie Eigenschaften
|lij| ≤1 und rnn= 2n−1 erf ¨ullt.
b) Zeigen Sie, dass f ¨ur eine LR Zerlegung mit totaler (Zeilen und Spalten) Pivotisierung gilt:
|rnn|= 2 = max
i,j=1..n{rij}
Tipp: Erstmal f ¨urn= 4ausprobieren und dann passenden Induktionsbeginn w¨ahlen.
( 5 Punkte ) Ubung 2¨ LR-Zerlegung tridiagonaler Matrizen
Gegeben sei eine Tridiagonalmatrix
A=
a1 b1 0
c2 a2 b2 . .. ... ...
. .. ... bn−1
0 cn an
mit |a1|>|b1|>0
|aj| ≥ |bj|+|cj|>0, bj, cj 6= 0, j ∈ {2, ..., n−1}
|an| ≥ |cn|>0. Zeigen Sie: Der Algorithmus
r1 :=a1
lj :=cj/rj−1 j ∈ {2, ..., n}
rj :=aj−ljbj−1 j ∈ {2, ..., n}
ist durchf ¨uhrbar (d.h.r1,· · ·, rn6= 0) und liefert die LR-Zerlegung
A=
1 0
l2 1 . .. ...
0 ln 1
r1 b1 0
r2 . ..
. .. bn−1
0 rn
Es gilt somitdet(A) =
n
Q
i=1
ri6= 0, woraus die Invertierbarkeit vonAfolgt.
( 5 Punkte )
Ubung 3¨ LR-Zerlegung mit Pivotsuche (Praktische ¨Ubung)
a) F ¨uge der HeaderdateiLR.hhaus der letzten praktischen ¨Ubung drei neue Funktionen hinzu:
template<typename T>
void row_equilibrate (hdnum::DenseMatrix<T>& A, hdnum::Vector<T>& s) {...}
soll die Zeilen¨aquilibrierung der MatrixAdurchf ¨uhren. In den Vektor ssollen die einzelnen Zeilenbetragssummen abgespeichert werden. Diese werden ben ¨otigt, auch die rechte Seite b richtig zu skalieren. Daf ¨ur ist die Funktion
template<typename T>
void apply_equilibrate (const hdnum::Vector<T>& s, hdnum::Vector<T>& b) {...}
gedacht.
Die Funktion
template<typename T>
void lr_partialpivot (hdnum::DenseMatrix<T>& A,
hdnum::Vector<std::size_t>& perm) {...}
soll daraufhin die LR-Zerlegung von A mit Spaltenpivotsuche berechnen und das Ergebnis L undR wiederum in die Matrix Aspeichern. Der Indexvektorperm soll sich die Permutation der Zeilen merken. Diese Funktion soll die Funktionvoid lr(...) aus der letzten ¨Ubung ersetzen. Der Rest der Schritte zur L ¨osung eines linearen Gleichungssystems analog wie in der letzten praktischen ¨Ubung. (SiehetestLR.ccaus dem ¨Ubungsblatt 6.)
b) Schreiben Sie ein neues C++-Programm, welches unter Benutzung der LR-Zerlegung – ohne Spaltenpivotsuche
– mit Spaltenpivotsuche
– mit Spaltenpivotsuche und zus¨atzlich noch vorheriger Zeilen¨aquilibrierung das Gleichungssystem
10−16 0 10−16 3·10−16
1 10 0 23
4 12 12 0
5·1012 0 1012 1011
·x=
1.6·10−15 113
64 8.4·10+12
l ¨ost und vergleichen Sie das numerische Ergebnis mit der exakten L ¨osungx= (1,2,3,4)T.
c) Schreiben Sie eine neue Funktion template<typename T>
void lr_fullpivot( hdnum::DenseMatrix<T>& A, hdnum::Vector<std::size_t>& p, hdnum::Vector<std::size_t>& q ) {...}
zur LR-Zerlegung vonA mit totaler Pivotisierung. Dabei merkt man sich nicht nur die Zeilen- vertauschungen in einem Indexvektor p, sondern auch die Spaltenvertauschungen in einem Indexvektorq. Die Zeilenvertauschungen inpm ¨ussen mittels der Funktion
void permute forward()nach btransportiert werden. Entsprechend m ¨ussen die Spalten- vertauschungen inqmittels einer neuen Funktion
template<typename T>
void permute_backward (const hdnum::Vector<std::size_t>& q, hdnum::Vector<T>& x )
{...}
nachxtransportiert werden!
( 10 Punkte )