Guest User

Untitled

a guest
May 23rd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. const double eps = 1e-12; // otoczenie zera wynoszące 10^-12
  8.  
  9. // Funkcja dokonuje rozkładu LU macierzy A opisana uprzednio w algorytmie
  10.  
  11. bool rozklad(int n, double A[4][4])
  12. {
  13.     int i,j,k; //dane pomocnicze do przechodzenia macierzy
  14.  
  15.     for(k = 0; k < n - 1; k++)
  16.     {
  17.         if(fabs(A[k][k]) < eps) return false;
  18.  
  19.         for(i = k + 1; i < n; i++)
  20.         {
  21.             A[i][k] /= A[k][k]; //normalizacja kolumny
  22.         }
  23.  
  24.         for(i = k + 1; i < n; i++)
  25.         {
  26.             for(j = k + 1; j < n; j++)
  27.             {
  28.                  A[i][j] -= A[i][k] * A[k][j];//modyfikacja podmacirzy
  29.             }
  30.         }
  31.     }
  32.  
  33.     return true;
  34. }
  35.  
  36. // Funkcja wyznacza wektor X na podstawie A i B
  37.  
  38. bool rozwiaz(int n, double A[4][4], double B[4], double * X)
  39. {
  40.     int    i,j;
  41.     double s; // zmienna przechowywująca sumę iloczynów
  42.  
  43.     X[0] = B[0]; //  wyliczamy wyrazy wektora Y
  44.  
  45.     for(i = 1; i < n; i++)
  46.     {
  47.         s = 0; // zerujemy sumę iloczynow
  48.  
  49.         for(j = 0; j < i; j++)
  50.         {
  51.             s += A[i][j] * X[j]; // obliczamy sumę iloczynów l(i,j) x y(j)
  52.         }
  53.         X[i] = B[i] - s; // obliczamy y(i)
  54.     }
  55.  
  56.     if(fabs(A[n-1][n-1]) < eps) return false; // błąd dzielenia przez 0, zakończ
  57.  
  58.     X[n-1] /= A[n-1][n-1]; // obliczamy wektor X
  59.  
  60.     for(i = n - 2; i >= 0; i--)
  61.     {
  62.         s = 0; // zerujemy sumę
  63.  
  64.         for(j = i + 1; j < n; j++)
  65.         {
  66.             s += A[i][j] * X[j]; // obliczamy sumę iloczynów u(i,j) x x(j)
  67.         }
  68.         if(fabs(A[i][i]) < eps) return false; // blad dzielenia przez 0
  69.  
  70.         X[i] = (X[i] - s) / A[i][i]; //  obliczamy x(i)
  71.     }
  72.  
  73.     return true; // zmienna boolowska przyjmuje wartosc true - sukces
  74. }
  75.  
  76. // Program główny
  77.  
  78. int  main()
  79. {
  80.     double *X;
  81.     int n,i,j;
  82.  
  83.     cout << setprecision(4) << fixed; // podanie wyników z dokaldnością do 4 miejsc po przecinku
  84.  
  85.     n=4;  // liczba niewiadomych w rownaniu
  86.  
  87.     // wczytujemy macierze macierze A, B oraz inicjujemy macierz X
  88.  
  89.     X = new double [n];
  90.  
  91.     // macierz A wspolczynnikow stojacyh przy niewiadomych
  92.  
  93.     double A[4][4] =
  94.     {
  95.         {2.0, 3.0, 2.0, 4.0},
  96.         {1.0, 2.0, -3.0, -2.0},
  97.         {3.0, 2.0, -2.0, 1.0},
  98.         {-1.0, 4.0, 1.0, -5.0}
  99.     };
  100.  
  101.     // macierz B wyrazow wolnych
  102.     double B[4] = {8.0,-4.0,2.0,-5.0};
  103.  
  104.     // rozwiązujemy układ i wyświetlamy wyniki
  105.     cout<<"Układ równań rozwiązany metodą LU ma następujące wyniki: "<<endl<<endl;
  106.  
  107.     if(rozklad(n,A) && rozwiaz(n,A,B,X))
  108.     {
  109.         for(i = 0; i < n; i++)
  110.             cout << "x" << i + 1 << " = " << X[i] << endl;
  111.     }
  112.     else cout << "DZIELNIK ZERO\n"; // blad dzielenia przez 0
  113.  
  114.  
  115.     return 0;
  116. }
Add Comment
Please, Sign In to add comment