Ejemplo n.º 1
0
def gauss_trid(A: np.array, B: np.array) -> np.array:
    '''
    >>> A = np.array([[1, -1,  0,  0,  0], \
                      [1,  1, -1,  0,  0], \
                      [0,  1, -1,  1,  0], \
                      [0,  0, -1,  1,  1], \
                      [0,  0,  0, -1,  2]], dtype=float)
    >>> B = np.array([0, 1, 2, -1, -2], dtype=float)
    >>> gauss_trid(A, B)
    array([5., 5., 9., 6., 2.])
    '''
    n = len(A)

    # t, r, d, b = optimize(A, B)
    t = np.append([np.nan], A.diagonal(-1))
    r = A.diagonal(0).copy()
    d = np.append(A.diagonal(1), [np.nan])
    for i in range(1, n):
        factor = t[i] / r[i - 1]
        r[i] -= factor * d[i - 1]
        B[i] -= factor * B[i - 1]

    X = np.empty_like(B)
    X[-1] = B[-1] / r[-1]
    for i in reversed(range(n - 1)):
        X[i] = (B[i] - d[i] * X[i + 1]) / r[i]

    return X
Ejemplo n.º 2
0
def LUTridiagonal(A:np.array) -> (np.matrix, np.matrix):
    """ LU decomposition for tridiagonal matrices. Done in a hurry, expect bugs JGC.
        Args:
            A: A list representation of a matrix, or numpy type matrix.

        Returns:
            L: Lower triangular matrix.
            U: Upper triangular matrix.
    """

    A = np.matrix(A)
    m,n = A.shape
    d = np.squeeze(np.asarray(A.diagonal()))
    a = np.squeeze(np.asarray(A.diagonal(-1)))
    c = np.squeeze(np.asarray(A.diagonal(1)))

    l = np.zeros(n-1)
    v = np.zeros(n)

    v[0] = d[0]

    for i in range(1,n):
        l[i-1] = a[i-1] / v[i-1]
        v[i] = d[i] - np.dot(l[i-1],c[i-1])

    L = np.eye(m,n, dtype=int) + np.diag(l, -1)
    U = np.diag(v) + np.diag(c,1)

    return L,U
Ejemplo n.º 3
0
def check_win(board: np.array) -> int:
    """
    Given a 3*3 numpy array whose elements are 0, 1, -1
    representing empty, player1 and player 2,
    return the player who's won if any or 0 if no winner found

    Args:
        board (np.array): 3 x 3 board

    Returns:
        int: 0  -> no winner
             1  -> player 1
             -1 -> player 2

    """
    assert board.shape == (3, 3)
    for axis in [0, 1]:
        axis_sum = board.sum(axis=axis)
        if 3 in axis_sum:
            return 1
        elif -3 in axis_sum:
            return -1

    diag = board.diagonal().sum()
    diag_inv = np.fliplr(board).diagonal().sum()
    for diag_sum in [diag, diag_inv]:
        if diag_sum == 3:
            return 1
        elif diag_sum == -3:
            return -1

    # no winner yet
    return 0
Ejemplo n.º 4
0
def prod_upper_avg_diagonal(matrix: np.array):
    aver, diag = np.average(matrix), matrix.diagonal()
    return np.prod(diag[diag > aver])
Ejemplo n.º 5
0
def prod_upper_avg_diagonal(matrix: np.array):
    average = np.average(matrix)
    diagonal = matrix.diagonal()
    f = diagonal > average
    return np.prod(diagonal[f])
Ejemplo n.º 6
0
def prod_upper_avg_diagonal(matrix: np.array):
    diagonal = matrix.diagonal()
    average = np.average(matrix)
    return np.prod(diagonal[diagonal > average])