Advertisement
RadioNurshat

KramerMethod

Nov 19th, 2020
755
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <math.h>
  4. using namespace std;
  5.  
  6.  
  7. template <typename T>
  8. vector<vector<T>> ExtractMinor(vector<vector<T>> a, int x, int y);
  9.  
  10. template <typename T>
  11. T MinorDeterminant(vector<vector<T>> a) {
  12.     if (a.size() != a[0].size()) {
  13.         throw new exception("Матрица не квадратная.");
  14.     }
  15.     if (a.size() == 2) {
  16.         return a[0][0] * a[1][1] - a[0][1] * a[1][0];
  17.     }
  18.     else {
  19.         T result = 0;
  20.         for (int i = 0; i < a.size(); i++) {
  21.             result += pow(-1, i) * a[0][i] * MinorDeterminant(ExtractMinor<T>(a, i, 0));
  22.         }
  23.         return result;
  24.     }
  25.    
  26. }
  27. template <typename T>
  28. vector<vector<T>> ExtractMinor(vector<vector<T>> a, int x, int y) {
  29.     int c = 0;
  30.     vector<vector<T>> other;
  31.     for (int i = 0; i < a.size(); i++) {
  32.         if (i != y) {
  33.             other.resize(other.size() + 1);
  34.             for (int j = 0; j < a[0].size(); j++) {
  35.                 if (j != x) {
  36.                     other[c].push_back(a[i][j]);
  37.                 }
  38.             }
  39.             c++;
  40.         }
  41.     }
  42.     return other;
  43. }
  44. template <typename T>
  45. vector<T> KramerMethod(vector<vector<T>> a, vector<T> b) {
  46.     if (a.size() != a[0].size()) {
  47.         throw new exception("Матрица не квадратная.");
  48.     }
  49.     if (a[0].size() != b.size()) {
  50.         throw new exception("Длина b не равна размерности a");
  51.     }
  52.     vector<T> dets;
  53.     T det = MinorDeterminant<T>(a);
  54.     if (det == 0) {
  55.         throw new exception("Нет решений");
  56.     }
  57.     for (int i = 0; i < a.size(); i++) {
  58.         vector<vector<T>> other = a;
  59.         for (int j = 0; j < a.size(); j++) {
  60.             other[j][i] = b[j];
  61.         }
  62.         dets.push_back(MinorDeterminant<T>(other) / det);
  63.     }
  64.     return dets;
  65. }
  66.  
  67. int main()
  68. {
  69.     vector<vector<double>> a = { {2,3,-1},{1,-2,1},{1,0,2} };
  70.     vector<double> b = { 9,3,2 };
  71.     //Ответ: 4 0 -1
  72.     vector<double> other = KramerMethod<double>(a, b);
  73.     for (int i = 0; i < other.size(); i++) {
  74.         cout << other[i] << " ";
  75.     }
  76. }
  77.  
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement