Source code for irfpy.util.graminan

''' Module for `Gramian matrix <http://en.wikipedia.org/wiki/Gramian_matrix>`_


'''
import logging
_logger = logging.getLogger(__name__)
import numpy as np


[docs]class Graminan: def __init__(self, a_m): r''' Instance granian. :param a_m: M arrays with dimension of N. Real space only considered. Consider 3-D real space (N=3). Take 2 vector (M=2). Then, Graminan can be obtained via >>> a1 = np.array([1., 0, -2]) >>> a2 = np.array([0, -2., 1]) >>> G2 = Graminan([a1, a2]) >>> print(G2.m) 2 >>> print(G2.n) 3 >>> print(G2.matrix) [[ 5. -2.] [-2. 5.]] Determinant of G highly relate to the area and volume. For this case, only two vector povides only area. .. math:: S = \sqrt{det(G_2)} For m=3 case, you can get volume as .. math:: V = \sqrt{det(G_3)} Probably for m=4 case, you can get super volume as .. math:: V_4 = \sqrt{det(G_4)} These functionalities are implemented as :meth:`get_volume` function. ''' self.m = len(a_m) self.n = len(a_m[0]) if self.m > self.n: _logger.error('The Graminan should have m<=n, while m=%d n=%d' % (self.m, self.n)) raise ValueError('m=%d n=%d, should be m<=n' % (self.m, self.n)) m = self.m self.matrix = np.zeros([m, m]) for ix in range(m): for iy in range(m): self.matrix[ix, iy] = np.dot(a_m[ix], a_m[iy])
[docs] def get_volume(self): ''' Return the volume (generalized). For m=2 case, area (of trapezoid) is returned. For m=3 case, volume (hexahedron) is returend. Probably for m=4 case, super volume is returend. ''' return np.sqrt(np.linalg.det(self.matrix))
import unittest import doctest
[docs]def doctests(): return unittest.TestSuite(( doctest.DocTestSuite(), ))
if __name__ == '__main__': unittest.main(defaultTest='doctests')