commit 1577ed77ed1b50420c8e417a1e3df832aca77946 Author: helldh Date: Sat Jan 17 00:16:14 2026 +0300 Gauss implementation diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d17dae --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.venv diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/mathing.iml b/.idea/mathing.iml new file mode 100644 index 0000000..b918ff6 --- /dev/null +++ b/.idea/mathing.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..dcca035 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e1b379b --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/__pycache__/algo.cpython-313.pyc b/__pycache__/algo.cpython-313.pyc new file mode 100644 index 0000000..0942d89 Binary files /dev/null and b/__pycache__/algo.cpython-313.pyc differ diff --git a/__pycache__/tests.cpython-313.pyc b/__pycache__/tests.cpython-313.pyc new file mode 100644 index 0000000..67d0b32 Binary files /dev/null and b/__pycache__/tests.cpython-313.pyc differ diff --git a/algo.py b/algo.py new file mode 100644 index 0000000..fffd685 --- /dev/null +++ b/algo.py @@ -0,0 +1,56 @@ +from typing import List + +def gauss_method(coefficients: List[List[float]], + free_members: List[float]) -> List[float]: + """ + Реализация метода Гаусса для квадратной системы уравнений Ax = b. + + Алгоритм: + 1. Формируем расширенную матрицу [A|b]. + 2. Для каждого столбца: + - Ищем pivot: первый ненулевой элемент в текущем столбце от текущей строки вниз. + - Если pivot ≠ текущая строка, меняем строки местами. + 3. Обнуляем все элементы под pivot: + - Для каждой строки ниже: factor = current / pivot + - Текущая строка -= factor * строка с pivot + 4. После приведения к ступенчатой форме выполняем обратную подстановку: + - Проходим снизу вверх + - Для каждой переменной: x[i] = (свободный член - сумма(коэффициентов[i][j] * x[j] для j>i)) / pivot + 5. Возвращаем список решений x. + + Входные данные: + - coefficients: квадратная матрица коэффициентов A + - free_members: вектор свободных членов b + + Выход: + - Список решений x + """ + n = len(coefficients) + for i in range(n): + coefficients[i].append(free_members[i]) + + for i in range(n): + pivot_row = None + for r in range(i, n): + if coefficients[r][i] != 0: + pivot_row = r + break + if pivot_row is None: + raise ValueError("Система несовместна или вырождена") + + if pivot_row != i: + coefficients[i], coefficients[pivot_row] = coefficients[pivot_row], coefficients[i] + + pivot = coefficients[i][i] + + for r in range(i + 1, n): + factor = coefficients[r][i] / pivot + for c in range(i, n + 1): + coefficients[r][c] -= factor * coefficients[i][c] + + x = [0] * n + for i in range(n - 1, -1, -1): + sum_ax = sum(coefficients[i][j] * x[j] for j in range(i + 1, n)) + x[i] = (coefficients[i][n] - sum_ax) / coefficients[i][i] + + return x diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..bd1a125 --- /dev/null +++ b/tests.py @@ -0,0 +1,45 @@ +import unittest +from algo import gauss_method + +class TestGaussMethod(unittest.TestCase): + def test_2x2_unique_solution(self): + """Простейшая 2x2 система с уникальным решением""" + coef = [[1, 1], + [2, 3]] + free_mem = [5, 11] + result = gauss_method(coef, free_mem) + expected = [4.0, 1.0] + for r, e in zip(result, expected): + self.assertAlmostEqual(r, e, places=7) + + def test_2x2_another(self): + """Ещё одна 2x2 система""" + coef = [[2, 1], + [4, 3]] + free_mem = [5, 11] + result = gauss_method(coef, free_mem) + expected = [2.0, 1.0] + for r, e in zip(result, expected): + self.assertAlmostEqual(r, e, places=7) + + def test_3x3_unique_solution(self): + """3x3 система с уникальным решением""" + coef = [[1, 1, 1], + [2, 3, 1], + [1, 2, 3]] + free_mem = [6, 11, 14] + result = gauss_method(coef, free_mem) + expected = [1.0, 2.0, 3.0] + for r, e in zip(result, expected): + self.assertAlmostEqual(r, e, places=7) + + def test_degenerate_system(self): + """Вырожденная система должна выбросить исключение""" + coef = [[1, 1], + [2, 2]] + free_mem = [2, 4] + with self.assertRaises(ValueError): + gauss_method(coef, free_mem) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file