|
|
|
@@ -71,7 +71,7 @@ NumberType frobeniusNorm(const hdnum::DenseMatrix<NumberType> &A) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 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 |
|
|
|
@@ -82,61 +82,72 @@ 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(); |
|
|
|
} |
|
|
|
|
|
|
|
// Hauptprogramm |
|
|
|
int main(int argc, char ** argv) |
|
|
|
{ |
|
|
|
|
|
|
|
// Anzahl der Knoten |
|
|
|
const int N(10); |
|
|
|
std::cout << "Knotenanzahl N: " << N << std::endl; |
|
|
|
|
|
|
|
// Größe der Matrix |
|
|
|
const int n(N*N-1); |
|
|
|
|
|
|
|
// Datentyp für die Matrix |
|
|
|
typedef double REAL; |
|
|
|
|
|
|
|
// Matrix initialisieren |
|
|
|
hdnum::DenseMatrix<REAL> A(n,n); |
|
|
|
|
|
|
|
// Pretty-printing einmal setzen für alle Matrizen |
|
|
|
A.scientific(false); |
|
|
|
A.width(15); |
|
|
|
|
|
|
|
flussMatrix(A); |
|
|
|
if (N<=4) |
|
|
|
std::cout << A << std::endl; |
|
|
|
|
|
|
|
// Bei Schwierigkeiten mit Teilaufgabe a) können Sie Teilaufgaben b) |
|
|
|
// und c) mit folgender Matrix testen |
|
|
|
int size_b = 3; |
|
|
|
hdnum::DenseMatrix<REAL> B(size_b,size_b); |
|
|
|
for (std::size_t i=0; i<size_b; ++i) |
|
|
|
{ |
|
|
|
for (std::size_t j=0; j<size_b; ++j) |
|
|
|
{ |
|
|
|
B[i][j] = i+j; |
|
|
|
int main(int argc, char ** argv) { |
|
|
|
// Anzahl der Knoten |
|
|
|
const int N(10); |
|
|
|
std::cout << "Knotenanzahl N: " << N << std::endl; |
|
|
|
|
|
|
|
// Größe der Matrix |
|
|
|
const int n(N*N-1); |
|
|
|
|
|
|
|
// Datentyp für die Matrix |
|
|
|
typedef double REAL; |
|
|
|
|
|
|
|
// Matrix initialisieren |
|
|
|
hdnum::DenseMatrix<REAL> A(n,n); |
|
|
|
|
|
|
|
// Pretty-printing einmal setzen für alle Matrizen |
|
|
|
A.scientific(false); |
|
|
|
A.width(15); |
|
|
|
|
|
|
|
flussMatrix(A); |
|
|
|
if (N<=4) |
|
|
|
std::cout << A << std::endl; |
|
|
|
|
|
|
|
// Bei Schwierigkeiten mit Teilaufgabe a) können Sie Teilaufgaben b) |
|
|
|
// und c) mit folgender Matrix testen |
|
|
|
int size_b = 3; |
|
|
|
hdnum::DenseMatrix<REAL> B(size_b,size_b); |
|
|
|
for (std::size_t i=0; i<size_b; ++i) { |
|
|
|
for (std::size_t j=0; j<size_b; ++j) { |
|
|
|
B[i][j] = i+j; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
std::cout << "Zeilen-Summen-Norm: " << A.norm_infty() << std::endl; |
|
|
|
std::cout << "Spalten-Summen-Norm: " << A.norm_1() << std::endl; |
|
|
|
std::cout << "Frobenius-Norm: " << frobeniusNorm(A) << std::endl; |
|
|
|
std::cout << "Maximaler Eigenwert: " << maxEigenwert(A) << std::endl; |
|
|
|
std::cout << "Zeilen-Summen-Norm: " << A.norm_infty() << std::endl; |
|
|
|
std::cout << "Spalten-Summen-Norm: " << A.norm_1() << std::endl; |
|
|
|
std::cout << "Frobenius-Norm: " << frobeniusNorm(A) << std::endl; |
|
|
|
std::cout << "Maximaler Eigenwert: " << maxEigenwert(A) << std::endl; |
|
|
|
|
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |