Advertisement
EgorYankovsky

PZ1

Sep 21st, 2022
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.83 KB | None | 0 0
  1. // matrix.cpp
  2.  
  3.  
  4. #include "Matrix.h"
  5.  
  6. namespace solution
  7. {
  8.  
  9.    void Matrix::Readfile()
  10.    {
  11.       try
  12.       {
  13.          fstream infile("input.txt");
  14.  
  15.          infile >> n >> ht;
  16.  
  17.          if (ht * 2 + 1 > n)
  18.             flag = true;
  19.          else
  20.          {
  21.             F.resize(n);
  22.             di.resize(n);
  23.             al.resize(n);
  24.             au.resize(n);
  25.             if (!infile.eof())
  26.             {
  27.                for (int i = 0; i < n; i++)
  28.                {
  29.                   al[i].resize(ht);
  30.                   for (int j = 0; j < ht; j++)
  31.                      infile >> al[i][j];
  32.                }
  33.                for (int i = 0; i < n; i++)
  34.                {
  35.                   au[i].resize(ht);
  36.                   for (int j = 0; j < ht; j++)
  37.                      infile >> au[i][j];
  38.                }
  39.                for (int i = 0; i < n; i++)
  40.                   infile >> di[i];
  41.                for (int i = 0; i < n; i++)
  42.                   infile >> F[i];
  43.             }
  44.             infile.close();
  45.          }
  46.       }
  47.       catch (ios::failure e)
  48.       {
  49.          cerr << e.what() << endl;
  50.       }
  51.       catch (out_of_range err)
  52.       {
  53.          cerr << err.what();
  54.       }
  55.       catch (...)
  56.       {
  57.          cerr << "Непредвиденная ошибка при вводе из файла !!!";
  58.       }
  59.    }
  60.  
  61.    void Matrix::Writefile()
  62.    {
  63.       try
  64.       {
  65.          ofstream outfile("output.txt");
  66.  
  67.          outfile << setprecision(5);
  68.  
  69.          for (int i = 0; i < n; i++)
  70.          {
  71.             for (int j = 0; j < n; j++)
  72.             {
  73.                if (i == j)
  74.                   outfile << di[i] << " ";
  75.                else if (j > i)
  76.                {
  77.                   if (j - i <= ht)
  78.                      outfile << au[j][ht - j + i] << " ";
  79.                   else
  80.                      outfile << 0 << " ";
  81.                }
  82.                else if (i > j)
  83.                {
  84.                   if (i - j <= ht)
  85.                      outfile << al[i][ht - i + j] << " ";
  86.                   else
  87.                      outfile << 0 << " ";
  88.                }
  89.             }
  90.             outfile << "\n";
  91.          }
  92.  
  93.          outfile << "\n";
  94.  
  95.          for (int i = 0; i < n; i++)
  96.             outfile << F[i] << " ";
  97.  
  98.          outfile.close();
  99.       }
  100.       catch (ios::failure e)
  101.       {
  102.          cerr << e.what() << endl;
  103.       }
  104.       catch (out_of_range err)
  105.       {
  106.          cerr << err.what();
  107.       }
  108.       catch (...)
  109.       {
  110.          cerr << "Непредвиденная ошибка при выводе в файл !!!";
  111.       }
  112.    }
  113.  
  114.    void Matrix::LU()
  115.    {
  116.       for (int i = 0; i < n; i++)
  117.       {
  118.          for (int k = 0; k < ht && k < i; k++)
  119.          {
  120.             if (i >= ht)
  121.                di[i] -= al[i][k] * au[i][k];
  122.             else
  123.                di[i] -= al[i][ht - i + k] * au[i][ht - i + k];
  124.          }
  125.          for (int j = 0; j < ht && n - i - j>1; j++)
  126.          {
  127.             for (int k = 0; k < i && k < ht - j - 1; k++)
  128.             {
  129.                if (i >= ht - 1 || i + j >= ht - 1)
  130.                   au[i + j + 1][ht - j - 1] -= al[i][k + j + 1] * au[i + j + 1][k];
  131.                else
  132.                   au[i + j + 1][ht - j - 1] -= al[i][ht - i + k] * au[i + j + 1][ht - i + k - j - 1];
  133.             }
  134.          }
  135.          for (int j = 0; j < ht && n - i - j > 1; j++)
  136.          {
  137.             for (int k = 0; k < ht - j - 1 && k < i; k++)
  138.             {
  139.                if (i >= ht - 1 || i + j >= ht - 1)
  140.                   al[j + i + 1][ht - j - 1] -= al[i + j + 1][k] * au[i][k + j + 1]; // добавим +1
  141.                else
  142.                   al[j + i + 1][ht - j - 1] -= al[i + j + 1][ht - i + k - 1 - j] * au[i][ht - i + k];
  143.             }
  144.             al[j + i + 1][ht - j - 1] /= di[i];
  145.          }
  146.       }
  147.    }
  148.  
  149.    void Matrix::LyF()
  150.    {
  151.       for (int i = 0; i < n; i++)
  152.          for (int j = 0; j < ht && j < i; j++)
  153.             if (i < ht)
  154.                F[i] -= al[i][ht - i + j] * F[j];
  155.             else
  156.                F[i] -= al[i][j] * F[i - ht + j];
  157.    }
  158.  
  159.    void Matrix::Uxy()
  160.    {
  161.  
  162.       for (int i = n - 1; i >= 0; i--)
  163.       {
  164.          for (int j = 0; j < ht && j < n - i - 1; j++)
  165.             F[i] -= F[i + j + 1] * au[i + j + 1][ht - 1 - j];
  166.          F[i] /= di[i];
  167.       }
  168.    }
  169.  
  170.    void Matrix::Multiplication()
  171.    {
  172.  
  173.    }
  174.  
  175.    void Matrix::SLAU()
  176.    {
  177.       LU();
  178.       LyF();
  179.       Uxy();
  180.    }
  181. }
  182.  
  183.  
  184. // matrix.h
  185.  
  186.  
  187. #pragma once
  188.  
  189. #include <vector>
  190. #include <fstream>
  191. #include <iostream>
  192. #include <iomanip>
  193. #include <cstdio>
  194.  
  195. using namespace std;
  196.  
  197. namespace solution
  198. {
  199.    class Matrix
  200.    {
  201.    private:
  202.       vector<vector<double>> al, au;
  203.       vector<double> di, F;
  204.       int n, m, ht;
  205.       void LU();
  206.       void LyF();
  207.       void Uxy();
  208.    public:
  209.       bool flag = false;
  210.       void Readfile();
  211.       void Writefile();
  212.       void Multiplication();
  213.       void SLAU();
  214.    };
  215. }
  216.  
  217.  
  218. // main.cpp
  219.  
  220.  
  221. #include "Matrix.h"
  222.  
  223. using namespace solution;
  224.  
  225. void showmenu()
  226. {
  227.    cout << "1 - Разложение LU и нахождение вектора x" << endl
  228.         << "Не целочисленное значение - выход" << endl;
  229. }
  230.  
  231. int main()
  232. {
  233.    Matrix object;
  234.    int command = 0;
  235.  
  236.    showmenu();
  237.  
  238.    cout << endl << "> ";
  239.    while (cin >> command)
  240.    {
  241.       switch (command)
  242.       {
  243.       case 1:
  244.       {
  245.          object.Readfile();
  246.          if (object.flag == true) {
  247.             cout << "ОШИБКА: Ширина ленты больше самой матрицы ";
  248.             exit(EXIT_FAILURE);
  249.          }
  250.          object.SLAU();
  251.          object.Writefile();
  252.          cin.get();
  253.          break;
  254.       }
  255.       default:
  256.       {
  257.          cout << "???" << endl;
  258.          break;
  259.       }
  260.       }
  261.       cout << "> ";
  262.    }
  263.    return 0;
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement