Advertisement
MaPV

VP_2_PROGONKA

Nov 2nd, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. //задает тридиагональную матрицу
  6. float get_m (float **ma,int n){
  7.     for (int i = 0; i<n; i++){
  8.         for (int j = 0; j<n; j++){
  9.             cout << "уравнение " << i + 1 << "-е коэффициент " << j + 1 << " : ";
  10.             cin >> ma[i][j];
  11.             if (((j>i + 1) || (j<i - 1)) && (ma[i][j] != 0)){
  12.                 cout << "Матрица не тридиагональная" << endl;
  13.                 system ("pause");
  14.                 return 1;
  15.             }
  16.         }
  17.         cout << endl;
  18.     }
  19. }
  20.  
  21. //печатает матрицу
  22. void print_m (float **ma,int size_i){
  23.     cout << "matrix: " << endl;
  24.     for (int i = 0; i<size_i; i++){
  25.         for (int j = 0; j<size_i; j++)
  26.             cout << ma[i][j] << " ";
  27.         cout << endl;
  28.     }
  29.  
  30. }
  31.  
  32. //метод прогонки
  33. void pr (float**MA,int n,float*MB){
  34.     vector<double> P (n),Q (n);
  35.  
  36.     int i,j;
  37.     for (i = 0; i < n; i++){ //поменяли знак главной диагонали
  38.         MA[i][i] = -MA[i][i];
  39.         for (j = 0; j < n; j++){
  40.             cout << MA[i][j] << " ";
  41.         }
  42.         cout << endl;
  43.     }
  44.     cout << endl;
  45.  
  46.     P[0] = MA[0][1] / MA[0][0]; //начальные
  47.     Q[0] = -(MB[0] / MA[0][0]); //          значения p и q
  48.  
  49.     cout << "P   Q\n";
  50.     cout << P[0] << ", " << Q[0] << "\n";
  51.  
  52.     for (i = 1; i <= n - 1; i++){//цикл до n-1, потому что при вычислении P[i] идет обращение к элементу А[i][i+1] (при i = n-1 будет выход за пределы вектора)
  53.         P[i] = (MA[i][i + 1]) / (MA[i][i] - MA[i][i - 1] * P[i - 1]); //последний элемент строки делит на средний, от которого отняли первый умноженный на прерыдущее значение P
  54.         Q[i] = (MA[i][i - 1] * Q[i - 1] - MB[i]) / (MA[i][i] - MA[i][i - 1] * P[i - 1]);//первый элемент строки от которого отняли соотв. элемент правого вектор-столбца делится на средний, от которого отняли первый умноженный на прерыдущее значение P
  55.         if (i!=n-1)
  56.         cout << P[i] << ", " << Q[i] << "\n";else
  57.         cout<<"xx"<<", "<<Q[i]<<"\n";
  58.  
  59.     }
  60.     //делаем так, потому что в цикле не посчиталась Q[n - 1]
  61.     //Q[n - 1] = (MA[n - 1][n - 2] * Q[n - 2] - MB[n - 1]) / (MA[n - 1][n - 1] - MA[n - 1][n - 2] * P[n - 2]);
  62.     MB[n - 1] = Q[n - 1];
  63.  
  64.     for (i = n - 2; i >= 0; i--){ //в правый крайний вектор-стоблец записывает результат
  65.         MB[i] = P[i] * MB[i + 1] + Q[i];
  66.     }
  67.  
  68. }
  69.  
  70.  
  71. int main (){
  72.     setlocale (LC_ALL,"Ru");
  73.     int i,j,n,m;
  74.  
  75.     cout << "введите размерность матрицы А: ";
  76.     cin >> n;
  77.     float **matrix = new    float *[n];
  78.     for (i = 0; i<n; i++)
  79.         matrix[i] = new float[n];
  80.  
  81.     //if (get_m (matrix,n) == 1) return 1;
  82.     get_m(matrix,n);
  83.     print_m (matrix,n);
  84.  
  85.     cout << "введите вектор:\n";
  86.     float* B = new float[n];
  87.     for (i = 0; i < n; i++)
  88.         cin >> B[i]; //правый вектор-столбец
  89.     cout << endl;
  90.  
  91.     pr (matrix,n,B);
  92.  
  93.     cout << "\nРезультат:\n";
  94.     for (i = 0; i < n; i++)
  95.         cout << B[i] << "\n";
  96.  
  97.     system ("pause");
  98.     return 0;
  99. }
  100.  
  101.  
  102. //metod progonki trebuet 3diagonal'nuu matricu => realizaciya gaussa neeffectivna, eto po4ti gauss no isklucheniya stroyatsya inache
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement