# Solving Linear Equations¶

## Serial Algorithm¶

First, we construct a linear equations system $Ax=b$.

In [ ]:

    n = 5
    A = rand(-10.0:10.0, (n, n))

In [ ]:

    x = rand(-10.0:10.0, n)
    b = A * x

The code in the following cell converts the problem $Ax=b$ to the upper triangular equation system $Ux=y$.

In [ ]:

    function convert_to_upper_triangular(A,b)
        # Upper Triangularization: convert Ax=b to Ux=y
        for k in 1:n
            for j in k+1:n
                # Divide by pivot
                A[k,j] = A[k,j] / A[k,k]
            end
            b[k] = b[k] / A[k,k]
            A[k,k] = 1
            # Substract lower rows
            for i in k+1:n
                for j in k+1:n
                    A[i,j]=A[i,j] - A[i,k] * A[k,j]
                end
                b[i] = b[i] - A[i,k] * b[k]
                A[i,k] = 0
            end
        end
        return A, b #U,y
    end

The function in the following cell solves the upper triangular equation system using backwards substitution.

In [ ]:

    function solve_upper_triangular(U,y)
        n = size(U,1)
        for step in reverse(1:n)
            if U[step,step] == 0
                if y[step] != 0
                    return "No solution"
                else
                    return "Infinity solutions"
                end
            else
            # Backwards substitution
                y[step] = y[step] / U[step,step]
            end
            for row in reverse(1:step-1)
                y[row] -= U[row,step] * y[step]
            end
        end
        return y
    end

In [ ]:

    U,y = convert_to_upper_triangular(A,b)
    sol = solve_upper_triangular(U,y)

We can test if the obtained solution is correct using `@test`:

In [ ]:

    using Test
    @test sol ≈ x

In [ ]: