Advertisement
Guest User

вычпракт

a guest
Sep 28th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. template <typename T>
  5.  
  6. class Matrix {
  7. private:
  8. T ** data;
  9. int rows;
  10. int columns;
  11. public:
  12. //квадратная матрица
  13. Matrix(int size) {
  14. this->rows = size;
  15. this->columns = size;
  16. data = new T*[size];
  17. for (int i = 0; i < size; i++) {
  18. data[i] = new T[size];
  19. for (int j = 0; j < size; j++)
  20. data[i][j] = 0;
  21. }
  22. }
  23. // прямоугольная матрица
  24. Matrix(int rows, int columns) {
  25. this->rows = rows;
  26. this->columns = columns;
  27. data = new T*[rows];
  28. for (int i = 0; i < rows; i++) {
  29. data[i] = new T[columns];
  30. for (int j = 0; j < columns; j++)
  31. data[i][j] = 0;
  32. }
  33. }
  34. // ввод с файла
  35. void F_inputMatrix(std::ifstream * input_file) {
  36. T buffer;
  37. for (int i = 0; i < rows; i++)
  38. for (int j = 0; j < columns; j++) {
  39. *input_file >> buffer;
  40. data[i][j] = buffer;
  41.  
  42. }
  43. }
  44. // сбор и изменение данных.
  45. int getrows() {
  46. return rows;
  47. }
  48. int getcolumns() {
  49. return columns;
  50. }
  51. T getdatavalue(int i, int j) {
  52. return data[i][j];
  53. }
  54. void setdatavalue(int i, int j, T value) {
  55. data[i][j] = value;
  56. }
  57. void adddatavalue(int i, int j, T value) {
  58. data[i][j] += value;
  59. }
  60. // операторы
  61. Matrix operator + (Matrix & B) {
  62. if (rows == B.getrows() && columns == getcolumns()) {
  63. Matrix<T> C(rows, columns);
  64. for (int i = 0; i < rows; i++)
  65. for (int j = 0; j < columns; j++)
  66. C.setdatavalue(i, j, data[i][j] + B.getdatavalue(i, j));
  67. return C;
  68. }
  69. else {
  70. std::cout << "...ERROR(SUMM)...";
  71. return Matrix(0);
  72. }
  73. }
  74. Matrix & operator = (Matrix & B) {
  75. rows = B.getrows();
  76. columns = B.getcolumns();
  77.  
  78. for (int i = 0; i < rows; i++)
  79. for (int j = 0; j < columns; j++)
  80. data[i][j] = B.getdatavalue(i, j);
  81. return *this;
  82. }
  83. Matrix operator *(Matrix & B) {
  84. if (this->columns == B.getraws()) {
  85. Matrix<T>C(rows, B.getcolumns());
  86. for (int i = 0; i < rows; i++)
  87. for (int j = 0; j < B.getcolumns(); j++)
  88. for (int k = 0; k < columns; k++)
  89. C.adddatavalue(i, j, B.getdatavalue(k, j)*getdatavalue(i, k));
  90. return C;
  91. }
  92. else {
  93. std::count << "...ERROR(MULTI)...";
  94. return Matrix(0);
  95. }
  96. }
  97. //Своп строчек
  98. void Matrixrowsswap(int i, int j) {
  99. if (i < rows && j < rows) {
  100. T buffer;
  101. for (int k = 0; k < columns; k++) {
  102. buffer = data[i][k];
  103. data[i][k] = data[j][k];
  104. data[j][k] = buffer;
  105. }
  106. }
  107. else {
  108. std::cout << "...ERROR(SWAP)...";
  109. return;
  110. }
  111. }
  112. //метод Гаусса
  113. Matrix Gaussmethod(Matrix & Answer, Matrix &X) {
  114. Matrix<T>C(rows);
  115. C = *this;
  116. bool flag = 0;
  117. T coeff = 0;
  118. //приведение к треугольной
  119. for (int i = 0; i < rows; i++) {
  120. if (C.getdatavalue(i, i) == 0) {
  121. flag = 1;
  122. for (int j = i + 1; j < columns; j++)
  123. if (C.getdatavalue(j, i) != 0) {
  124. C.Matrixrowsswap(i, j);
  125. Answer.Matrixrowsswap(i, j);
  126. flag = 0;
  127. break;
  128.  
  129. }
  130. }
  131. if (flag) continue;
  132.  
  133. for (int k = i + 1; k < rows; k++) {
  134. coeff = C.getdatavalue(k, i) / C.getdatavalue(i, i) *(-1);
  135. Answer.adddatavalue(k, 0, coeff*Answer.getdatavalue(i, 0));
  136. for (int l = i; l < rows; l++)
  137. C.adddatavalue(k, l, coeff*C.getdatavalue(i, l));
  138. }
  139. }
  140. //обратный ход
  141. for (int i = rows - 1; i >= 0; i--) {
  142. X.setdatavalue(i, 0, Answer.getdatavalue(i, 0));
  143. for (int j = rows - 1; j > i; j--)
  144. X.adddatavalue(i, 0, C.getdatavalue(i, j)*X.getdatavalue(j, 0)*(-1));
  145. X.setdatavalue(i, 0, X.getdatavalue(i, 0) / C.getdatavalue(i, i));
  146. }
  147. return C;
  148. }
  149. //зануление 2(нижней) диагонали
  150. Matrix TDM1step(Matrix & Answer){
  151. Matrix<T>C(rows);
  152. C = *this;
  153. double coeff = 0;
  154. for (int i = 0; i < rows - 1; i++){
  155. coeff = C.getdatavalue(i + 1, i) / C.getdatavalue(i, i)*(-1);
  156. C.setdatavalue(i + 1, i, 0);
  157. C.adddatavalue(i + 1, i + 1, coeff*C.getdatavalue(i, i + 1));
  158. C.adddatavalue(i + 1, i + 2, coeff*getdatavalue(i, i + 2));
  159. Answer.adddatavalue(i + 1, 0, coeff*Answer.getdatavalue(i, 0));
  160. }
  161. return C;
  162. }
  163. //метод Прогонки
  164. Matrix TDM(Matrix & Answer, Matrix &X){
  165. Matrix<T>C(rows);
  166. C = *this;
  167. C = C.TDM1step(Answer);
  168. T temp;
  169. X.setdatavalue(rows - 1, 0, Answer.getdatavalue(rows - 1, 0) / C.getdatavalue(rows - 1, rows - 1));
  170. for (int i = rows - 2; i >= 0; i--){
  171. temp = Answer.getdatavalue(i,0) - C.getdatavalue(i, i + 1)*X.getdatavalue(i + 1, 0);
  172. X.setdatavalue(i, 0, temp / C.getdatavalue(i, i));
  173. }
  174. return C;
  175. }
  176. //вывод матрицы
  177. void printMatrix() {
  178. for (int i = 0; i < rows; i++) {
  179. for (int j = 0; j < columns; j++){
  180. std::cout << data[i][j];
  181. std::cout << " ";
  182. }
  183. std::cout << "\n";
  184. }
  185. std::cout << "\n";
  186. }
  187. };
  188. int main() {
  189. std::cout.precision(9);
  190. system("color 0A");
  191. //GM
  192. Matrix <double> A(6, 6);
  193. Matrix <double> B(3, 3);
  194. Matrix <double> Result(6, 1);
  195. Matrix <double> X(6, 1);
  196. //TDM
  197. //Matrix<double>A(4, 4);
  198. //Matrix<double>Result(4, 1);
  199. //Matrix<double>X(4, 1);
  200. std::ifstream input_file("in.txt");
  201. A.F_inputMatrix(&input_file);
  202. Result.F_inputMatrix(&input_file);
  203. //A = A.Gaussmethod(Result, X);
  204. //A = A.TDM1step(Result);
  205. A.printMatrix();
  206. A = A.TDM(Result, X);
  207. A.printMatrix();
  208. Result.printMatrix();
  209. X.printMatrix();
  210.  
  211.  
  212. getchar();
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement