From 344e15820f9bf6ad51d632733d9b83dcd35b102b Mon Sep 17 00:00:00 2001 From: Supriya Date: Sun, 6 Oct 2024 11:56:12 +0530 Subject: [PATCH 1/2] Improved gaussian elimination by adding an explanation about it and then checking for a zero pivot and perform partial pivoting if necessary in the gaussian_elimination function --- linear_algebra/gaussian_elimination.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/linear_algebra/gaussian_elimination.py b/linear_algebra/gaussian_elimination.py index 724773c0db98..3ef2070600c6 100644 --- a/linear_algebra/gaussian_elimination.py +++ b/linear_algebra/gaussian_elimination.py @@ -1,8 +1,18 @@ """ Gaussian elimination method for solving a system of linear equations. Gaussian elimination - https://en.wikipedia.org/wiki/Gaussian_elimination + +This function performs Gaussian elimination on the coefficient matrix to transform it into an upper triangular form. + +Parameters: + coefficients (NDArray[float64]): The square matrix representing the system's coefficients. + vector (NDArray[float64]): The vector of constants representing the right-hand side of the system of equations. + +Returns: + NDArray[float64]: The solution vector containing the values of the unknown variables. """ + import numpy as np from numpy import float64 from numpy.typing import NDArray @@ -65,12 +75,20 @@ def gaussian_elimination( augmented_mat: NDArray[float64] = np.concatenate((coefficients, vector), axis=1) augmented_mat = augmented_mat.astype("float64") - # scale the matrix leaving it triangular + # Gaussian elimination with partial pivoting to create an upper triangular matrix for row in range(rows - 1): pivot = augmented_mat[row, row] - for col in range(row + 1, columns): - factor = augmented_mat[col, row] / pivot - augmented_mat[col, :] -= factor * augmented_mat[row, :] + + # Check for a zero pivot and perform partial pivoting if necessary + if pivot == 0: + for i in range(row + 1, rows): + if augmented_mat[i, row] != 0: + # Swap rows to move non-zero pivot to the current row + augmented_mat[[row, i]] = augmented_mat[[i, row]] + pivot = augmented_mat[row, row] + break + else: + raise ValueError("The matrix is singular and cannot be solved.") x = retroactive_resolution( augmented_mat[:, 0:columns], augmented_mat[:, columns : columns + 1] From bbc1b48639fa66aac9aad8820359a080f44cbfb1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 6 Oct 2024 06:35:49 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- linear_algebra/gaussian_elimination.py | 1 - 1 file changed, 1 deletion(-) diff --git a/linear_algebra/gaussian_elimination.py b/linear_algebra/gaussian_elimination.py index 3ef2070600c6..c891b028c603 100644 --- a/linear_algebra/gaussian_elimination.py +++ b/linear_algebra/gaussian_elimination.py @@ -12,7 +12,6 @@ NDArray[float64]: The solution vector containing the values of the unknown variables. """ - import numpy as np from numpy import float64 from numpy.typing import NDArray