Gauss implementation

This commit is contained in:
helldh 2026-01-17 00:16:14 +03:00
commit 1577ed77ed
10 changed files with 136 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.venv

3
.idea/.gitignore generated vendored Normal file
View file

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View file

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

10
.idea/mathing.iml generated Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.13 (mathing)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

7
.idea/misc.xml generated Normal file
View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.13 (mathing)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13 (mathing)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/mathing.iml" filepath="$PROJECT_DIR$/.idea/mathing.iml" />
</modules>
</component>
</project>

Binary file not shown.

Binary file not shown.

56
algo.py Normal file
View file

@ -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

45
tests.py Normal file
View file

@ -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()