Für Vorlesungen, bitte die Webseite verwenden. https://flavigny.de/lecture
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
3.6KB

  1. // Kompilieren mit:
  2. //
  3. // g++ -I../hdnum/ -o rohrleitungsnetzwerk rohrleitungsnetzwerk.cc
  4. //
  5. // Das setzt voraus, dass ihr Programm in einem Ordner parallel zur
  6. // entpackten HDNum Bibliothek liegt.
  7. #include <iostream>
  8. #include <cstdlib>
  9. #include "hdnum.hh"
  10. // Funktion zum Aufstellen der Matrix
  11. template<class NumberType>
  12. void flussMatrix( hdnum::DenseMatrix<NumberType> &A ) {
  13. int M( A.rowsize() );
  14. int N( A.colsize() );
  15. if(M!=N)
  16. HDNUM_ERROR("Matrix muss quadratisch sein!");
  17. // Numerierung wie auf Zettel 3 nur mit 0 beginnend
  18. // also v_0, ... ,v_(N^2-1)
  19. // der Referenzknoten v_r hat Druck 0
  20. // berechnung der kantenlaenge
  21. int n = floor(sqrt(N+1));
  22. for(int i = 0; i < N; i++) {
  23. int edges = 0;
  24. if ((i+1)%n != 0) { // nicht linker rand
  25. edges++;
  26. if (i-1 >= 0) A(i, i-1) = -1; // falls nicht der referenzknoten
  27. }
  28. if ((i+2)%n != 0) { // nicht rechter rand
  29. edges++;
  30. A(i, i+1) = -1;
  31. }
  32. if (i+n < N) { // nicht unterer rand
  33. edges++;
  34. A(i, i+n) = -1;
  35. }
  36. if (i-n >= -1) { // nicht oberer rand
  37. edges++;
  38. if (i-n >= 0) A(i, i-n) = -1; // falls nicht der referenzknoten
  39. }
  40. A(i, i) = edges;
  41. }
  42. }
  43. // Funktion zur Berechnung der Frobenius-Norm einer Matrix
  44. template<class NumberType>
  45. NumberType frobeniusNorm(const hdnum::DenseMatrix<NumberType> &A) {
  46. // Error checking
  47. int M(A.rowsize());
  48. int N(A.colsize());
  49. if(M!=N)
  50. HDNUM_ERROR("Matrix muss quadratisch sein!");
  51. NumberType result=0.0;
  52. // iteriere ueber alle zeilen und spalten, quadriere die elemente und summiere
  53. for (int i=0; i < N; i++) {
  54. for (int j=0; j < N; j++) {
  55. result += pow(A(i,j), 2);
  56. }
  57. }
  58. // ziehe wurzel aus summe
  59. return sqrt(result);
  60. }
  61. // Funktion zur Berechnung des betragsgrößten Eigenwertes mit Potenzmethode
  62. template<class NumberType>
  63. NumberType maxEigenwert(const hdnum::DenseMatrix<NumberType> &A) {
  64. // Error checking
  65. int M(A.rowsize());
  66. int N(A.colsize());
  67. if(M!=N)
  68. HDNUM_ERROR("Matrix muss quadratisch sein!");
  69. // start vektor
  70. hdnum::Vector<NumberType> r(N);
  71. r[0] = 1;
  72. // work copy
  73. hdnum::Vector<NumberType> r_tmp(N);
  74. hdnum::Vector<NumberType> diff(N);
  75. // fuehre iterationsschritt 10000 mal aus
  76. for (int k=0; k<10000; k++) {
  77. A.mv(r_tmp, r); // r_tmp = Ar
  78. r_tmp /= r_tmp.two_norm(); // normiere r_tmp
  79. r = r_tmp;
  80. }
  81. A.mv(r_tmp, r);
  82. // berechne eigenwert mit rayleigh quotient
  83. return (r * r_tmp)/r.two_norm_2();
  84. }
  85. // Hauptprogramm
  86. int main(int argc, char ** argv)
  87. {
  88. // Anzahl der Knoten
  89. const int N(10);
  90. std::cout << "Knotenanzahl N: " << N << std::endl;
  91. // Größe der Matrix
  92. const int n(N*N-1);
  93. // Datentyp für die Matrix
  94. typedef double REAL;
  95. // Matrix initialisieren
  96. hdnum::DenseMatrix<REAL> A(n,n);
  97. // Pretty-printing einmal setzen für alle Matrizen
  98. A.scientific(false);
  99. A.width(15);
  100. flussMatrix(A);
  101. if (N<=4)
  102. std::cout << A << std::endl;
  103. // Bei Schwierigkeiten mit Teilaufgabe a) können Sie Teilaufgaben b)
  104. // und c) mit folgender Matrix testen
  105. int size_b = 3;
  106. hdnum::DenseMatrix<REAL> B(size_b,size_b);
  107. for (std::size_t i=0; i<size_b; ++i)
  108. {
  109. for (std::size_t j=0; j<size_b; ++j)
  110. {
  111. B[i][j] = i+j;
  112. }
  113. }
  114. std::cout << "Zeilen-Summen-Norm: " << A.norm_infty() << std::endl;
  115. std::cout << "Spalten-Summen-Norm: " << A.norm_1() << std::endl;
  116. std::cout << "Frobenius-Norm: " << frobeniusNorm(A) << std::endl;
  117. std::cout << "Maximaler Eigenwert: " << maxEigenwert(A) << std::endl;
  118. return 0;
  119. }