Исключение Гаусса — популярный численный метод, используемый в линейной алгебре для решения систем линейных уравнений. В этой статье блога мы рассмотрим различные эффективные методы реализации исключения Гаусса в Python с использованием мощной библиотеки NumPy. Каждый метод будет сопровождаться примерами кода, иллюстрирующими его использование и демонстрирующими его эффективность. К концу этой статьи вы получите четкое представление о различных методах исключения Гаусса и сможете выбрать наиболее подходящий для ваших конкретных нужд.
Методы:
-
Наивное исключение Гаусса:
- Описание: простейшая форма исключения Гаусса, также известная как алгоритм исключения Гаусса.
-
Пример кода:
import numpy as np def gauss_elimination(A, b): n = len(b) for k in range(n-1): for i in range(k+1, n): factor = A[i, k] / A[k, k] A[i, k+1:] -= factor * A[k, k+1:] b[i] -= factor * b[k] x = np.zeros(n) for k in range(n-1, -1, -1): x[k] = (b[k] - np.dot(A[k, k+1:], x[k+1:])) / A[k, k] return x
-
Частичное вращение:
- Описание: модификация простого метода исключения Гаусса, которая помогает предотвратить деление на ноль и уменьшает числовые ошибки.
-
Пример кода:
import numpy as np def partial_pivot(A, b): n = len(b) for k in range(n-1): if np.abs(A[k, k]) < 1e-15: max_index = np.argmax(np.abs(A[k+1:, k])) + k + 1 A[[k, max_index]] = A[[max_index, k]] b[[k, max_index]] = b[[max_index, k]] for i in range(k+1, n): factor = A[i, k] / A[k, k] A[i, k+1:] -= factor * A[k, k+1:] b[i] -= factor * b[k] x = np.zeros(n) for k in range(n-1, -1, -1): x[k] = (b[k] - np.dot(A[k, k+1:], x[k+1:])) / A[k, k] return x
-
Полный поворот:
- Описание: расширенная версия метода исключения Гаусса, которая выполняет замену строк и столбцов для достижения числовой стабильности.
-
Пример кода:
import numpy as np def complete_pivot(A, b): n = len(b) rows = np.arange(n) cols = np.arange(n) for k in range(n-1): pivot = np.argmax(np.abs(A[rows[k:, k:, ]])) # Find the maximum element for complete pivot pivot_row, pivot_col = np.unravel_index(pivot, (n-k, n-k)) pivot_row += k pivot_col += k A[[k, pivot_row]] = A[[pivot_row, k]] A[:, [k, pivot_col]] = A[:, [pivot_col, k]] b[[k, pivot_row]] = b[[pivot_row, k]] rows[[k, pivot_row]] = rows[[pivot_row, k]] cols[[k, pivot_col]] = cols[[pivot_col, k]] for i in range(k+1, n): factor = A[i, k] / A[k, k] A[i, k+1:] -= factor * A[k, k+1:] b[i] -= factor * b[k] x = np.zeros(n) for k in range(n-1, -1, -1): x[k] = (b[k] - np.dot(A[k, k+1:], x[k+1:])) / A[k, k] return x