Symbolic Linear Algebra

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:

Symbolic matrices

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:

Symbolic matrices

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

Symbolic matrices

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):

Symbolic matrices

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
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.141.2.157