Created
December 21, 2021 21:03
-
-
Save Yegorsh/fa47b5a5da4a9c934b82965a3ec8830a to your computer and use it in GitHub Desktop.
Find more at https://yegorsh-public.notion.site/Gaussian-elimination-068b06c51be745fdb93485f2fd45c81f
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream> | |
| using namespace std; | |
| void clearMemory(double** matrix, int size){ | |
| for (int i = 0; i < size; i++){ | |
| delete[] matrix[i]; | |
| } | |
| delete [] matrix; | |
| } | |
| void SwapRows(double **Matrix, int size, int i){ | |
| for (int b=0; b<size+1; b++){ | |
| double temp; | |
| temp = Matrix[i+1][b]; | |
| Matrix[i+1][b] = Matrix[i][b]; | |
| Matrix[i][b] = temp; | |
| } | |
| } | |
| void FillMatrix(double **matrix, const int size){ | |
| for (int i=0; i<size; i++){ | |
| for (int j=0; j<size+1; j++){ | |
| matrix[i][j] = rand()%10; | |
| //cin >> matrix[i][j]; | |
| } | |
| } | |
| } | |
| void PrintMatrix(double **matrix, const int size){ | |
| for (int i=0; i<size; i++){ | |
| for (int j=0; j<size+1; j++){ | |
| cout << matrix[i][j] << "\t"; | |
| } | |
| cout << endl; | |
| } | |
| } | |
| int main(){ | |
| int size = 3; | |
| double **Matrix = new double *[size]; | |
| for (int i=0; i<size; i++){ | |
| Matrix[i] = new double [size+1]; | |
| } | |
| double **Sub_Matrix = new double *[size]; | |
| for (int i=0; i<size; i++){ | |
| Sub_Matrix[i] = new double [size+1]; | |
| for (int j=0; j<size+1; j++){ | |
| Sub_Matrix[i][j] = 0; | |
| } | |
| } | |
| FillMatrix(Matrix,size); | |
| Matrix[2][2] = 0; | |
| PrintMatrix(Matrix, size); | |
| cout << endl; | |
| //ПРЯМОЙ ХОД | |
| for (int i=0; i<size; i++){ | |
| if (Matrix[i][i]==0) { | |
| SwapRows(Matrix, size, i); | |
| } | |
| else { | |
| for (int j = 0; j < size + 1; j++) { | |
| Sub_Matrix[i][j] = (Matrix[i][j] / Matrix[i][i]); // деление i-й строки на первый член != 0 для преобразования его в единицу | |
| //cout << Sub_Matrix[i][j] << "\t"; | |
| } | |
| //cout << endl; | |
| for (int k = i + 1; k < size; k++) { | |
| double temp = Matrix[k][i] / Matrix[i][i]; | |
| for (int j = 0; j < size + 1; j++) { //j - номер столбца следующей строки после k | |
| Matrix[k][j] = Matrix[k][j] - (Matrix[i][j] * temp); //Зануление элементов матрицы ниже первого члена, преобразованного в единицу | |
| } | |
| } | |
| } | |
| } | |
| //ОБРАТНЫЙ ХОД (Зануление верхнего правого угла) | |
| for (int k=(size-1); k>-1; k--){ //k-номер строки | |
| for (int i = k-1; i>-1; i--){ //i-номер следующей строки после k | |
| double K = Sub_Matrix[i][k] / Sub_Matrix[k][k]; | |
| for (int j = size; j>-1; j--){ //j-номер столбца следующей строки после k | |
| Sub_Matrix[i][j] = Sub_Matrix[i][j] - (Sub_Matrix[k][j] * K); | |
| } | |
| } | |
| } | |
| for (int i=0; i<size; i++){ | |
| cout << "x_" << i+1 << " = " << Sub_Matrix[i][size] << endl; | |
| } | |
| clearMemory(Matrix, size); | |
| clearMemory(Sub_Matrix, size); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment