|
from sympy.core.evalf import N |
|
from sympy.core.numbers import (Float, I, Rational) |
|
from sympy.core.symbol import (Symbol, symbols) |
|
from sympy.functions.elementary.complexes import Abs |
|
from sympy.functions.elementary.miscellaneous import sqrt |
|
from sympy.functions.elementary.trigonometric import (cos, sin) |
|
from sympy.matrices import eye, Matrix |
|
from sympy.core.singleton import S |
|
from sympy.testing.pytest import raises, XFAIL |
|
from sympy.matrices.exceptions import NonSquareMatrixError, MatrixError |
|
from sympy.matrices.expressions.fourier import DFT |
|
from sympy.simplify.simplify import simplify |
|
from sympy.matrices.immutable import ImmutableMatrix |
|
from sympy.testing.pytest import slow |
|
from sympy.testing.matrices import allclose |
|
|
|
|
|
def test_eigen(): |
|
R = Rational |
|
M = Matrix.eye(3) |
|
assert M.eigenvals(multiple=False) == {S.One: 3} |
|
assert M.eigenvals(multiple=True) == [1, 1, 1] |
|
|
|
assert M.eigenvects() == ( |
|
[(1, 3, [Matrix([1, 0, 0]), |
|
Matrix([0, 1, 0]), |
|
Matrix([0, 0, 1])])]) |
|
|
|
assert M.left_eigenvects() == ( |
|
[(1, 3, [Matrix([[1, 0, 0]]), |
|
Matrix([[0, 1, 0]]), |
|
Matrix([[0, 0, 1]])])]) |
|
|
|
M = Matrix([[0, 1, 1], |
|
[1, 0, 0], |
|
[1, 1, 1]]) |
|
|
|
assert M.eigenvals() == {2*S.One: 1, -S.One: 1, S.Zero: 1} |
|
|
|
assert M.eigenvects() == ( |
|
[ |
|
(-1, 1, [Matrix([-1, 1, 0])]), |
|
( 0, 1, [Matrix([0, -1, 1])]), |
|
( 2, 1, [Matrix([R(2, 3), R(1, 3), 1])]) |
|
]) |
|
|
|
assert M.left_eigenvects() == ( |
|
[ |
|
(-1, 1, [Matrix([[-2, 1, 1]])]), |
|
(0, 1, [Matrix([[-1, -1, 1]])]), |
|
(2, 1, [Matrix([[1, 1, 1]])]) |
|
]) |
|
|
|
a = Symbol('a') |
|
M = Matrix([[a, 0], |
|
[0, 1]]) |
|
|
|
assert M.eigenvals() == {a: 1, S.One: 1} |
|
|
|
M = Matrix([[1, -1], |
|
[1, 3]]) |
|
assert M.eigenvects() == ([(2, 2, [Matrix(2, 1, [-1, 1])])]) |
|
assert M.left_eigenvects() == ([(2, 2, [Matrix([[1, 1]])])]) |
|
|
|
M = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
|
a = R(15, 2) |
|
b = 3*33**R(1, 2) |
|
c = R(13, 2) |
|
d = (R(33, 8) + 3*b/8) |
|
e = (R(33, 8) - 3*b/8) |
|
|
|
def NS(e, n): |
|
return str(N(e, n)) |
|
r = [ |
|
(a - b/2, 1, [Matrix([(12 + 24/(c - b/2))/((c - b/2)*e) + 3/(c - b/2), |
|
(6 + 12/(c - b/2))/e, 1])]), |
|
( 0, 1, [Matrix([1, -2, 1])]), |
|
(a + b/2, 1, [Matrix([(12 + 24/(c + b/2))/((c + b/2)*d) + 3/(c + b/2), |
|
(6 + 12/(c + b/2))/d, 1])]), |
|
] |
|
r1 = [(NS(r[i][0], 2), NS(r[i][1], 2), |
|
[NS(j, 2) for j in r[i][2][0]]) for i in range(len(r))] |
|
r = M.eigenvects() |
|
r2 = [(NS(r[i][0], 2), NS(r[i][1], 2), |
|
[NS(j, 2) for j in r[i][2][0]]) for i in range(len(r))] |
|
assert sorted(r1) == sorted(r2) |
|
|
|
eps = Symbol('eps', real=True) |
|
|
|
M = Matrix([[abs(eps), I*eps ], |
|
[-I*eps, abs(eps) ]]) |
|
|
|
assert M.eigenvects() == ( |
|
[ |
|
( 0, 1, [Matrix([[-I*eps/abs(eps)], [1]])]), |
|
( 2*abs(eps), 1, [ Matrix([[I*eps/abs(eps)], [1]]) ] ), |
|
]) |
|
|
|
assert M.left_eigenvects() == ( |
|
[ |
|
(0, 1, [Matrix([[I*eps/Abs(eps), 1]])]), |
|
(2*Abs(eps), 1, [Matrix([[-I*eps/Abs(eps), 1]])]) |
|
]) |
|
|
|
M = Matrix(3, 3, [1, 2, 0, 0, 3, 0, 2, -4, 2]) |
|
M._eigenvects = M.eigenvects(simplify=False) |
|
assert max(i.q for i in M._eigenvects[0][2][0]) > 1 |
|
M._eigenvects = M.eigenvects(simplify=True) |
|
assert max(i.q for i in M._eigenvects[0][2][0]) == 1 |
|
|
|
M = Matrix([[Rational(1, 4), 1], [1, 1]]) |
|
assert M.eigenvects() == [ |
|
(Rational(5, 8) - sqrt(73)/8, 1, [Matrix([[-sqrt(73)/8 - Rational(3, 8)], [1]])]), |
|
(Rational(5, 8) + sqrt(73)/8, 1, [Matrix([[Rational(-3, 8) + sqrt(73)/8], [1]])])] |
|
|
|
|
|
assert Matrix([]).eigenvals() == {} |
|
assert Matrix([]).eigenvals(multiple=True) == [] |
|
assert Matrix([]).eigenvects() == [] |
|
|
|
|
|
raises(NonSquareMatrixError, |
|
lambda: Matrix([[1, 2], [0, 4], [0, 0]]).eigenvals()) |
|
raises(NonSquareMatrixError, |
|
lambda: Matrix([[1, 0], [3, 4], [5, 6]]).eigenvals()) |
|
raises(NonSquareMatrixError, |
|
lambda: Matrix([[1, 2, 3], [0, 5, 6]]).eigenvals()) |
|
raises(NonSquareMatrixError, |
|
lambda: Matrix([[1, 0, 0], [4, 5, 0]]).eigenvals()) |
|
raises(NonSquareMatrixError, |
|
lambda: Matrix([[1, 2, 3], [0, 5, 6]]).eigenvals( |
|
error_when_incomplete = False)) |
|
raises(NonSquareMatrixError, |
|
lambda: Matrix([[1, 0, 0], [4, 5, 0]]).eigenvals( |
|
error_when_incomplete = False)) |
|
|
|
m = Matrix([[1, 2], [3, 4]]) |
|
assert isinstance(m.eigenvals(simplify=True, multiple=False), dict) |
|
assert isinstance(m.eigenvals(simplify=True, multiple=True), list) |
|
assert isinstance(m.eigenvals(simplify=lambda x: x, multiple=False), dict) |
|
assert isinstance(m.eigenvals(simplify=lambda x: x, multiple=True), list) |
|
|
|
|
|
def test_float_eigenvals(): |
|
m = Matrix([[1, .6, .6], [.6, .9, .9], [.9, .6, .6]]) |
|
evals = [ |
|
Rational(5, 4) - sqrt(385)/20, |
|
sqrt(385)/20 + Rational(5, 4), |
|
S.Zero] |
|
|
|
n_evals = m.eigenvals(rational=True, multiple=True) |
|
n_evals = sorted(n_evals) |
|
s_evals = [x.evalf() for x in evals] |
|
s_evals = sorted(s_evals) |
|
|
|
for x, y in zip(n_evals, s_evals): |
|
assert abs(x-y) < 10**-9 |
|
|
|
|
|
@XFAIL |
|
def test_eigen_vects(): |
|
m = Matrix(2, 2, [1, 0, 0, I]) |
|
raises(NotImplementedError, lambda: m.is_diagonalizable(True)) |
|
|
|
|
|
assert not m.is_diagonalizable(True) |
|
raises(MatrixError, lambda: m.diagonalize(True)) |
|
(P, D) = m.diagonalize(True) |
|
|
|
def test_issue_8240(): |
|
|
|
x, y = symbols('x y') |
|
n = 200 |
|
|
|
diagonal_variables = [Symbol('x%s' % i) for i in range(n)] |
|
M = [[0 for i in range(n)] for j in range(n)] |
|
for i in range(n): |
|
M[i][i] = diagonal_variables[i] |
|
M = Matrix(M) |
|
|
|
eigenvals = M.eigenvals() |
|
assert len(eigenvals) == n |
|
for i in range(n): |
|
assert eigenvals[diagonal_variables[i]] == 1 |
|
|
|
eigenvals = M.eigenvals(multiple=True) |
|
assert set(eigenvals) == set(diagonal_variables) |
|
|
|
|
|
M = Matrix([[x, 0, 0], [1, y, 0], [2, 3, x]]) |
|
eigenvals = M.eigenvals() |
|
assert eigenvals == {x: 2, y: 1} |
|
|
|
eigenvals = M.eigenvals(multiple=True) |
|
assert len(eigenvals) == 3 |
|
assert eigenvals.count(x) == 2 |
|
assert eigenvals.count(y) == 1 |
|
|
|
|
|
def test_eigenvals(): |
|
M = Matrix([[0, 1, 1], |
|
[1, 0, 0], |
|
[1, 1, 1]]) |
|
assert M.eigenvals() == {2*S.One: 1, -S.One: 1, S.Zero: 1} |
|
|
|
m = Matrix([ |
|
[3, 0, 0, 0, -3], |
|
[0, -3, -3, 0, 3], |
|
[0, 3, 0, 3, 0], |
|
[0, 0, 3, 0, 3], |
|
[3, 0, 0, 3, 0]]) |
|
|
|
|
|
|
|
assert m.eigenvals() |
|
|
|
|
|
def test_eigenvects(): |
|
M = Matrix([[0, 1, 1], |
|
[1, 0, 0], |
|
[1, 1, 1]]) |
|
vecs = M.eigenvects() |
|
for val, mult, vec_list in vecs: |
|
assert len(vec_list) == 1 |
|
assert M*vec_list[0] == val*vec_list[0] |
|
|
|
|
|
def test_left_eigenvects(): |
|
M = Matrix([[0, 1, 1], |
|
[1, 0, 0], |
|
[1, 1, 1]]) |
|
vecs = M.left_eigenvects() |
|
for val, mult, vec_list in vecs: |
|
assert len(vec_list) == 1 |
|
assert vec_list[0]*M == val*vec_list[0] |
|
|
|
|
|
@slow |
|
def test_bidiagonalize(): |
|
M = Matrix([[1, 0, 0], |
|
[0, 1, 0], |
|
[0, 0, 1]]) |
|
assert M.bidiagonalize() == M |
|
assert M.bidiagonalize(upper=False) == M |
|
assert M.bidiagonalize() == M |
|
assert M.bidiagonal_decomposition() == (M, M, M) |
|
assert M.bidiagonal_decomposition(upper=False) == (M, M, M) |
|
assert M.bidiagonalize() == M |
|
|
|
import random |
|
|
|
for real_test in range(2): |
|
test_values = [] |
|
row = 2 |
|
col = 2 |
|
for _ in range(row * col): |
|
value = random.randint(-1000000000, 1000000000) |
|
test_values = test_values + [value] |
|
|
|
|
|
|
|
|
|
|
|
|
|
M = Matrix(row, col, test_values) |
|
N = ImmutableMatrix(M) |
|
|
|
N1, N2, N3 = N.bidiagonal_decomposition() |
|
M1, M2, M3 = M.bidiagonal_decomposition() |
|
M0 = M.bidiagonalize() |
|
N0 = N.bidiagonalize() |
|
|
|
N4 = N1 * N2 * N3 |
|
M4 = M1 * M2 * M3 |
|
|
|
N2.simplify() |
|
N4.simplify() |
|
N0.simplify() |
|
|
|
M0.simplify() |
|
M2.simplify() |
|
M4.simplify() |
|
|
|
LM0 = M.bidiagonalize(upper=False) |
|
LM1, LM2, LM3 = M.bidiagonal_decomposition(upper=False) |
|
LN0 = N.bidiagonalize(upper=False) |
|
LN1, LN2, LN3 = N.bidiagonal_decomposition(upper=False) |
|
|
|
LN4 = LN1 * LN2 * LN3 |
|
LM4 = LM1 * LM2 * LM3 |
|
|
|
LN2.simplify() |
|
LN4.simplify() |
|
LN0.simplify() |
|
|
|
LM0.simplify() |
|
LM2.simplify() |
|
LM4.simplify() |
|
|
|
assert M == M4 |
|
assert M2 == M0 |
|
assert N == N4 |
|
assert N2 == N0 |
|
assert M == LM4 |
|
assert LM2 == LM0 |
|
assert N == LN4 |
|
assert LN2 == LN0 |
|
|
|
|
|
for complex_test in range(2): |
|
test_values = [] |
|
size = 2 |
|
for _ in range(size * size): |
|
real = random.randint(-1000000000, 1000000000) |
|
comp = random.randint(-1000000000, 1000000000) |
|
value = real + comp * I |
|
test_values = test_values + [value] |
|
M = Matrix(size, size, test_values) |
|
N = ImmutableMatrix(M) |
|
|
|
|
|
|
|
|
|
|
|
|
|
N1, N2, N3 = N.bidiagonal_decomposition() |
|
M1, M2, M3 = M.bidiagonal_decomposition() |
|
M0 = M.bidiagonalize() |
|
N0 = N.bidiagonalize() |
|
|
|
N4 = N1 * N2 * N3 |
|
M4 = M1 * M2 * M3 |
|
|
|
N2.simplify() |
|
N4.simplify() |
|
N0.simplify() |
|
|
|
M0.simplify() |
|
M2.simplify() |
|
M4.simplify() |
|
|
|
LM0 = M.bidiagonalize(upper=False) |
|
LM1, LM2, LM3 = M.bidiagonal_decomposition(upper=False) |
|
LN0 = N.bidiagonalize(upper=False) |
|
LN1, LN2, LN3 = N.bidiagonal_decomposition(upper=False) |
|
|
|
LN4 = LN1 * LN2 * LN3 |
|
LM4 = LM1 * LM2 * LM3 |
|
|
|
LN2.simplify() |
|
LN4.simplify() |
|
LN0.simplify() |
|
|
|
LM0.simplify() |
|
LM2.simplify() |
|
LM4.simplify() |
|
|
|
assert M == M4 |
|
assert M2 == M0 |
|
assert N == N4 |
|
assert N2 == N0 |
|
assert M == LM4 |
|
assert LM2 == LM0 |
|
assert N == LN4 |
|
assert LN2 == LN0 |
|
|
|
M = Matrix(18, 8, range(1, 145)) |
|
M = M.applyfunc(lambda i: Float(i)) |
|
assert M.bidiagonal_decomposition()[1] == M.bidiagonalize() |
|
assert M.bidiagonal_decomposition(upper=False)[1] == M.bidiagonalize(upper=False) |
|
a, b, c = M.bidiagonal_decomposition() |
|
diff = a * b * c - M |
|
assert abs(max(diff)) < 10**-12 |
|
|
|
|
|
def test_diagonalize(): |
|
m = Matrix(2, 2, [0, -1, 1, 0]) |
|
raises(MatrixError, lambda: m.diagonalize(reals_only=True)) |
|
P, D = m.diagonalize() |
|
assert D.is_diagonal() |
|
assert D == Matrix([ |
|
[-I, 0], |
|
[ 0, I]]) |
|
|
|
|
|
m = Matrix(2, 2, [0, .5, .5, 0]) |
|
P, D = m.diagonalize() |
|
assert all(isinstance(e, Float) for e in D.values()) |
|
assert all(isinstance(e, Float) for e in P.values()) |
|
|
|
_, D2 = m.diagonalize(reals_only=True) |
|
assert D == D2 |
|
|
|
m = Matrix( |
|
[[0, 1, 0, 0], [1, 0, 0, 0.002], [0.002, 0, 0, 1], [0, 0, 1, 0]]) |
|
P, D = m.diagonalize() |
|
assert allclose(P*D, m*P) |
|
|
|
|
|
def test_is_diagonalizable(): |
|
a, b, c = symbols('a b c') |
|
m = Matrix(2, 2, [a, c, c, b]) |
|
assert m.is_symmetric() |
|
assert m.is_diagonalizable() |
|
assert not Matrix(2, 2, [1, 1, 0, 1]).is_diagonalizable() |
|
|
|
m = Matrix(2, 2, [0, -1, 1, 0]) |
|
assert m.is_diagonalizable() |
|
assert not m.is_diagonalizable(reals_only=True) |
|
|
|
|
|
def test_jordan_form(): |
|
m = Matrix(3, 2, [-3, 1, -3, 20, 3, 10]) |
|
raises(NonSquareMatrixError, lambda: m.jordan_form()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
m = Matrix(4, 4, [2, 1, 0, 0, |
|
0, 2, 1, 0, |
|
0, 0, 2, 0, |
|
0, 0, 0, 2 |
|
]) |
|
P, J = m.jordan_form() |
|
assert m == J |
|
|
|
m = Matrix(4, 4, [2, 1, 0, 0, |
|
0, 2, 0, 0, |
|
0, 0, 2, 1, |
|
0, 0, 0, 2 |
|
]) |
|
P, J = m.jordan_form() |
|
assert m == J |
|
|
|
A = Matrix([[ 2, 4, 1, 0], |
|
[-4, 2, 0, 1], |
|
[ 0, 0, 2, 4], |
|
[ 0, 0, -4, 2]]) |
|
P, J = A.jordan_form() |
|
assert simplify(P*J*P.inv()) == A |
|
|
|
assert Matrix(1, 1, [1]).jordan_form() == (Matrix([1]), Matrix([1])) |
|
assert Matrix(1, 1, [1]).jordan_form(calc_transform=False) == Matrix([1]) |
|
|
|
|
|
m = Matrix([[3, 0, 0, 0, -3], [0, -3, -3, 0, 3], [0, 3, 0, 3, 0], [0, 0, 3, 0, 3], [3, 0, 0, 3, 0]]) |
|
raises(MatrixError, lambda: m.jordan_form()) |
|
|
|
|
|
m = Matrix([ |
|
[ 0.6875, 0.125 + 0.1875*sqrt(3)], |
|
[0.125 + 0.1875*sqrt(3), 0.3125]]) |
|
P, J = m.jordan_form() |
|
assert all(isinstance(x, Float) or x == 0 for x in P) |
|
assert all(isinstance(x, Float) or x == 0 for x in J) |
|
|
|
|
|
def test_singular_values(): |
|
x = Symbol('x', real=True) |
|
|
|
A = Matrix([[0, 1*I], [2, 0]]) |
|
|
|
assert A.singular_values() == [2, 1] |
|
|
|
A = eye(3) |
|
A[1, 1] = x |
|
A[2, 2] = 5 |
|
vals = A.singular_values() |
|
|
|
assert set(vals) == {5, 1, Abs(x)} |
|
|
|
A = Matrix([[sin(x), cos(x)], [-cos(x), sin(x)]]) |
|
vals = [sv.trigsimp() for sv in A.singular_values()] |
|
assert vals == [S.One, S.One] |
|
|
|
A = Matrix([ |
|
[2, 4], |
|
[1, 3], |
|
[0, 0], |
|
[0, 0] |
|
]) |
|
assert A.singular_values() == \ |
|
[sqrt(sqrt(221) + 15), sqrt(15 - sqrt(221))] |
|
assert A.T.singular_values() == \ |
|
[sqrt(sqrt(221) + 15), sqrt(15 - sqrt(221)), 0, 0] |
|
|
|
def test___eq__(): |
|
assert (Matrix( |
|
[[0, 1, 1], |
|
[1, 0, 0], |
|
[1, 1, 1]]) == {}) is False |
|
|
|
|
|
def test_definite(): |
|
|
|
|
|
m = Matrix([[2, -1, 0], [-1, 2, -1], [0, -1, 2]]) |
|
assert m.is_positive_definite == True |
|
assert m.is_positive_semidefinite == True |
|
assert m.is_negative_definite == False |
|
assert m.is_negative_semidefinite == False |
|
assert m.is_indefinite == False |
|
|
|
m = Matrix([[5, 4], [4, 5]]) |
|
assert m.is_positive_definite == True |
|
assert m.is_positive_semidefinite == True |
|
assert m.is_negative_definite == False |
|
assert m.is_negative_semidefinite == False |
|
assert m.is_indefinite == False |
|
|
|
|
|
m = Matrix([[2, -1, -1], [-1, 2, -1], [-1, -1, 2]]) |
|
assert m.is_positive_definite == False |
|
assert m.is_positive_semidefinite == True |
|
assert m.is_negative_definite == False |
|
assert m.is_negative_semidefinite == False |
|
assert m.is_indefinite == False |
|
|
|
m = Matrix([[1, 2], [2, 4]]) |
|
assert m.is_positive_definite == False |
|
assert m.is_positive_semidefinite == True |
|
assert m.is_negative_definite == False |
|
assert m.is_negative_semidefinite == False |
|
assert m.is_indefinite == False |
|
|
|
|
|
|
|
m = Matrix([[2, 3], [4, 8]]) |
|
assert m.is_positive_definite == True |
|
assert m.is_positive_semidefinite == True |
|
assert m.is_negative_definite == False |
|
assert m.is_negative_semidefinite == False |
|
assert m.is_indefinite == False |
|
|
|
|
|
m = Matrix([[1, 2*I], [-I, 4]]) |
|
assert m.is_positive_definite == True |
|
assert m.is_positive_semidefinite == True |
|
assert m.is_negative_definite == False |
|
assert m.is_negative_semidefinite == False |
|
assert m.is_indefinite == False |
|
|
|
|
|
a = Symbol('a', positive=True) |
|
b = Symbol('b', negative=True) |
|
m = Matrix([[a, 0, 0], [0, a, 0], [0, 0, a]]) |
|
assert m.is_positive_definite == True |
|
assert m.is_positive_semidefinite == True |
|
assert m.is_negative_definite == False |
|
assert m.is_negative_semidefinite == False |
|
assert m.is_indefinite == False |
|
|
|
m = Matrix([[b, 0, 0], [0, b, 0], [0, 0, b]]) |
|
assert m.is_positive_definite == False |
|
assert m.is_positive_semidefinite == False |
|
assert m.is_negative_definite == True |
|
assert m.is_negative_semidefinite == True |
|
assert m.is_indefinite == False |
|
|
|
m = Matrix([[a, 0], [0, b]]) |
|
assert m.is_positive_definite == False |
|
assert m.is_positive_semidefinite == False |
|
assert m.is_negative_definite == False |
|
assert m.is_negative_semidefinite == False |
|
assert m.is_indefinite == True |
|
|
|
m = Matrix([ |
|
[0.0228202735623867, 0.00518748979085398, |
|
-0.0743036351048907, -0.00709135324903921], |
|
[0.00518748979085398, 0.0349045359786350, |
|
0.0830317991056637, 0.00233147902806909], |
|
[-0.0743036351048907, 0.0830317991056637, |
|
1.15859676366277, 0.340359081555988], |
|
[-0.00709135324903921, 0.00233147902806909, |
|
0.340359081555988, 0.928147644848199] |
|
]) |
|
assert m.is_positive_definite == True |
|
assert m.is_positive_semidefinite == True |
|
assert m.is_indefinite == False |
|
|
|
|
|
m = Matrix([ |
|
[0, 0, 0], |
|
[0, 1, 2], |
|
[0, 2, 1] |
|
]) |
|
assert not m.is_positive_definite |
|
assert not m.is_positive_semidefinite |
|
|
|
|
|
def test_positive_semidefinite_cholesky(): |
|
from sympy.matrices.eigen import _is_positive_semidefinite_cholesky |
|
|
|
m = Matrix([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) |
|
assert _is_positive_semidefinite_cholesky(m) == True |
|
m = Matrix([[0, 0, 0], [0, 5, -10*I], [0, 10*I, 5]]) |
|
assert _is_positive_semidefinite_cholesky(m) == False |
|
m = Matrix([[1, 0, 0], [0, 0, 0], [0, 0, -1]]) |
|
assert _is_positive_semidefinite_cholesky(m) == False |
|
m = Matrix([[0, 1], [1, 0]]) |
|
assert _is_positive_semidefinite_cholesky(m) == False |
|
|
|
|
|
m = Matrix([[4, -2, -6], [-2, 10, 9], [-6, 9, 14]]) |
|
assert _is_positive_semidefinite_cholesky(m) == True |
|
m = Matrix([[9, -3, 3], [-3, 2, 1], [3, 1, 6]]) |
|
assert _is_positive_semidefinite_cholesky(m) == True |
|
m = Matrix([[4, -2, 2], [-2, 1, -1], [2, -1, 5]]) |
|
assert _is_positive_semidefinite_cholesky(m) == True |
|
m = Matrix([[1, 2, -1], [2, 5, 1], [-1, 1, 9]]) |
|
assert _is_positive_semidefinite_cholesky(m) == False |
|
|
|
|
|
def test_issue_20582(): |
|
A = Matrix([ |
|
[5, -5, -3, 2, -7], |
|
[-2, -5, 0, 2, 1], |
|
[-2, -7, -5, -2, -6], |
|
[7, 10, 3, 9, -2], |
|
[4, -10, 3, -8, -4] |
|
]) |
|
|
|
|
|
assert A.eigenvects() |
|
|
|
def test_issue_19210(): |
|
t = Symbol('t') |
|
H = Matrix([[3, 0, 0, 0], [0, 1 , 2, 0], [0, 2, 2, 0], [0, 0, 0, 4]]) |
|
A = (-I * H * t).jordan_form() |
|
assert A == (Matrix([ |
|
[0, 1, 0, 0], |
|
[0, 0, -4/(-1 + sqrt(17)), 4/(1 + sqrt(17))], |
|
[0, 0, 1, 1], |
|
[1, 0, 0, 0]]), Matrix([ |
|
[-4*I*t, 0, 0, 0], |
|
[ 0, -3*I*t, 0, 0], |
|
[ 0, 0, t*(-3*I/2 + sqrt(17)*I/2), 0], |
|
[ 0, 0, 0, t*(-sqrt(17)*I/2 - 3*I/2)]])) |
|
|
|
|
|
def test_issue_20275(): |
|
|
|
|
|
A = DFT(3).as_explicit().expand(complex=True) |
|
eigenvects = A.eigenvects() |
|
assert eigenvects[0] == ( |
|
-1, 1, |
|
[Matrix([[1 - sqrt(3)], [1], [1]])] |
|
) |
|
assert eigenvects[1] == ( |
|
1, 1, |
|
[Matrix([[1 + sqrt(3)], [1], [1]])] |
|
) |
|
assert eigenvects[2] == ( |
|
-I, 1, |
|
[Matrix([[0], [-1], [1]])] |
|
) |
|
|
|
A = DFT(4).as_explicit().expand(complex=True) |
|
eigenvects = A.eigenvects() |
|
assert eigenvects[0] == ( |
|
-1, 1, |
|
[Matrix([[-1], [1], [1], [1]])] |
|
) |
|
assert eigenvects[1] == ( |
|
1, 2, |
|
[Matrix([[1], [0], [1], [0]]), Matrix([[2], [1], [0], [1]])] |
|
) |
|
assert eigenvects[2] == ( |
|
-I, 1, |
|
[Matrix([[0], [-1], [0], [1]])] |
|
) |
|
|
|
|
|
|
|
A = DFT(5).as_explicit().expand(complex=True) |
|
eigenvects = A.eigenvects() |
|
assert eigenvects[0] == ( |
|
-1, 1, |
|
[Matrix([[1 - sqrt(5)], [1], [1], [1], [1]])] |
|
) |
|
assert eigenvects[1] == ( |
|
1, 2, |
|
[Matrix([[S(1)/2 + sqrt(5)/2], [0], [1], [1], [0]]), |
|
Matrix([[S(1)/2 + sqrt(5)/2], [1], [0], [0], [1]])] |
|
) |
|
|
|
|
|
def test_issue_20752(): |
|
b = symbols('b', nonzero=True) |
|
m = Matrix([[0, 0, 0], [0, b, 0], [0, 0, b]]) |
|
assert m.is_positive_semidefinite is None |
|
|
|
|
|
def test_issue_25282(): |
|
dd = sd = [0] * 11 + [1] |
|
ds = [2, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0] |
|
ss = ds.copy() |
|
ss[8] = 2 |
|
|
|
def rotate(x, i): |
|
return x[i:] + x[:i] |
|
|
|
mat = [] |
|
for i in range(12): |
|
mat.append(rotate(ss, i) + rotate(sd, i)) |
|
for i in range(12): |
|
mat.append(rotate(ds, i) + rotate(dd, i)) |
|
|
|
assert sum(Matrix(mat).eigenvals().values()) == 24 |
|
|