91 lines
3.1 KiB
Python
91 lines
3.1 KiB
Python
|
"""
|
||
|
Tests for the sympy.polys.matrices.eigen module
|
||
|
"""
|
||
|
|
||
|
from sympy.core.singleton import S
|
||
|
from sympy.functions.elementary.miscellaneous import sqrt
|
||
|
from sympy.matrices.dense import Matrix
|
||
|
|
||
|
from sympy.polys.agca.extensions import FiniteExtension
|
||
|
from sympy.polys.domains import QQ
|
||
|
from sympy.polys.polytools import Poly
|
||
|
from sympy.polys.rootoftools import CRootOf
|
||
|
from sympy.polys.matrices.domainmatrix import DomainMatrix
|
||
|
|
||
|
from sympy.polys.matrices.eigen import dom_eigenvects, dom_eigenvects_to_sympy
|
||
|
|
||
|
|
||
|
def test_dom_eigenvects_rational():
|
||
|
# Rational eigenvalues
|
||
|
A = DomainMatrix([[QQ(1), QQ(2)], [QQ(1), QQ(2)]], (2, 2), QQ)
|
||
|
rational_eigenvects = [
|
||
|
(QQ, QQ(3), 1, DomainMatrix([[QQ(1), QQ(1)]], (1, 2), QQ)),
|
||
|
(QQ, QQ(0), 1, DomainMatrix([[QQ(-2), QQ(1)]], (1, 2), QQ)),
|
||
|
]
|
||
|
assert dom_eigenvects(A) == (rational_eigenvects, [])
|
||
|
|
||
|
# Test converting to Expr:
|
||
|
sympy_eigenvects = [
|
||
|
(S(3), 1, [Matrix([1, 1])]),
|
||
|
(S(0), 1, [Matrix([-2, 1])]),
|
||
|
]
|
||
|
assert dom_eigenvects_to_sympy(rational_eigenvects, [], Matrix) == sympy_eigenvects
|
||
|
|
||
|
|
||
|
def test_dom_eigenvects_algebraic():
|
||
|
# Algebraic eigenvalues
|
||
|
A = DomainMatrix([[QQ(1), QQ(2)], [QQ(3), QQ(4)]], (2, 2), QQ)
|
||
|
Avects = dom_eigenvects(A)
|
||
|
|
||
|
# Extract the dummy to build the expected result:
|
||
|
lamda = Avects[1][0][1].gens[0]
|
||
|
irreducible = Poly(lamda**2 - 5*lamda - 2, lamda, domain=QQ)
|
||
|
K = FiniteExtension(irreducible)
|
||
|
KK = K.from_sympy
|
||
|
algebraic_eigenvects = [
|
||
|
(K, irreducible, 1, DomainMatrix([[KK((lamda-4)/3), KK(1)]], (1, 2), K)),
|
||
|
]
|
||
|
assert Avects == ([], algebraic_eigenvects)
|
||
|
|
||
|
# Test converting to Expr:
|
||
|
sympy_eigenvects = [
|
||
|
(S(5)/2 - sqrt(33)/2, 1, [Matrix([[-sqrt(33)/6 - S(1)/2], [1]])]),
|
||
|
(S(5)/2 + sqrt(33)/2, 1, [Matrix([[-S(1)/2 + sqrt(33)/6], [1]])]),
|
||
|
]
|
||
|
assert dom_eigenvects_to_sympy([], algebraic_eigenvects, Matrix) == sympy_eigenvects
|
||
|
|
||
|
|
||
|
def test_dom_eigenvects_rootof():
|
||
|
# Algebraic eigenvalues
|
||
|
A = DomainMatrix([
|
||
|
[0, 0, 0, 0, -1],
|
||
|
[1, 0, 0, 0, 1],
|
||
|
[0, 1, 0, 0, 0],
|
||
|
[0, 0, 1, 0, 0],
|
||
|
[0, 0, 0, 1, 0]], (5, 5), QQ)
|
||
|
Avects = dom_eigenvects(A)
|
||
|
|
||
|
# Extract the dummy to build the expected result:
|
||
|
lamda = Avects[1][0][1].gens[0]
|
||
|
irreducible = Poly(lamda**5 - lamda + 1, lamda, domain=QQ)
|
||
|
K = FiniteExtension(irreducible)
|
||
|
KK = K.from_sympy
|
||
|
algebraic_eigenvects = [
|
||
|
(K, irreducible, 1,
|
||
|
DomainMatrix([
|
||
|
[KK(lamda**4-1), KK(lamda**3), KK(lamda**2), KK(lamda), KK(1)]
|
||
|
], (1, 5), K)),
|
||
|
]
|
||
|
assert Avects == ([], algebraic_eigenvects)
|
||
|
|
||
|
# Test converting to Expr (slow):
|
||
|
l0, l1, l2, l3, l4 = [CRootOf(lamda**5 - lamda + 1, i) for i in range(5)]
|
||
|
sympy_eigenvects = [
|
||
|
(l0, 1, [Matrix([-1 + l0**4, l0**3, l0**2, l0, 1])]),
|
||
|
(l1, 1, [Matrix([-1 + l1**4, l1**3, l1**2, l1, 1])]),
|
||
|
(l2, 1, [Matrix([-1 + l2**4, l2**3, l2**2, l2, 1])]),
|
||
|
(l3, 1, [Matrix([-1 + l3**4, l3**3, l3**2, l3, 1])]),
|
||
|
(l4, 1, [Matrix([-1 + l4**4, l4**3, l4**2, l4, 1])]),
|
||
|
]
|
||
|
assert dom_eigenvects_to_sympy([], algebraic_eigenvects, Matrix) == sympy_eigenvects
|