Source code for numa.LinearSystem._gauss

import numpy as np
from numa import utils


[docs]def solveGauss(A, b): """Solves the given linear system of equations using the Gauss method. A post-iteration is implemented as well to reduce the error. Parameters ---------- A: numpy.arrays Coefficient matrix b: numpy.array Column vector of constant terms Returns ------- x: numpy.array Solution vector Notes ----- The pivot element for the i-th row in the i-th column is choosen through .. math:: a_p = max_{k=i,...,n}|a_{ki}| Rounding errors can lead to less accurate results so .. math:: A \cdot (x + \Delta x) = b + \Delta b is calculated instead. This can be rewritten .. math:: \Delta b = A \cdot (x + \Delta x) - b .. math:: A \cdot \Delta x = \Delta b .. math:: x_0 = (x + \Delta x) .. math:: x_1 = x_0 - \Delta x """ utils._checkDimensions(A, b) if utils.isSingular(A): raise utils.SingularityError("Input matrix is singular.") x_calculated = _gauss(A, b) acc = 10e-14 accuracy_achieved = False while not accuracy_achieved: delb = b - np.matmul(A, x_calculated) delX = _gauss(A, delb) x_calculated = np.subtract(x_calculated, delX) if [x < acc for x in x_calculated]: accuracy_achieved = True return x_calculated
def _gauss(A, b): """Python implementation of the Gauß method to solve systems of linear equations. Parameters ---------- A: numpy.arrays Coefficient matrix b: numpy.array Column vector of constant terms Returns ------- x: numpy.array Solution vector """ M = np.column_stack((A, b)) m, n = M.shape for j in range(n-1): # i - row, j - column pivot_elements = [abs(M[l][j]) for l in range(j, len(M))] pivot_index = pivot_elements.index(max(pivot_elements)) + j pivot_row, j_row = np.copy(M[pivot_index]), np.copy(M[j]) M[j], M[pivot_index] = pivot_row, j_row # Swap for i in range(j+1, m): f = M[i][j] / M[j][j] for k in range(j + 1, n): M[i][k] -= M[j][k] * f M[i][j] = 0 x = [] for i in range(m - 1, -1, -1): x.insert(0, M[i][m] / M[i][i]) for k in range(i - 1, -1, -1): M[k][m] -= M[k][i] * x[0] return x