test_subspaces.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from sympy.matrices.common import _MinimalMatrix, _CastableMatrix
  2. from sympy.matrices.matrices import MatrixSubspaces
  3. from sympy.matrices import Matrix
  4. from sympy.core.numbers import Rational
  5. from sympy.core.symbol import symbols
  6. from sympy.solvers import solve
  7. class SubspaceOnlyMatrix(_MinimalMatrix, _CastableMatrix, MatrixSubspaces):
  8. pass
  9. # SubspaceOnlyMatrix tests
  10. def test_columnspace_one():
  11. m = SubspaceOnlyMatrix([[ 1, 2, 0, 2, 5],
  12. [-2, -5, 1, -1, -8],
  13. [ 0, -3, 3, 4, 1],
  14. [ 3, 6, 0, -7, 2]])
  15. basis = m.columnspace()
  16. assert basis[0] == Matrix([1, -2, 0, 3])
  17. assert basis[1] == Matrix([2, -5, -3, 6])
  18. assert basis[2] == Matrix([2, -1, 4, -7])
  19. assert len(basis) == 3
  20. assert Matrix.hstack(m, *basis).columnspace() == basis
  21. def test_rowspace():
  22. m = SubspaceOnlyMatrix([[ 1, 2, 0, 2, 5],
  23. [-2, -5, 1, -1, -8],
  24. [ 0, -3, 3, 4, 1],
  25. [ 3, 6, 0, -7, 2]])
  26. basis = m.rowspace()
  27. assert basis[0] == Matrix([[1, 2, 0, 2, 5]])
  28. assert basis[1] == Matrix([[0, -1, 1, 3, 2]])
  29. assert basis[2] == Matrix([[0, 0, 0, 5, 5]])
  30. assert len(basis) == 3
  31. def test_nullspace_one():
  32. m = SubspaceOnlyMatrix([[ 1, 2, 0, 2, 5],
  33. [-2, -5, 1, -1, -8],
  34. [ 0, -3, 3, 4, 1],
  35. [ 3, 6, 0, -7, 2]])
  36. basis = m.nullspace()
  37. assert basis[0] == Matrix([-2, 1, 1, 0, 0])
  38. assert basis[1] == Matrix([-1, -1, 0, -1, 1])
  39. # make sure the null space is really gets zeroed
  40. assert all(e.is_zero for e in m*basis[0])
  41. assert all(e.is_zero for e in m*basis[1])
  42. def test_nullspace_second():
  43. # first test reduced row-ech form
  44. R = Rational
  45. M = Matrix([[5, 7, 2, 1],
  46. [1, 6, 2, -1]])
  47. out, tmp = M.rref()
  48. assert out == Matrix([[1, 0, -R(2)/23, R(13)/23],
  49. [0, 1, R(8)/23, R(-6)/23]])
  50. M = Matrix([[-5, -1, 4, -3, -1],
  51. [ 1, -1, -1, 1, 0],
  52. [-1, 0, 0, 0, 0],
  53. [ 4, 1, -4, 3, 1],
  54. [-2, 0, 2, -2, -1]])
  55. assert M*M.nullspace()[0] == Matrix(5, 1, [0]*5)
  56. M = Matrix([[ 1, 3, 0, 2, 6, 3, 1],
  57. [-2, -6, 0, -2, -8, 3, 1],
  58. [ 3, 9, 0, 0, 6, 6, 2],
  59. [-1, -3, 0, 1, 0, 9, 3]])
  60. out, tmp = M.rref()
  61. assert out == Matrix([[1, 3, 0, 0, 2, 0, 0],
  62. [0, 0, 0, 1, 2, 0, 0],
  63. [0, 0, 0, 0, 0, 1, R(1)/3],
  64. [0, 0, 0, 0, 0, 0, 0]])
  65. # now check the vectors
  66. basis = M.nullspace()
  67. assert basis[0] == Matrix([-3, 1, 0, 0, 0, 0, 0])
  68. assert basis[1] == Matrix([0, 0, 1, 0, 0, 0, 0])
  69. assert basis[2] == Matrix([-2, 0, 0, -2, 1, 0, 0])
  70. assert basis[3] == Matrix([0, 0, 0, 0, 0, R(-1)/3, 1])
  71. # issue 4797; just see that we can do it when rows > cols
  72. M = Matrix([[1, 2], [2, 4], [3, 6]])
  73. assert M.nullspace()
  74. def test_columnspace_second():
  75. M = Matrix([[ 1, 2, 0, 2, 5],
  76. [-2, -5, 1, -1, -8],
  77. [ 0, -3, 3, 4, 1],
  78. [ 3, 6, 0, -7, 2]])
  79. # now check the vectors
  80. basis = M.columnspace()
  81. assert basis[0] == Matrix([1, -2, 0, 3])
  82. assert basis[1] == Matrix([2, -5, -3, 6])
  83. assert basis[2] == Matrix([2, -1, 4, -7])
  84. #check by columnspace definition
  85. a, b, c, d, e = symbols('a b c d e')
  86. X = Matrix([a, b, c, d, e])
  87. for i in range(len(basis)):
  88. eq=M*X-basis[i]
  89. assert len(solve(eq, X)) != 0
  90. #check if rank-nullity theorem holds
  91. assert M.rank() == len(basis)
  92. assert len(M.nullspace()) + len(M.columnspace()) == M.cols