update num and lectures

This commit is contained in:
2020-05-29 00:27:46 +02:00
parent 9507d93385
commit 83469609ed
5 changed files with 71 additions and 45 deletions
+20 -5
View File
@@ -248,7 +248,7 @@ NumberType frobeniusNorm(const hdnum::DenseMatrix<NumberType> &A) {
\item Auszug aus \textit{rohrleitungsnetzwerk.cc}
\begin{lstlisting}[language=C++, title=Eigenwertberechnung, captionpos=b]
// Funktion zur Berechnung des betragsgrößten Eigenwertes mit Potenzmethode
// Funktion zur Berechnung des betragsgroessten Eigenwertes mit Potenzmethode
template<class NumberType>
NumberType maxEigenwert(const hdnum::DenseMatrix<NumberType> &A) {
// Error checking
@@ -259,18 +259,33 @@ NumberType maxEigenwert(const hdnum::DenseMatrix<NumberType> &A) {
// start vektor
hdnum::Vector<NumberType> r(N);
r[0] = 1;
r[0] = 0;
// work copy
hdnum::Vector<NumberType> r_tmp(N);
hdnum::Vector<NumberType> diff(N);
// fuehre iterationsschritt 10000 mal aus
// finde vektor mit Ar != 0
for (int i = 0;;i++) {
A.mv(r_tmp, r); // r_tmp = Ar
if (r_tmp.two_norm() > 0) {
// Ar != 0
break;
} else if (i >= 100) {
// breche ab, wenn kein passender startvektor gefunden werden kann
HDNUM_ERROR("Kann keinen Vektor mit Ax != 0 finden. Ist A = 0?");
}
// Ar = 0, modifiziere start vektor
r[i % N] += 1;
}
// fuehre iterationsschritt maximal 10000 mal aus
for (int k=0; k<10000; k++) {
A.mv(r_tmp, r); // r_tmp = Ar
r_tmp /= r_tmp.two_norm(); // normiere r_tmp
if ((r-r_tmp).two_norm() == 0)
// breche ab ab, wenn maximale genauigkeit erreicht wurde
break;
r = r_tmp;
}
A.mv(r_tmp, r);
// berechne eigenwert mit rayleigh quotient
A.mv(r_tmp, r); // r_tmp = Ar
return (r * r_tmp)/r.two_norm_2();
}\end{lstlisting}
\end{enumerate}