aboutsummaryrefslogtreecommitdiff
path: root/works/life/numerical-analysis-lab/GaussianElimination.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'works/life/numerical-analysis-lab/GaussianElimination.cpp')
-rw-r--r--works/life/numerical-analysis-lab/GaussianElimination.cpp120
1 files changed, 0 insertions, 120 deletions
diff --git a/works/life/numerical-analysis-lab/GaussianElimination.cpp b/works/life/numerical-analysis-lab/GaussianElimination.cpp
deleted file mode 100644
index 777eee7..0000000
--- a/works/life/numerical-analysis-lab/GaussianElimination.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-#include <cstdlib>
-#include <iomanip>
-#include <iostream>
-
-void PrintMatrix(int n, double **a) {
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < n; ++j) {
- std::cout << a[i][j] << ' ';
- }
- std::cout << '\n';
- }
-}
-
-void PrintEquation(int n, double **a, double *b) {
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < n; ++j) {
- std::cout << a[i][j] << ' ';
- }
- std::cout << b[i] << '\n';
- }
-}
-
-bool HasSolution(int n, double **a, double *b) {
- for (int r = 0; r < n; r++) {
- bool all_zero = true;
- for (int c = 0; c < n; c++) {
- if (a[r][c] != 0) {
- all_zero = false;
- break;
- }
- }
-
- if (all_zero && b[r] != 0) {
- return false;
- }
- }
- return true;
-}
-
-void GaussianElimination(int n, double **a, double *b) {
- for (int c = 0; c < n; c++) {
- int pivot_r = -1;
- for (int r = c; r < n; r++) {
- if (a[r][c] != 0) {
- pivot_r = r;
- break;
- }
- }
-
- if (pivot_r == -1) {
- continue;
- }
-
- double pivot = a[pivot_r][c];
-
- for (int r = 0; r < n; r++) {
- if (r == pivot_r) {
- continue;
- }
-
- double factor = a[r][c] / pivot;
-
- for (int i = 0; i < n; i++) {
- a[r][i] -= factor * a[pivot_r][i];
- b[i] -= factor * b[pivot_r];
- }
- }
-
- for (int i = 0; i < n; i++) {
- a[pivot_r][i] /= pivot;
- b[pivot_r] /= pivot;
- }
- }
-}
-
-double GetDiff(int n, double *x, double **a, double *b) {
- double diff = 0;
- for (int r = 0; r < n; r++) {
- for (int c = 0; c < n; c++) {
- diff += a[r][c] * x[c];
- }
- diff -= b[r];
- }
- return diff;
-}
-
-int main() {
- std::cout << std::showpos << std::fixed << std::setprecision(3);
-
- const int n = 6;
- double **a = new double *[n];
- double *b = new double[n];
-
- for (int i = 0; i < n; i++) {
- a[i] = new double[n];
- for (int j = 0; j < n; j++) {
- std::cin >> a[i][j];
- }
- std::cin >> b[i];
- }
-
- std::cout << "Equation:\n";
- PrintEquation(n, a, b);
-
- GaussianElimination(n, a, b);
- std::cout << "After Gaussian Elimination:\n";
- PrintEquation(n, a, b);
-
- if (!HasSolution(n, a, b)) {
- std::cout << "No solution!\n";
- }
-
- if (std::abs(GetDiff(n, b, a, b)) > 1e-6) {
- std::cout << "Solution examination failed!\n";
- } else {
- std::cout << "Solution examination passed!\n";
- }
-
- return 0;
-}