![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /usr/local/lib/python3.6/dist-packages/sympy/holonomic/ |
Upload File : |
""" Linear Solver for Holonomic Functions""" from sympy.core import S from sympy.matrices.common import ShapeError from sympy.matrices.dense import MutableDenseMatrix class NewMatrix(MutableDenseMatrix): """ Supports elements which can't be Sympified. See docstrings in sympy/matrices/matrices.py """ @staticmethod def _sympify(a): return a def row_join(self, rhs): # Allows you to build a matrix even if it is null matrix if not self: return type(self)(rhs) if self.rows != rhs.rows: raise ShapeError( "`self` and `rhs` must have the same number of rows.") newmat = NewMatrix.zeros(self.rows, self.cols + rhs.cols) newmat[:, :self.cols] = self newmat[:, self.cols:] = rhs return type(self)(newmat) def col_join(self, bott): # Allows you to build a matrix even if it is null matrix if not self: return type(self)(bott) if self.cols != bott.cols: raise ShapeError( "`self` and `bott` must have the same number of columns.") newmat = NewMatrix.zeros(self.rows + bott.rows, self.cols) newmat[:self.rows, :] = self newmat[self.rows:, :] = bott return type(self)(newmat) def gauss_jordan_solve(self, b, freevar=False): from sympy.matrices import Matrix aug = self.hstack(self.copy(), b.copy()) row, col = aug[:, :-1].shape # solve by reduced row echelon form A, pivots = aug.rref() A, v = A[:, :-1], A[:, -1] pivots = list(filter(lambda p: p < col, pivots)) rank = len(pivots) # Bring to block form permutation = Matrix(range(col)).T A = A.vstack(A, permutation) for i, c in enumerate(pivots): A.col_swap(i, c) A, permutation = A[:-1, :], A[-1, :] # check for existence of solutions # rank of aug Matrix should be equal to rank of coefficient matrix if not v[rank:, 0].is_zero_matrix: raise ValueError("Linear system has no solution") # Get index of free symbols (free parameters) free_var_index = permutation[len(pivots):] # non-pivots columns are free variables # Free parameters tau = NewMatrix([S.One for k in range(col - rank)]).reshape(col - rank, 1) # Full parametric solution V = A[:rank, rank:] vt = v[:rank, 0] free_sol = tau.vstack(vt - V*tau, tau) # Undo permutation sol = NewMatrix.zeros(col, 1) for k, v in enumerate(free_sol): sol[permutation[k], 0] = v if freevar: return sol, tau, free_var_index else: return sol, tau