Symbolic linear algebra is supported by SymPy's matrix
data type which we will introduce first.
Then we will present some linear algebra methods as examples for the broad spectrum of possibilities for symbolic computations in this field:
We briefly met the matrix
data type when we discussed vector valued functions. There, we saw it in its simplest form, which converts a list of lists into a matrix. To have an example, let's construct a rotation matrix:
phi=symbols('phi') rotation=Matrix([[cos(phi), -sin(phi)], [sin(phi), cos(phi)]])
When working with SymPy matrices we have to note that the operator *
performs matrix multiplications and is not acting as an elementwise multiplication which is the case for NumPy arrays.
The above defined rotation matrix can be checked for orthogonality, by using this matrix multiplication and the transpose of a matrix:
simplify(rotation.T*rotation -eye(2)) # returns a 2 x 2 zero matrix
The previous example shows how a matrix is transposed and how the identity matrix is created. Alternatively, we could have checked whether its inverse is its transpose, which can be done as:
simplify(rotation.T - rotation.inv())
Another way to set up a matrix is by providing a list of symbols and a shape:
M = Matrix(3,3, symbols('M:3(:3)'))
This creates the following matrix:
A third way to create a matrix is by generating its entries by a given function. The syntax is:
Matrix(number of rows,number of colums, function)
We exemplify the above matrix by considering Toeplitz matrix is a matrix with constant diagonals. Given a 2n-1 data vector a, its elements are defined as
In SymPy, the matrix can be defined by directly making use of this definition:
def toeplitz(n): a = symbols('a:'+str(2*n)) f = lambda i,j: a[i-j+n-1] return Matrix(n,n,f)
Executing the previous code gives toeplitz(5)
:
One clearly sees the desired structures; all elements along subdiagonals and superdiagonals are the same. We can access matrix elements by the indexes and slices according to the Python syntax introduced in the section Lists of Chapter 3, Container Type:
a=symbols('a') M[0,2]=0 # changes one element M[1,:]=Matrix(1,3,[1,2,3]) # changes an entire row
3.141.2.157