discretize.utils.inverse_2x2_block_diagonal#
- discretize.utils.inverse_2x2_block_diagonal(a11, a12, a21, a22, return_matrix=True, **kwargs)[source]#
Invert a set of 2x2 matricies from vectors containing their elements.
- Parameters:
- a11, a12, a21, a22(
n_blocks
)numpy.ndarray
All arguments a11, a12, a21, a22 are vectors which contain the corresponding element for all 2x2 matricies
- return_matrixbool,
optional
True: Returns the sparse block 2x2 matrix M.
False: Returns the vectors containing the elements of each matrix’ inverse.
- a11, a12, a21, a22(
- Returns:
- (2 *
n_blocks
, 2 *n_blocks
)scipy.sparse.coo_matrix
orlist
of
(n_blocks
)numpy.ndarray
If return_matrix = False, the function will return vectors b11, b12, b21, b22. If return_matrix = True, the function will return the block matrix M
- (2 *
Notes
The elements of a 2x2 matrix A are given by:
For a set of 2x2 matricies, the elements may be stored in a set of 4 distinct vectors
, , and . For each matrix, inverse_2x2_block_diagonal ouputs the vectors containing the elements of each matrix’ inverse; i.e. , , and where:For special applications, we may want to output the elements of the inverses of the matricies as a 2x2 block matrix of the form:
where
are diagonal matrices whose non-zero elements are defined by vector . Where n is the number of matricies, the block matrix is sparse with dimensions (2n, 2n).Examples
Here, we define four 2x2 matricies and reorganize their elements into 4 vectors a11, a12, a21 and a22. We then examine the outputs of the function inverse_2x2_block_diagonal when the argument return_matrix is set to both True and False.
>>> from discretize.utils import inverse_2x2_block_diagonal >>> import numpy as np >>> import matplotlib.pyplot as plt
Define four 3x3 matricies, and organize their elements into four vectors
>>> A1 = np.random.uniform(1, 10, (2, 2)) >>> A2 = np.random.uniform(1, 10, (2, 2)) >>> A3 = np.random.uniform(1, 10, (2, 2)) >>> A4 = np.random.uniform(1, 10, (2, 2)) >>> [[a11, a12], [a21, a22]] = np.stack([A1, A2, A3, A4], axis=-1)
Return the elements of their inverse and validate
>>> b11, b12, b21, b22 = inverse_2x2_block_diagonal( ... a11, a12, a21, a22, return_matrix=False ... ) >>> Bs = np.stack([[b11, b12],[b21, b22]]) >>> B1, B2, B3, B4 = Bs.transpose((2, 0, 1))
>>> np.linalg.inv(A1) array([[ 0.34507439, -0.4831833 ], [-0.24286626, 0.57531461]]) >>> B1 array([[ 0.34507439, -0.4831833 ], [-0.24286626, 0.57531461]])
Plot the sparse block matrix containing elements of the inverses
>>> M = inverse_2x2_block_diagonal( ... a11, a12, a21, a22 ... ) >>> plt.spy(M) >>> plt.show()
(
Source code
,png
,pdf
)