123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- from sympy.core.sympify import _sympify
- from sympy.core import S, Basic
- from sympy.matrices.common import NonSquareMatrixError
- from sympy.matrices.expressions.matpow import MatPow
- class Inverse(MatPow):
- """
- The multiplicative inverse of a matrix expression
- This is a symbolic object that simply stores its argument without
- evaluating it. To actually compute the inverse, use the ``.inverse()``
- method of matrices.
- Examples
- ========
- >>> from sympy import MatrixSymbol, Inverse
- >>> A = MatrixSymbol('A', 3, 3)
- >>> B = MatrixSymbol('B', 3, 3)
- >>> Inverse(A)
- A**(-1)
- >>> A.inverse() == Inverse(A)
- True
- >>> (A*B).inverse()
- B**(-1)*A**(-1)
- >>> Inverse(A*B)
- (A*B)**(-1)
- """
- is_Inverse = True
- exp = S.NegativeOne
- def __new__(cls, mat, exp=S.NegativeOne):
- # exp is there to make it consistent with
- # inverse.func(*inverse.args) == inverse
- mat = _sympify(mat)
- exp = _sympify(exp)
- if not mat.is_Matrix:
- raise TypeError("mat should be a matrix")
- if not mat.is_square:
- raise NonSquareMatrixError("Inverse of non-square matrix %s" % mat)
- return Basic.__new__(cls, mat, exp)
- @property
- def arg(self):
- return self.args[0]
- @property
- def shape(self):
- return self.arg.shape
- def _eval_inverse(self):
- return self.arg
- def _eval_determinant(self):
- from sympy.matrices.expressions.determinant import det
- return 1/det(self.arg)
- def doit(self, **hints):
- if 'inv_expand' in hints and hints['inv_expand'] == False:
- return self
- arg = self.arg
- if hints.get('deep', True):
- arg = arg.doit(**hints)
- return arg.inverse()
- def _eval_derivative_matrix_lines(self, x):
- arg = self.args[0]
- lines = arg._eval_derivative_matrix_lines(x)
- for line in lines:
- line.first_pointer *= -self.T
- line.second_pointer *= self
- return lines
- from sympy.assumptions.ask import ask, Q
- from sympy.assumptions.refine import handlers_dict
- def refine_Inverse(expr, assumptions):
- """
- >>> from sympy import MatrixSymbol, Q, assuming, refine
- >>> X = MatrixSymbol('X', 2, 2)
- >>> X.I
- X**(-1)
- >>> with assuming(Q.orthogonal(X)):
- ... print(refine(X.I))
- X.T
- """
- if ask(Q.orthogonal(expr), assumptions):
- return expr.arg.T
- elif ask(Q.unitary(expr), assumptions):
- return expr.arg.conjugate()
- elif ask(Q.singular(expr), assumptions):
- raise ValueError("Inverse of singular matrix %s" % expr.arg)
- return expr
- handlers_dict['Inverse'] = refine_Inverse
|