Gauss implementation
This commit is contained in:
commit
1577ed77ed
10 changed files with 136 additions and 0 deletions
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue