Suppose I have a matrix m:
$$ m = \left(\begin{array}{rr} 2 & -3 \\ 1 & 0 \end{array}\right). $$ It is diagonalizable and has complex eigenvalues. I now want to diagonalize it, but get an error:
In [20]: m = matrix([[2, -3], [1, 0]]); m.diagonalization()
...
ValueError: matrix entries must be from a field
When I specify the field m = matrix(CDF, [[2, -3], [1, 0]])
, I get ValueError: base field must be exact, but Complex Double Field is not
. Specifying ComplexLazyField()
instead of CDF
raises NotImplementedError
.
So, apparently, Sage is trying to diagonalize the matrix symbolically, i.e. exactly. But what if I don't care about exactness and just want a straightforward numerical answer?
This is how I would do it with sympy
:
In [22]: import sympy as sp
...: m = sp.Matrix([[2, -3], [1, 0]])
...: m.diagonalize()
Out[22]:
(Matrix([
[1 - sqrt(2)*I, 1 + sqrt(2)*I],
[ 1, 1]]),
Matrix([
[1 - sqrt(2)*I, 0],
[ 0, 1 + sqrt(2)*I]]))
Notice that the output is actually exact. I know I can run this same Python code in Sage, but I assume there's a more native way to do it.
To sum up, how do I get Sage to diagonalize a matrix over $\mathbb{C}$? How do I change the code if I only need the numerical answer?