Task: Gaussian elimination







Python: 


import copy
from fractions import Fraction

def gauss(a, b):
    a = copy.deepcopy(a)
    b = copy.deepcopy(b)
    n = len(a)
    p = len(b[0])
    det = 1
    for i in range(n - 1):
        k = i
        for j in range(i + 1, n):
            if abs(a[j][i]) > abs(a[k][i]):
                k = j
        if k != i:
            a[i], a[k] = a[k], a[i]
            b[i], b[k] = b[k], b[i]
            det = -det
            
        for j in range(i + 1, n):
            t = a[j][i]/a[i][i]
            for k in range(i + 1, n):
                a[j][k] -= t*a[i][k]
            for k in range(p):
                b[j][k] -= t*b[i][k]
                
    for i in range(n - 1, -1, -1):
        for j in range(i + 1, n):
            t = a[i][j]
            for k in range(p):
                b[i][k] -= t*b[j][k]
        t = 1/a[i][i]
        det *= a[i][i]
        for j in range(p):
            b[i][j] *= t
    return det, b

def zeromat(p, q):
    return [[0]*q for i in range(p)]

def matmul(a, b):
    n, p = len(a), len(a[0])
    p1, q = len(b), len(b[0])
    if p != p1:
        raise ValueError("Incompatible dimensions")
    c = zeromat(n, q)
    for i in range(n):
        for j in range(q):
                c[i][j] = sum(a[i][k]*b[k][j] for k in range(p))
    return c


def mapmat(f, a):
    return [list(map(f, v)) for v in a]

def ratmat(a):
    return mapmat(Fraction, a)



a = [[2, 9, 4], [7, 5, 3], [6, 1, 8]]
b = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
det, c = gauss(a, b)

det
-360.0

c
[[-0.10277777777777776, 0.18888888888888888, -0.019444444444444438],
[0.10555555555555554, 0.02222222222222223, -0.061111111111111116],
[0.0638888888888889, -0.14444444444444446, 0.14722222222222223]]


matmul(a, c)
[[1.0, 0.0, 0.0], [5.551115123125783e-17, 1.0, 0.0],
[1.1102230246251565e-16, -2.220446049250313e-16, 1.0]]



det, c = gauss(ratmat(a), ratmat(b))

det
Fraction(-360, 1)

c
[[Fraction(-37, 360), Fraction(17, 90), Fraction(-7, 360)],
[Fraction(19, 180), Fraction(1, 45), Fraction(-11, 180)],
[Fraction(23, 360), Fraction(-13, 90), Fraction(53, 360)]]

matmul(a, c)
[[Fraction(1, 1), Fraction(0, 1), Fraction(0, 1)],
[Fraction(0, 1), Fraction(1, 1), Fraction(0, 1)],
[Fraction(0, 1), Fraction(0, 1), Fraction(1, 1)]]


VB: 
Private Function gauss_eliminate(a As Variant, b As Variant) As Variant
    Dim n As Integer: n = UBound(b)
    Dim tmp As Variant, m As Integer, mx As Variant
    For col = 1 To n
        m = col
        mx = a(m, m)
        For i = col + 1 To n
            tmp = Abs(a(i, col))
            If tmp > mx Then
                m = i
                mx = tmp
            End If
        Next i
        If col <> m Then
            For j = 1 To UBound(a, 2)
                tmp = a(col, j)
                a(col, j) = a(m, j)
                a(m, j) = tmp
            Next j
            tmp = b(col)
            b(col) = b(m)
            b(m) = tmp
        End If
        For i = col + 1 To n
            tmp = a(i, col) / a(col, col)
            For j = col + 1 To n
                a(i, j) = a(i, j) - tmp * a(col, j)
            Next j
            a(i, col) = 0
            b(i) = b(i) - tmp * b(col)
        Next i
    Next col
    Dim x() As Variant
    ReDim x(n)
    For col = n To 1 Step -1
        tmp = b(col)
        For j = n To col + 1 Step -1
            tmp = tmp - x(j) * a(col, j)
        Next j
        x(col) = tmp / a(col, col)
    Next col
    gauss_eliminate = x
End Function
Public Sub main()
    a = [{1.00, 0.00, 0.00,  0.00,  0.00,   0.00; 1.00, 0.63, 0.39,  0.25,  0.16,   0.10; 1.00, 1.26, 1.58,  1.98,  2.49,   3.13; 1.00, 1.88, 3.55,  6.70, 12.62,  23.80; 1.00, 2.51, 6.32, 15.88, 39.90, 100.28; 1.00, 3.14, 9.87, 31.01, 97.41, 306.02}]
    b = [{-0.01, 0.61, 0.91,  0.99,  0.60,   0.02}]
    Dim s() As String, x() As Variant
    ReDim s(UBound(b)), x(UBound(b))
    Debug.Print "(";
    x = gauss_eliminate(a, b)
    For i = 1 To UBound(x)
        s(i) = CStr(x(i))
    Next i
    t = Join(s, ", ")
    Debug.Print t; ")"
End Sub