test_dyadic.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. from sympy.core.numbers import pi
  2. from sympy.core.symbol import symbols
  3. from sympy.functions.elementary.trigonometric import (cos, sin)
  4. from sympy.matrices.immutable import ImmutableDenseMatrix as Matrix
  5. from sympy.simplify.simplify import simplify
  6. from sympy.vector import (CoordSys3D, Vector, Dyadic,
  7. DyadicAdd, DyadicMul, DyadicZero,
  8. BaseDyadic, express)
  9. A = CoordSys3D('A')
  10. def test_dyadic():
  11. a, b = symbols('a, b')
  12. assert Dyadic.zero != 0
  13. assert isinstance(Dyadic.zero, DyadicZero)
  14. assert BaseDyadic(A.i, A.j) != BaseDyadic(A.j, A.i)
  15. assert (BaseDyadic(Vector.zero, A.i) ==
  16. BaseDyadic(A.i, Vector.zero) == Dyadic.zero)
  17. d1 = A.i | A.i
  18. d2 = A.j | A.j
  19. d3 = A.i | A.j
  20. assert isinstance(d1, BaseDyadic)
  21. d_mul = a*d1
  22. assert isinstance(d_mul, DyadicMul)
  23. assert d_mul.base_dyadic == d1
  24. assert d_mul.measure_number == a
  25. assert isinstance(a*d1 + b*d3, DyadicAdd)
  26. assert d1 == A.i.outer(A.i)
  27. assert d3 == A.i.outer(A.j)
  28. v1 = a*A.i - A.k
  29. v2 = A.i + b*A.j
  30. assert v1 | v2 == v1.outer(v2) == a * (A.i|A.i) + (a*b) * (A.i|A.j) +\
  31. - (A.k|A.i) - b * (A.k|A.j)
  32. assert d1 * 0 == Dyadic.zero
  33. assert d1 != Dyadic.zero
  34. assert d1 * 2 == 2 * (A.i | A.i)
  35. assert d1 / 2. == 0.5 * d1
  36. assert d1.dot(0 * d1) == Vector.zero
  37. assert d1 & d2 == Dyadic.zero
  38. assert d1.dot(A.i) == A.i == d1 & A.i
  39. assert d1.cross(Vector.zero) == Dyadic.zero
  40. assert d1.cross(A.i) == Dyadic.zero
  41. assert d1 ^ A.j == d1.cross(A.j)
  42. assert d1.cross(A.k) == - A.i | A.j
  43. assert d2.cross(A.i) == - A.j | A.k == d2 ^ A.i
  44. assert A.i ^ d1 == Dyadic.zero
  45. assert A.j.cross(d1) == - A.k | A.i == A.j ^ d1
  46. assert Vector.zero.cross(d1) == Dyadic.zero
  47. assert A.k ^ d1 == A.j | A.i
  48. assert A.i.dot(d1) == A.i & d1 == A.i
  49. assert A.j.dot(d1) == Vector.zero
  50. assert Vector.zero.dot(d1) == Vector.zero
  51. assert A.j & d2 == A.j
  52. assert d1.dot(d3) == d1 & d3 == A.i | A.j == d3
  53. assert d3 & d1 == Dyadic.zero
  54. q = symbols('q')
  55. B = A.orient_new_axis('B', q, A.k)
  56. assert express(d1, B) == express(d1, B, B)
  57. expr1 = ((cos(q)**2) * (B.i | B.i) + (-sin(q) * cos(q)) *
  58. (B.i | B.j) + (-sin(q) * cos(q)) * (B.j | B.i) + (sin(q)**2) *
  59. (B.j | B.j))
  60. assert (express(d1, B) - expr1).simplify() == Dyadic.zero
  61. expr2 = (cos(q)) * (B.i | A.i) + (-sin(q)) * (B.j | A.i)
  62. assert (express(d1, B, A) - expr2).simplify() == Dyadic.zero
  63. expr3 = (cos(q)) * (A.i | B.i) + (-sin(q)) * (A.i | B.j)
  64. assert (express(d1, A, B) - expr3).simplify() == Dyadic.zero
  65. assert d1.to_matrix(A) == Matrix([[1, 0, 0], [0, 0, 0], [0, 0, 0]])
  66. assert d1.to_matrix(A, B) == Matrix([[cos(q), -sin(q), 0],
  67. [0, 0, 0],
  68. [0, 0, 0]])
  69. assert d3.to_matrix(A) == Matrix([[0, 1, 0], [0, 0, 0], [0, 0, 0]])
  70. a, b, c, d, e, f = symbols('a, b, c, d, e, f')
  71. v1 = a * A.i + b * A.j + c * A.k
  72. v2 = d * A.i + e * A.j + f * A.k
  73. d4 = v1.outer(v2)
  74. assert d4.to_matrix(A) == Matrix([[a * d, a * e, a * f],
  75. [b * d, b * e, b * f],
  76. [c * d, c * e, c * f]])
  77. d5 = v1.outer(v1)
  78. C = A.orient_new_axis('C', q, A.i)
  79. for expected, actual in zip(C.rotation_matrix(A) * d5.to_matrix(A) * \
  80. C.rotation_matrix(A).T, d5.to_matrix(C)):
  81. assert (expected - actual).simplify() == 0
  82. def test_dyadic_simplify():
  83. x, y, z, k, n, m, w, f, s, A = symbols('x, y, z, k, n, m, w, f, s, A')
  84. N = CoordSys3D('N')
  85. dy = N.i | N.i
  86. test1 = (1 / x + 1 / y) * dy
  87. assert (N.i & test1 & N.i) != (x + y) / (x * y)
  88. test1 = test1.simplify()
  89. assert test1.simplify() == simplify(test1)
  90. assert (N.i & test1 & N.i) == (x + y) / (x * y)
  91. test2 = (A**2 * s**4 / (4 * pi * k * m**3)) * dy
  92. test2 = test2.simplify()
  93. assert (N.i & test2 & N.i) == (A**2 * s**4 / (4 * pi * k * m**3))
  94. test3 = ((4 + 4 * x - 2 * (2 + 2 * x)) / (2 + 2 * x)) * dy
  95. test3 = test3.simplify()
  96. assert (N.i & test3 & N.i) == 0
  97. test4 = ((-4 * x * y**2 - 2 * y**3 - 2 * x**2 * y) / (x + y)**2) * dy
  98. test4 = test4.simplify()
  99. assert (N.i & test4 & N.i) == -2 * y
  100. def test_dyadic_srepr():
  101. from sympy.printing.repr import srepr
  102. N = CoordSys3D('N')
  103. dy = N.i | N.j
  104. res = "BaseDyadic(CoordSys3D(Str('N'), Tuple(ImmutableDenseMatrix([["\
  105. "Integer(1), Integer(0), Integer(0)], [Integer(0), Integer(1), "\
  106. "Integer(0)], [Integer(0), Integer(0), Integer(1)]]), "\
  107. "VectorZero())).i, CoordSys3D(Str('N'), Tuple(ImmutableDenseMatrix("\
  108. "[[Integer(1), Integer(0), Integer(0)], [Integer(0), Integer(1), "\
  109. "Integer(0)], [Integer(0), Integer(0), Integer(1)]]), VectorZero())).j)"
  110. assert srepr(dy) == res