Gauss implementation
This commit is contained in:
commit
1577ed77ed
10 changed files with 136 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
.venv
|
||||
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal 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
10
.idea/mathing.iml
generated
Normal 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
7
.idea/misc.xml
generated
Normal 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
8
.idea/modules.xml
generated
Normal 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>
|
||||
BIN
__pycache__/algo.cpython-313.pyc
Normal file
BIN
__pycache__/algo.cpython-313.pyc
Normal file
Binary file not shown.
BIN
__pycache__/tests.cpython-313.pyc
Normal file
BIN
__pycache__/tests.cpython-313.pyc
Normal file
Binary file not shown.
56
algo.py
Normal file
56
algo.py
Normal 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
45
tests.py
Normal 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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue