Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <string>
  4. using namespace std;
  5.  
  6.  
  7. class Matrix {
  8. private:
  9. long double** MATRIX;
  10. int M, N;
  11. long double** Create()
  12. {
  13. MATRIX = new long double* [M];
  14. for (int z = 0; z < M; z++)
  15. MATRIX[z] = new long double[N];
  16. return MATRIX;
  17. }
  18. public:
  19.  
  20. Matrix(int i, int j) : M(i), N(j) // конструктор матрицы с нулевыми элементами
  21. {
  22. Create();
  23. for (int i = 0; i < M; i++)
  24. {
  25. for (int j = 0; j < N; j++)
  26. {
  27. MATRIX[i][j] = 0;
  28. }
  29. }
  30. }
  31. ~Matrix() // деструктор матрицы
  32. {
  33. for (int i = 0; i < M; i++)
  34. {
  35. delete[] MATRIX[i];
  36. }
  37. delete[] MATRIX;
  38. }
  39. void setJK(int j, int k, long double r) { MATRIX[j][k] = r; } // ввод kj элемента матрицы
  40. int giveM() { return M; } //вывод количества строк
  41. int giveN() { return N; } //вывод количества столбцов
  42. long double giveJK(int j, int k) { return MATRIX[j][k]; }
  43.  
  44. void CreateByHand() { // заполнение вручную
  45. int i, j;
  46. for (i = 0; i < M; i++) {
  47. for (j = 0; j < N; j++) {
  48. cout << "[" << i << "][" << j << "]= ";
  49. cin >> MATRIX[i][j];
  50. }
  51.  
  52. }
  53. cout << " " << endl;
  54. }
  55. void CreateRandom() { // рандомное заполнение
  56. int i, j;
  57. for (i = 0; i < M; i++) {
  58. for (j = 0; j < N; j++) {
  59. MATRIX[i][j] = 100 * (double)(rand()) / RAND_MAX;
  60. }
  61. }
  62. }
  63. long double Element(int j, int m) // элемент с номером j, m
  64. {
  65. return MATRIX[j][m];
  66. }
  67.  
  68. void Print() // функция вывода матрицы
  69. {
  70. int i, j; // счетчики
  71. for (i = 0; i < M; i++) {
  72. for (j = 0; j < N; j++)
  73. cout << MATRIX[i][j] << " ";
  74. cout << endl;
  75. }
  76. }
  77. };
  78.  
  79.  
  80.  
  81. // Функция копирования матрицы
  82. Matrix EqualsMatrix(Matrix A)
  83. {
  84. Matrix F(A.giveM(), A.giveN());
  85. int i, j;
  86. for (i = 0; i < A.giveM(); i++) {
  87. for (j = 0; j < A.giveN(); j++) {
  88. F.setJK(i, j, A.giveJK(i, j));
  89. }
  90. }
  91. return F;
  92. }
  93.  
  94.  
  95.  
  96. // Получение матрицы без i-й строки и j-го столбца
  97. Matrix GetMatr(Matrix A, int i, int j) {
  98. Matrix G(A.giveM() - 1, A.giveN() - 1);
  99. int ki, kj, di, dj;
  100. di = 0;
  101. for (ki = 0; ki < A.giveM() - 1; ki++) { // проверка индекса строки
  102. if (ki == i) di = 1;
  103. dj = 0;
  104. for (kj = 0; kj < A.giveN() - 1; kj++) { // проверка индекса столбца
  105. if (kj == j) dj = 1;
  106. G.setJK(ki, kj, A.giveJK(ki + di, kj + dj));
  107. }
  108. }
  109. return G;
  110. }
  111.  
  112.  
  113.  
  114. // Рекурсивное вычисление определителя
  115. long double Determinant(Matrix A) {
  116. int i, k;
  117. long double d;
  118. d = 0;
  119. k = 1; //(-1) в степени i
  120. if (A.giveM() == 1) {
  121. d = A.giveJK(0, 0);
  122. return(d);
  123. }
  124. if (A.giveM() == 2) {
  125. d = A.giveJK(0, 0) * A.giveJK(1, 1) - (A.giveJK(1, 0) * A.giveJK(0, 1));
  126. return(d);
  127. }
  128. if (A.giveM() > 2) {
  129. for (i = 0; i < A.giveM(); i++) {
  130. Matrix J = GetMatr(A, i, 0);
  131. d = d + k * A.giveJK(i, 0) * Determinant(J);
  132. k = -k;
  133. }
  134. }
  135. return(d);
  136. }
  137.  
  138.  
  139.  
  140. // промежуточные матрицы с замененными стобцами
  141. Matrix PartialMatrix(Matrix V, Matrix K, int t)
  142. {
  143. int z;
  144. Matrix F = EqualsMatrix(V);
  145. for (z = 0; z < V.giveM(); z++) {
  146. F.setJK(z, t, K.giveJK(z, 0));
  147. }
  148. return F;
  149. }
  150.  
  151.  
  152.  
  153. // Функция получения решения методом краммера
  154. void GetsolutionKrammer(Matrix A, Matrix B)
  155. {
  156. long double u = Determinant(A);
  157. cout << " " << endl << "Determinant of the system matrix equals " << u << endl;
  158. if (u == 0) {
  159. cout << " " << endl << "System cannot be solved";
  160. }
  161. else {
  162.  
  163. int e;
  164. Matrix D(A.giveM(), 1); // вектор решения
  165. for (e = 0; e < A.giveM(); e++) {
  166. Matrix C = PartialMatrix(A, B, e);
  167. cout << " " << endl << "Partial matrix " << e << " is" << endl << " " << endl;
  168. C.Print();
  169. long double Y = Determinant(C);
  170. cout << " " << endl << " Determinant of partial matrix " << e << " is " << Y << endl;
  171. D.setJK(0, e, Y / u);
  172.  
  173. }
  174. for (e = 0; e < A.giveM(); e++) {
  175. cout << " " << endl << "Solution x" << e << " :" << D.Element(0, e) << endl;
  176. }
  177. }
  178. }
  179.  
  180.  
  181.  
  182. // Функция задания системы
  183. void SetsystemKrammer(Matrix A, Matrix B)
  184. {
  185. string ans; // спрашиваем, заполнять все вручную или рандомно
  186. cout << "Would you like to use random system matrix and constant terms, or would you like to insert them manually? : " << endl;
  187. cout << "1.Manually" << endl << "2.Random" << endl;
  188. cin >> ans;
  189. if (ans == "1") {
  190. cout << "Type in system matrix: " << endl;
  191. A.CreateByHand();
  192. A.Print();
  193. cout << " " << endl << "Type in constant terms: " << endl;
  194. B.CreateByHand();
  195. B.Print();
  196. }
  197. else {
  198. A.CreateRandom();
  199. cout << " " << endl << "System matrix is: " << endl << " " << endl;
  200. A.Print();
  201. B.CreateRandom();
  202. cout << " " << endl << "Constant terms are: " << endl << " " << endl;
  203. B.Print();
  204. }
  205. }
  206.  
  207.  
  208. // Функция склеивания матриц
  209. Matrix GlueMatrixes(Matrix A, Matrix B)
  210. {
  211. Matrix L(A.giveM(), A.giveN() + B.giveN());
  212. int i, j;
  213. for (i = 0; i < A.giveM(); i++) {
  214. for (j = 0; j < A.giveN(); j++) {
  215. L.setJK(i, j, A.giveJK(i, j));
  216. }
  217. }
  218. for (i = 0; i < A.giveM(); i++) {
  219. for (j = A.giveN(); j < L.giveN(); j++) {
  220. L.setJK(i, j, B.giveJK(i, j - A.giveN()));
  221. }
  222. }
  223. return L;
  224. }
  225.  
  226.  
  227.  
  228. // Решение Методом Гаусса
  229. Matrix SolutionGauss(Matrix L)
  230. {
  231. int i, j, k;
  232. Matrix U = EqualsMatrix(L);;
  233. for (i = 0; i < L.giveM(); i++) // счетчик переменной, по которой производится вычитание
  234. {
  235. for (j = 0; j < i; j++) // счетчик строки
  236. {
  237. long double f = U.giveJK(j, i) / U.giveJK(i, i);
  238. for (k = 0; k < L.giveN(); k++) // счетчик столбца
  239. {
  240. U.setJK(j, k, (U.giveJK(j, k) - U.giveJK(i, k) * f));
  241. }
  242. }
  243.  
  244. for (j = i + 1; j < L.giveM(); j++) // счетчик строки
  245. {
  246. long double f = U.giveJK(j, i) / U.giveJK(i, i);
  247. for (k = 0; k < L.giveN(); k++) // счетчик столбца
  248. {
  249. U.setJK(j, k, (U.giveJK(j, k) - U.giveJK(i, k) * f));
  250. }
  251.  
  252. }
  253.  
  254. if (i < U.giveM() - 1) {
  255.  
  256. long double h = 0;
  257. for (k = 0; k < L.giveN(); k++)
  258. {
  259. h = U.giveJK(i + 1, k) * U.giveJK(i + 1, k); // проверяем, не получилась ли следующая строка (содержащая следующую переменную) нулевой
  260. }
  261. if (h == 0)
  262. {
  263. i = i + 1; // если получилась, переходим к следующей
  264. }
  265. }
  266. }
  267. return U;
  268. }
  269.  
  270. // Функция, выводящая результат решения системы методом гаусса
  271. void GiveSolutionGauss(Matrix U)
  272. {
  273. int i;
  274. long double solution;
  275. for (i = 0; i < U.giveM(); i++)
  276. {
  277. solution = U.giveJK(i, U.giveN() - 1) / U.giveJK(i, i);
  278. cout << " " << endl << "Solution x" << i << " :" << solution << endl;
  279. }
  280. }
  281.  
  282. void SolveByGauss(Matrix A, Matrix B)
  283. {
  284. Matrix L = GlueMatrixes(A, B);
  285. Matrix U = SolutionGauss(L);
  286. GiveSolutionGauss(U);
  287. }
  288.  
  289.  
  290. // Основная функция
  291. int main() {
  292.  
  293. int cycle = 1;
  294. while (cycle == 1) // выполняем программу несколько раз
  295. {
  296. int m;
  297. cout << "Enter the size of the system matrix: ";
  298. cin >> m;
  299. Matrix A(m, m); // матрица системы
  300. Matrix B(m, 1); // вектор свободных членов
  301. SetsystemKrammer(A, B);
  302. GetsolutionKrammer(A, B);
  303. int t;
  304. if (Determinant(A) != 0) {
  305. cout << " " << endl << "Would you like to use Gauss method on this system?" << endl;
  306. cout << "1.Yes" << endl << "2.No" << endl;
  307. cin >> t;
  308. if (t == 1) { SolveByGauss(A, B); }
  309. }
  310. cout << " " << endl << "Would you like to continue?" << endl;
  311. cout << "1.Yes" << endl << "2.No" << endl;
  312. cin >> cycle;
  313. }
  314. return 0;
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement