Advertisement
silicogel

Untitled

Apr 25th, 2024
414
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.37 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <omp.h>
  4. #include <windows.h>
  5. #include <complex>
  6. using namespace std;
  7.  
  8. void jacobi(int N) {
  9.     const double eps = 0.0001;
  10.     char nameA[50], nameB[50], matrx[50];
  11.     sprintf_s(nameA, "matrixAComplex%d.txt", N);
  12.     sprintf_s(nameB, "matrixBComplex%d.txt", N);
  13.     sprintf_s(matrx, "JacobiRes%d.txt", N);
  14.     ifstream matrA(nameA);
  15.     ifstream matrB(nameB);
  16.     ofstream matrX(matrx);
  17.     if (!matrA.is_open() || !matrB.is_open() || !matrX.is_open()) {
  18.         cout << "Ошибка открытия файла" << endl;
  19.         return;
  20.     }
  21.     complex<double>* matrixB = new complex<double>[N];
  22.     complex<double>* matrixx = new complex<double>[N];
  23.     complex<double>* matrixxx = new complex<double>[N];
  24.     complex<double>** matrixA = new complex<double>* [N];
  25.  
  26.     for (int i = 0; i < N; i++) {
  27.         matrixA[i] = new complex<double>[N];
  28.     }
  29.  
  30.     for (int i = 0; i < N; i++) {
  31.         for (int j = 0; j < N; j++) {
  32.             matrA >> matrixA[i][j];
  33.         }
  34.         matrB >> matrixB[i];
  35.         matrixx[i] = 1.0; // Инициализация начального приближения
  36.         matrixxx[i] = 1.0; // Инициализация вектора для нового приближения
  37.     }
  38.  
  39.     matrA.close();
  40.     matrB.close();
  41.     double x_max = -1.0, count;
  42.     complex<double> sum1, sum2;
  43.     double tn = omp_get_wtime();
  44.     do {
  45.         x_max = -1.0;
  46.         for (int i = 0; i < N; i++) {
  47.             sum1 = 0.0; // Сумма для элементов ниже диагонали
  48.             sum2 = 0.0; // Сумма для элементов выше диагонали
  49.             for (int j = 0; j < N; j++)
  50.             {
  51.                 if (j < i)
  52.                     sum1 += matrixA[i][j] * matrixx[j];
  53.                 if (j > i)
  54.                     sum2 += matrixA[i][j] * matrixx[j];
  55.             }
  56.             matrixxx[i] = 1.0 / matrixA[i][i] * (matrixB[i] - sum1 - sum2); // Вычисление нового приближения
  57.             count = abs(matrixxx[i] - matrixx[i]); // Вычисление максимального изменения компонента вектора
  58.             if (x_max < count) {
  59.                 x_max = count;
  60.             }
  61.         }
  62.         // Обновление вектора приближений
  63.         for (int i = 0; i < N; i++) {
  64.             matrixx[i] = matrixxx[i];
  65.         }
  66.     } while (x_max > eps);
  67.     double tk = omp_get_wtime();
  68.     cout << "Время выполнения " << N << ": " << tk - tn << endl;
  69.     for (int i = 0; i < N; i++) {
  70.         matrX << matrixx[i] << endl;
  71.     }
  72.     matrA.close();
  73.     matrB.close();
  74.     matrX.close();
  75.     for (int i = 0; i < N; i++)
  76.     {
  77.         delete[] matrixA[i];
  78.  
  79.     }
  80.     delete[] matrixA;
  81.     delete[] matrixB;
  82.     delete[] matrixx;
  83.     delete[] matrixxx;
  84. }
  85.  
  86. void gausZeyd(int n) {
  87.     const double eps = 0.0001;
  88.     char nameA[50], nameB[50], matrx[50];
  89.     sprintf_s(nameA, "matrixAComplex%d.txt", n);
  90.     sprintf_s(nameB, "matrixBComplex%d.txt", n);
  91.     sprintf_s(matrx, "GausZeydRes%d.txt", n);
  92.     ifstream matrA(nameA);
  93.     ifstream matrB(nameB);
  94.     ofstream matrX(matrx);
  95.     if (!matrA.is_open() || !matrB.is_open() || !matrX.is_open()) {
  96.         cout << "Ошибка открытия файла" << endl;
  97.         return;
  98.     }
  99.  
  100.     complex<double>** matrixA = new complex<double>* [n];
  101.     complex<double>* matrixB = new complex<double>[n];
  102.     complex<double>* matrixX = new complex<double>[n];
  103.  
  104.     for (int i = 0; i < n; i++) matrixA[i] = new complex<double>[n];
  105.  
  106.     for (int i = 0; i < n; i++)
  107.     {
  108.         for (int j = 0; j < n; j++)
  109.         {
  110.             matrA >> matrixA[i][j];
  111.         }
  112.         matrB >> matrixB[i];
  113.         matrixX[i] = 1.0; // Инициализация начального вектора приближения
  114.     }
  115.  
  116.     matrA.close();
  117.     matrB.close();
  118.  
  119.     double xmax;
  120.     complex<double> sum1, sum2;
  121.     double tn = omp_get_wtime();
  122.     double tmp = 0.0;
  123.     complex<double> xv;
  124.  
  125.     tn = omp_get_wtime();
  126.     do {
  127.         xmax = -1.0;
  128.         for (int i = 0; i < n; i++)
  129.         {
  130.             xv = matrixX[i];
  131.             sum1 = 0.0;
  132.             sum2 = 0.0;
  133.             for (int j = 0; j < n; j++)
  134.             {
  135.                 if (j < i)
  136.                     sum1 += matrixA[i][j] * matrixX[j];
  137.                 if (j > i)
  138.                     sum2 += matrixA[i][j] * matrixX[j];
  139.             }
  140.             matrixX[i] = (1.0 / matrixA[i][i]) * (matrixB[i] - sum1 - sum2);
  141.             tmp = abs(matrixX[i] - xv);
  142.             if (tmp > xmax) xmax = tmp;
  143.         }
  144.     } while (xmax > eps);
  145.  
  146.     double tk = omp_get_wtime();
  147.     cout << "Время выполнения " << n << ": " << tk - tn << endl;
  148.  
  149.     for (int i = 0; i < n; i++) {
  150.         matrX << matrixX[i] << endl;
  151.     }
  152.  
  153.     matrX.close();
  154.  
  155.     for (int i = 0; i < n; i++)
  156.     {
  157.         delete[] matrixA[i];
  158.  
  159.     }
  160.     delete[] matrixA;
  161.     delete[] matrixB;
  162.     delete[] matrixX;
  163. }
  164.  
  165. void gaus(int n)
  166. {
  167.     const double eps = 0.0001;
  168.     char nameA[50], nameB[50], matrx[50];
  169.     sprintf_s(nameA, "matrixAComplex%d.txt", n);
  170.     sprintf_s(nameB, "matrixBComplex%d.txt", n);
  171.     sprintf_s(matrx, "GausRes%d.txt", n);
  172.     ifstream matrA(nameA);
  173.     ifstream matrB(nameB);
  174.     ofstream matrX(matrx);
  175.  
  176.     if (!matrA.is_open() || !matrB.is_open() || !matrX.is_open()) {
  177.         cout << "Ошибка открытия файла" << endl;
  178.         return;
  179.     }
  180.  
  181.     complex<double>** matrixA = new complex<double>* [n];
  182.     complex<double>* matrixB = new complex<double>[n];
  183.     complex<double>* matrixX = new complex<double>[n];
  184.  
  185.     for (int i = 0; i < n; i++) {
  186.         matrixA[i] = new complex<double>[n];
  187.     }
  188.  
  189.     for (int i = 0; i < n; i++)
  190.     {
  191.         for (int j = 0; j < n; j++)
  192.         {
  193.             matrA >> matrixA[i][j];
  194.         }
  195.         matrB >> matrixB[i];
  196.         matrixX[i] = 1.0; // Инициализация начального вектора приближения
  197.     }
  198.  
  199.     matrA.close();
  200.     matrB.close();
  201.  
  202.     complex<double> w = 0.0, sum = 0.0;
  203.     double tn = omp_get_wtime();
  204.  
  205.     for (int i = 0; i <= n - 1; i++)
  206.     {
  207.         for (int j = i + 1; j <= n - 1; j++)
  208.         {
  209.             w = matrixA[j][i] / matrixA[i][i];
  210.             for (int k = i; k <= n - 1; k++)
  211.             {
  212.                 matrixA[j][k] = matrixA[j][k] - w * matrixA[i][k];
  213.             }
  214.             matrixB[j] = matrixB[j] - w * matrixB[i];
  215.         }
  216.     }
  217.  
  218.     for (int i = n - 1; i >= 0; i--)
  219.     {
  220.         sum = 0.0;
  221.         for (int j = i; j <= n - 1; j++)
  222.         {
  223.             if (i != NULL)
  224.                 sum = sum + matrixA[i][j + 1] * matrixX[j + 1];
  225.         }
  226.         matrixX[i] = (matrixB[i] - sum) / matrixA[i][i];
  227.     }
  228.  
  229.     double tk = omp_get_wtime();
  230.     cout << "Время выполнения " << n << ": " << tk - tn << endl;
  231.  
  232.     for (int i = 0; i < n; i++) {
  233.         matrX << matrixX[i] << endl;
  234.     }
  235.  
  236.     matrX.close();
  237.  
  238.     for (int i = 0; i < n; i++)
  239.     {
  240.         delete[] matrixA[i];
  241.  
  242.     }
  243.     delete[] matrixA;
  244.     delete[] matrixB;
  245.     delete[] matrixX;
  246. }
  247.  
  248. int main()
  249. {
  250.     SetConsoleOutputCP(1251);
  251.     jacobi(100);
  252.     jacobi(250);
  253.     jacobi(500);
  254.  
  255.     gausZeyd(100);
  256.     gausZeyd(250);
  257.     gausZeyd(500);
  258.  
  259.     gaus(100);
  260.     gaus(250);
  261.     gaus(500);
  262. }
  263.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement