test_subspaces.py 3.4 KB

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