Search code examples
pythonsumsympy

"cannot determine truth value of Relational" in summation


Trying to compute by hand a matrix determinant (I know the value is 28 and can be obtained by m.det()):

from sympy import symbols, Matrix, summation
i = symbols('i', integer=True)

m = Matrix([[3,  2, -1],
            [2, -1, -3],
            [1,  3, -2]])

D = summation(m[i,0]*m.cofactor(i,0), (i, 0, 2))

It raises:

File ... \sympy\matrices\matrices.py:140 in minor_submatrix  
    return _minor_submatrix(self, i, j)  
File ... \sympy\matrices\determinant.py:890 in _minor_submatrix  
    if i < 0:  
File ... \sympy\core\relational.py:511 in __bool__  
raise TypeError("cannot determine truth value of Relational")  
    TypeError: cannot determine truth value of Relational

Pinpointing:

summation(m[i,0], (i, 0, 2)) # Works
summation(m.cofactor(i,0), (i, 0, 2)) # Raises the error

I'm lost.


Solution

  • The problem is m.cofactor(i,0), specifically the i. By looking at the traceback:

        859 def _minor_submatrix(M, i, j):
        860     """Return the submatrix obtained by removing the `i`th row
        861     and `j`th column from ``M`` (works with Pythonic negative indices).
        862 
       (...)
        883     cofactor
        884     """
    --> 886     if i < 0:
        887         i += M.rows
        888     if j < 0:
    

    one can guess that the arguments to m.cofactor must be integer numbers, not symbols. So, we need to rethink how to obtain the result you are looking for. A simple list comprehension should be enough for this case:

    # here, the i variable takes numerical values
    sum([m[i,0] * m.cofactor(i, 0) for i in range(m.shape[0])])
    # out: 28