Spaces:
Sleeping
Sleeping
""" | |
Additional AST nodes for operations on matrices. The nodes in this module | |
are meant to represent optimization of matrix expressions within codegen's | |
target languages that cannot be represented by SymPy expressions. | |
As an example, we can use :meth:`sympy.codegen.rewriting.optimize` and the | |
``matin_opt`` optimization provided in :mod:`sympy.codegen.rewriting` to | |
transform matrix multiplication under certain assumptions: | |
>>> from sympy import symbols, MatrixSymbol | |
>>> n = symbols('n', integer=True) | |
>>> A = MatrixSymbol('A', n, n) | |
>>> x = MatrixSymbol('x', n, 1) | |
>>> expr = A**(-1) * x | |
>>> from sympy import assuming, Q | |
>>> from sympy.codegen.rewriting import matinv_opt, optimize | |
>>> with assuming(Q.fullrank(A)): | |
... optimize(expr, [matinv_opt]) | |
MatrixSolve(A, vector=x) | |
""" | |
from .ast import Token | |
from sympy.matrices import MatrixExpr | |
from sympy.core.sympify import sympify | |
class MatrixSolve(Token, MatrixExpr): | |
"""Represents an operation to solve a linear matrix equation. | |
Parameters | |
========== | |
matrix : MatrixSymbol | |
Matrix representing the coefficients of variables in the linear | |
equation. This matrix must be square and full-rank (i.e. all columns must | |
be linearly independent) for the solving operation to be valid. | |
vector : MatrixSymbol | |
One-column matrix representing the solutions to the equations | |
represented in ``matrix``. | |
Examples | |
======== | |
>>> from sympy import symbols, MatrixSymbol | |
>>> from sympy.codegen.matrix_nodes import MatrixSolve | |
>>> n = symbols('n', integer=True) | |
>>> A = MatrixSymbol('A', n, n) | |
>>> x = MatrixSymbol('x', n, 1) | |
>>> from sympy.printing.numpy import NumPyPrinter | |
>>> NumPyPrinter().doprint(MatrixSolve(A, x)) | |
'numpy.linalg.solve(A, x)' | |
>>> from sympy import octave_code | |
>>> octave_code(MatrixSolve(A, x)) | |
'A \\\\ x' | |
""" | |
__slots__ = _fields = ('matrix', 'vector') | |
_construct_matrix = staticmethod(sympify) | |
_construct_vector = staticmethod(sympify) | |
def shape(self): | |
return self.vector.shape | |
def _eval_derivative(self, x): | |
A, b = self.matrix, self.vector | |
return MatrixSolve(A, b.diff(x) - A.diff(x) * MatrixSolve(A, b)) | |