Advertisement
Niktiaksk

Untitled

Dec 6th, 2022
850
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  4. #include <cmath>
  5.  
  6. double myPersonalNumber = 7 * 0.2;
  7.  
  8. int matrixSize = 4;
  9. //Мое k, номер в журнале
  10. //8.30   2.62+a   4.10  1.90
  11. //3.92   8.45   7.78-a    2.46
  12. //3.77  7.21+a  8.04  2.28
  13. //2.21  3.65-a   1.69  6.99
  14.  
  15.  
  16. //1.Методом Гаусса найти решение слау.вычислить определитель.
  17. //найти обратную матрицу .сделать проверку
  18. //2. Методом квадратного корня найти решение системы
  19. //3.методом простой итерации найти решение. Точность E=10^-5. Число итераций, вектор ???невязки???(я хз, я ее не слышу)
  20. //4. Гаусса-Зейбеля Е=10^-5, число итераций
  21.  
  22. template <typename T> int sgn(T val) {
  23.     return (T(0) < val) - (val < T(0));
  24. }
  25.  
  26. using namespace std;
  27.  
  28.  
  29. void printMatrix(vector<vector<double>> matrix){
  30.     for(int i = 0; i < matrix.size(); i++){
  31.         for (int j = 0; j < matrix[i].size(); j++) {
  32.            
  33.             if (j == matrix.size()) {
  34.                 cout << left << dec << fixed << "| " << setw(8) << setprecision(3) << matrix[i].back();
  35.             } else {
  36.                 cout << left << dec << fixed << setw(8) << setprecision(3) << matrix[i][j];
  37.             }
  38.            
  39.         }
  40.         cout << endl;
  41.        
  42.     }
  43.     cout << endl;
  44. }
  45.  
  46. void printMatrix(vector<vector<double>> matrix, vector<double> vector){
  47.     for(int i = 0; i < matrix.size(); i++){
  48.         for (int j = 0; j <= matrix[i].size(); j++) {
  49.             if (j == matrix.size()) {
  50.                 cout << left << dec << fixed << "| " << setw(8) << setprecision(3) << vector[i];
  51.             } else {
  52.                 cout << left << dec << fixed << setw(8) << setprecision(3) << matrix[i][j];
  53.             }
  54.            
  55.         }
  56.         cout << endl;
  57.        
  58.     }
  59.     cout << endl;
  60. }
  61.  
  62.  
  63.  
  64. int main() {
  65.    
  66.     vector<vector<double>> givenMatrix{
  67.         {8.30, 2.62 + myPersonalNumber, 4.10,                    1.90, 10.65 + myPersonalNumber},
  68.         {3.92, 8.45,                    7.78 - myPersonalNumber, 2.46, 12.21},
  69.         {3.77, 7.21 + myPersonalNumber, 8.04,                    2.28, 15.45 - myPersonalNumber},
  70.         {2.21, 3.65 - myPersonalNumber, 1.69,                    6.99, -8.35},
  71.     };
  72.    
  73.     vector<vector<double>> givenMatrixCopy = givenMatrix;
  74.    
  75.    
  76.     cout << "GIVEN MATRIX:" << endl;
  77.  
  78.     printMatrix(givenMatrix);
  79.    
  80.     cout << "START OF GAUSS" << endl;
  81.     cout << endl;
  82.    
  83.     vector<vector<double>> transponedGiven = {
  84.            {0, 0, 0, 0},
  85.            {0, 0, 0, 0},
  86.            {0, 0, 0, 0},
  87.            {0, 0, 0, 0},
  88.        };
  89.        
  90.     for(int i = 0; i < matrixSize; ++i){
  91.         for(int j = 0; j < matrixSize; ++j){
  92.             transponedGiven[j][i] = givenMatrix[i][j];
  93.         }
  94.     }
  95.    
  96.    
  97.     double determinant = 1;
  98.    
  99.     for(int i = 0; i < matrixSize - 1; i++) {
  100.         for(int j = i + 1; j < matrixSize; j++) {
  101.             double temp = givenMatrix[j][i] / givenMatrix[i][i];
  102.             for(int k = 0; k < matrixSize + 1; k++){
  103.                 givenMatrix[j][k] -= givenMatrix[i][k] * temp;
  104.             }
  105.         }
  106.     }
  107.     cout << "DIAGONAL:" << endl;
  108.     printMatrix(givenMatrix);
  109.    
  110.    
  111.     for(int i = 0; i < matrixSize; i++) {
  112.         determinant *= givenMatrix[i][i];
  113.     }
  114.    
  115.     cout << "DETERMINANT : " << determinant << endl;
  116.     cout << endl;
  117.    
  118.    
  119.    
  120.     for(int i = 0; i < matrixSize; i++) {
  121.         double temp = givenMatrix[i][i];
  122.         for(int j = i; j < matrixSize + 1; j++) {
  123.             givenMatrix[i][j]/=temp;
  124.         }
  125.     }
  126.    
  127.     cout << "INIT:" << endl;
  128.     printMatrix(givenMatrix);
  129.    
  130.     vector<double> answers = {1,1,1,1};
  131.    
  132.     for ( int i = matrixSize - 1; i >= 0; i-- ) {
  133.         double temp = 0;
  134.         for (int j = i + 1; j < matrixSize; j++ ) {
  135.             temp += givenMatrix[i][j] * answers[j];
  136.         }
  137.         answers[i] = (givenMatrix[i][4] - temp) / givenMatrix[i][i];
  138.     }
  139.    
  140.     cout << "Solution of the system is : " << endl;
  141.    
  142.     for(int i = 0; i < matrixSize; i++) {
  143.         cout << "X" << i+1 << ": " << answers[i] << endl;
  144.     }
  145.     cout << endl;
  146.     cout << "END OF GAUSS" << endl;
  147.     cout << endl;
  148.    
  149.  
  150.     vector<vector<double>> tempMatrix = givenMatrix;
  151.     vector<vector<double>> inversedMatrix = {
  152.         {0, 0, 0, 0},
  153.         {0, 0, 0, 0},
  154.         {0, 0, 0, 0},
  155.         {0, 0, 0, 0},
  156.     };
  157.    
  158.     for (int i = 0; i < matrixSize; i++) {
  159.         for (int j = 0; j < matrixSize; j++) {
  160.             if (i != j) {
  161.                 inversedMatrix[i][j] = 0;
  162.             }
  163.             else {
  164.                 inversedMatrix[i][j] = 1;
  165.             }
  166.         }
  167.     }
  168.    
  169.     double tempElement = 0;
  170.     for (int i = 0; i < matrixSize; i++) {
  171.         tempElement = tempMatrix[i][i];
  172.         for (int j = 0; j < matrixSize; j++) {
  173.             tempMatrix[i][j] = tempMatrix[i][j] / tempElement;
  174.             inversedMatrix[i][j] = inversedMatrix[i][j] / tempElement;
  175.         }
  176.         for (int j = i + 1; j < matrixSize; j++) {
  177.             tempElement = tempMatrix[j][i];
  178.             for (int k = 0; k < matrixSize; k++) {
  179.                 tempMatrix[j][k] = tempMatrix[j][k] - tempMatrix[i][k] * tempElement;
  180.                 inversedMatrix[j][k] = inversedMatrix[j][k] - inversedMatrix[i][k] * tempElement;
  181.             }
  182.         }
  183.     }
  184.    
  185.     for (int i = matrixSize - 1; i >= 0; i--) {
  186.         for (int j = i - 1; j >= 0; j--) {
  187.             tempElement = tempMatrix[j][i];
  188.             for (int k = 0; k < matrixSize; k++) {
  189.                 tempMatrix[j][k] = tempMatrix[j][k] - tempMatrix[i][k] * tempElement;
  190.                 inversedMatrix[j][k] = inversedMatrix[j][k] - inversedMatrix[i][k] * tempElement;
  191.             }
  192.         }
  193.     }
  194.    
  195.    
  196.    
  197.     cout << "INVERSED:" << endl;
  198.     printMatrix(inversedMatrix);
  199.    
  200.     vector<vector<double>> proofOfInversibility = {
  201.             {0, 0, 0, 0},
  202.             {0, 0, 0, 0},
  203.             {0, 0, 0, 0},
  204.             {0, 0, 0, 0},
  205.         };
  206.  
  207.     for (int i = 0; i < matrixSize; i++) {
  208.         for (int j = 0; j < matrixSize; j++) {
  209.             int c = 0;
  210.             for (int k = 0; k < matrixSize; k++)
  211.             {
  212.                 c += givenMatrix[i][k] * inversedMatrix[k][j];
  213.             }
  214.             proofOfInversibility[i][j] = c;
  215.         }
  216.     }
  217.    
  218.     cout << "A * A^(-1):" << endl;
  219.     printMatrix(proofOfInversibility);
  220.    
  221.     //end of gauss method
  222.    
  223.    
  224.     cout << endl;
  225.     cout << "START OF SQUARE ROOT METHOD" << endl;
  226.     cout << endl;
  227.    
  228.    
  229.     vector<vector<double>> forSquareMethodMatrix = {
  230.         {0, 0, 0, 0},
  231.         {0, 0, 0, 0},
  232.         {0, 0, 0, 0},
  233.         {0, 0, 0, 0},
  234.     };
  235.    
  236.     cout << "TRANSPONED" << endl;
  237.     printMatrix(transponedGiven);
  238.  
  239.    
  240.    
  241.     vector<double> toSquareMethodVector = {10.65 + myPersonalNumber, 12.21, 15.45 - myPersonalNumber, -8.35};
  242.     vector<double> forSquareMethodVector = {0, 0, 0, 0};
  243.    
  244.    
  245.    
  246.     for (int i = 0; i < matrixSize; i++) {
  247.         for (int j = 0; j < matrixSize; j++)
  248.         {
  249.             forSquareMethodVector[i] += toSquareMethodVector[j] * transponedGiven[i][j];
  250.         }
  251.     }
  252.    
  253.     for (int i = 0; i < matrixSize; i++) {
  254.         for (int j = 0; j < matrixSize; j++) {
  255.             double c = 0;
  256. //            cout << "C = ";
  257.             for (int k = 0; k < matrixSize; k++)
  258.             {
  259. //                cout << transponedGiven[k][i] << " * " << givenMatrixCopy[j][k];
  260.                 c += transponedGiven[k][i] * givenMatrixCopy[j][k];
  261. //                cout << " + ";
  262.             }
  263. //            cout << " = " << c << endl;
  264.             forSquareMethodMatrix[i][j] = c;
  265.         }
  266.     }
  267.    
  268.     cout << endl;
  269.     cout << "SYMMETRICAL: (A^T * A)"<< endl;
  270.     printMatrix(forSquareMethodMatrix, forSquareMethodVector);
  271.    
  272.    
  273.    
  274.     double temp;
  275.    
  276.     vector<double> x = {0, 0, 0, 0};
  277.     vector<double> y = {0, 0, 0, 0};
  278.     vector<vector<double>> UpperTriangle = {
  279.         {0, 0, 0, 0},
  280.         {0, 0, 0, 0},
  281.         {0, 0, 0, 0},
  282.         {0, 0, 0, 0},
  283.     };
  284.  
  285.    
  286.      
  287.     for (int i = 0; i < matrixSize; i++)
  288.     {
  289.         temp = 0;
  290.         for (int k = 0; k < i; k++)
  291.             temp = temp + UpperTriangle[k][i] * UpperTriangle[k][i];
  292.         UpperTriangle[i][i] = sqrt(forSquareMethodMatrix[i][i] - temp);
  293.         for (int j = i; j < matrixSize; j++)
  294.         {
  295.             temp = 0;
  296.             for (int k = 0; k < i; k++)
  297.                 temp = temp + UpperTriangle[k][i] * UpperTriangle[k][j];
  298.             UpperTriangle[i][j] = (forSquareMethodMatrix[i][j] - temp) / UpperTriangle[i][i];
  299.         }
  300.     }
  301.  
  302.     cout << "UPPER TRIANGLE:" << endl;
  303.     printMatrix(UpperTriangle);
  304.    
  305.     for (int i = 0; i < matrixSize; i++)
  306.     {
  307.         temp = 0;
  308.         for (int k = 0; k < i; k++)
  309.             temp = temp + UpperTriangle[k][i] * y[k];
  310.         y[i] = (forSquareMethodVector[i] - temp) / UpperTriangle[i][i];
  311.     }
  312.     for (int i = matrixSize - 1; i >= 0; i--)
  313.     {
  314.         temp = 0;
  315.         for (int k = i + 1; k < matrixSize; k++)
  316.             temp = temp + UpperTriangle[i][k] * x[k];
  317.         x[i] = (y[i] - temp) / UpperTriangle[i][i];
  318.     }
  319.    
  320.     cout << "Solution of the system is : " << endl;
  321.     for (int i = 0; i < matrixSize; i++){
  322.         cout << "X" << i + 1 << " = " << x[i] << endl;
  323.     }
  324.    
  325.     cout << endl;
  326.     cout << "END OF SQUARE ROOT METHOD" << endl;
  327.     cout << endl;
  328.    
  329.    
  330.    
  331.        
  332.    
  333.    
  334.    
  335.    
  336.    
  337.    
  338.     return 0;
  339. }
  340.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement