Linear Equations in Visual Basic QuickStart Sample

Illustrates how to solve systems of simultaneous linear equations in Visual Basic.

View this sample in: C# F# IronPython

Option Infer On

' The DenseMatrix and LUDecomposition classes reside in the 
' Extreme.Mathematics.LinearAlgebra namespace.
Imports Extreme.Mathematics
Imports Extreme.Mathematics.LinearAlgebra

    ' Illustrates solving systems of simultaneous linear
    ' equations using the DenseMatrix and LUDecomposition classes 
    ' in the Extreme.Mathematics.LinearAlgebra namespace of Extreme Numerics.NET.
    Module LinearEquations

        Sub Main()
        ' The license is verified at runtime. We're using
        ' a demo license here. For more information, see
        ' https://numerics.net/trial-key
        Extreme.License.Verify("Demo license")

        ' A system of simultaneous linear equations is
        ' defined by a square matrix A and a right-hand
        ' side B, which can be a vector or a matrix.
        '
        ' You can use any matrix type for the matrix A.
        ' The optimal algorithm is automatically selected.

        ' Let's start with a general matrix:
        Dim m = Matrix.Create(4, 4, New Double() _
                {1, 1, 1, 1,
                 1, 2, 3, 4,
                 1, 4, 9, 16,
                 1, 2, 1, 2}, MatrixElementOrder.ColumnMajor)
        Dim b1 = Vector.Create(New Double() {1, 3, 6, 3})
        Dim b2 = Matrix.Create(4, 2, New Double() _
                {1, 3, 6, 3,
                 2, 3, 5, 8}, MatrixElementOrder.ColumnMajor)
        Console.WriteLine("m = {0:F4}", m)

        '
        ' The Solve method
        '

        ' The following solves m x = b1. The second 
        ' parameter specifies whether to overwrite the
        ' right-hand side with the result.
        Dim x1 = m.Solve(b1, False)
        Console.WriteLine("x1 = {0:F4}", x1)
        ' If the overwrite parameter is omitted, the
        ' right-hand-side is overwritten with the solution:
        m.Solve(b1)
        Console.WriteLine("b1 = {0:F4}", b1)
        ' You can solve for multiple right hand side 
        ' vectors by passing them in a DenseMatrix:
        Dim x2 = m.Solve(b2, False)
        Console.WriteLine("x2 = {0:F4}", x2)

        '
        ' Related Methods
        '

        ' You can verify whether a matrix is singular
        ' using the IsSingular method:
        Console.WriteLine("IsSingular(m) = {0:F4}",
                m.IsSingular())
        ' The inverse matrix is returned by the GetInverse
        ' method:
        Console.WriteLine("GetInverse(m) = {0:F4}", m.GetInverse())
        ' The determinant is also available:
        Console.WriteLine("Det(m) = {0:F4}", m.GetDeterminant())
        ' The condition number is an estimate for the
        ' loss of precision in solving the equations
        Console.WriteLine("Cond(m) = {0:F4}", m.EstimateConditionNumber())
        Console.WriteLine()

        '
        ' The LUDecomposition class
        '

        ' If multiple operations need to be performed
        ' on the same matrix, it is more efficient to use
        ' the LUDecomposition class. This class does the
        ' bulk of the calculations only once.
        Console.WriteLine("Using LU Decomposition:")
        ' The constructor takes an optional second argument
        ' indicating whether to overwrite the original
        ' matrix with its decomposition:
        Dim lu = m.GetLUDecomposition(False)
        ' All methods mentioned earlier are still available:
        x2 = lu.Solve(b2, False)
        Console.WriteLine("x2 = {0:F4}", x2)
        Console.WriteLine("IsSingular(m) = {0:F4}",
                lu.IsSingular())
        Console.WriteLine("GetInverse(m) = {0:F4}", lu.GetInverse())
        Console.WriteLine("Det(m) = {0:F4}", lu.GetDeterminant())
        Console.WriteLine("Cond(m) = {0:F4}", lu.EstimateConditionNumber())
        ' In addition, you have access to the
        ' components, L and U of the decomposition.
        ' L is lower unit-triangular:
        Console.WriteLine("  L = {0:F4}", lu.LowerTriangularFactor)
        ' U is upper triangular:
        Console.WriteLine("  U = {0:F4}", lu.UpperTriangularFactor)

        Console.Write("Press Enter key to exit...")
        Console.ReadLine()
    End Sub

End Module