56 lines
2.4 KiB
Python
56 lines
2.4 KiB
Python
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
|