Task: Gaussian elimination





Java: import java.util.Locale;

public class GaussianElimination {
    public static double solve(double[][] a, double[][] b) {
        if (a == null || b == null || a.length == 0 || b.length == 0) {
            throw new IllegalArgumentException("Invalid dimensions");
        }
        
        int n = b.length, p = b[0].length;
        if (a.length != n || a[0].length != n) {
            throw new IllegalArgumentException("Invalid dimensions");
        }

        double det = 1.0;
        
        for (int i = 0; i < n - 1; i++) {
            int k = i;
            for (int j = i + 1; j < n; j++) {
                if (Math.abs(a[j][i]) > Math.abs(a[k][i])) {
                    k = j;
                }
            }
            
            if (k != i) {
                det = -det;
                
                for (int j = i; j < n; j++) {
                    double s = a[i][j];
                    a[i][j] = a[k][j];
                    a[k][j] = s;
                }

                for (int j = 0; j < p; j++) {
                    double s = b[i][j];
                    b[i][j] = b[k][j];
                    b[k][j] = s;
                }
            }
            
            for (int j = i + 1; j < n; j++) {
                double s = a[j][i] / a[i][i];
                for (k = i + 1; k < n; k++) {
                    a[j][k] -= s * a[i][k];
                }
                
                for (k = 0; k < p; k++) {
                    b[j][k] -= s * b[i][k];
                }
            }
        }
        
        for (int i = n - 1; i >= 0; i--) {
            for (int j = i + 1; j < n; j++) {
                double s = a[i][j];
                for (int k = 0; k < p; k++) {
                    b[i][k] -= s * b[j][k];
                }
            }
            double s = a[i][i];
            det *= s;
            for (int k = 0; k < p; k++) {
                b[i][k] /= s;
            }
        }
        
        return det;
    }
    
    public static void main(String[] args) {
        double[][] a = new double[][] {{4.0, 1.0, 0.0, 0.0, 0.0},
                                       {1.0, 4.0, 1.0, 0.0, 0.0},
                                       {0.0, 1.0, 4.0, 1.0, 0.0},
                                       {0.0, 0.0, 1.0, 4.0, 1.0},
                                       {0.0, 0.0, 0.0, 1.0, 4.0}};

        double[][] b = new double[][] {{1.0 / 2.0},
                                       {2.0 / 3.0},
                                       {3.0 / 4.0},
                                       {4.0 / 5.0},
                                       {5.0 / 6.0}};
                                       
        double[] x = {39.0 / 400.0,
                      11.0 / 100.0,
                      31.0 / 240.0,
                      37.0 / 300.0,
                      71.0 / 400.0};
                                       
        System.out.println("det: " + solve(a, b));
        

        for (int i = 0; i < 5; i++) {
            System.out.printf(Locale.US, "%12.8f %12.4e\n", b[i][0], b[i][0] - x[i]);
        }
    }
}




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