test_dyadic.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from sympy.core.numbers import (Float, 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.physics.vector import ReferenceFrame, Vector, dynamicsymbols, outer
  6. from sympy.physics.vector.dyadic import _check_dyadic
  7. from sympy.testing.pytest import raises
  8. Vector.simp = True
  9. A = ReferenceFrame('A')
  10. def test_dyadic():
  11. d1 = A.x | A.x
  12. d2 = A.y | A.y
  13. d3 = A.x | A.y
  14. assert d1 * 0 == 0
  15. assert d1 != 0
  16. assert d1 * 2 == 2 * A.x | A.x
  17. assert d1 / 2. == 0.5 * d1
  18. assert d1 & (0 * d1) == 0
  19. assert d1 & d2 == 0
  20. assert d1 & A.x == A.x
  21. assert d1 ^ A.x == 0
  22. assert d1 ^ A.y == A.x | A.z
  23. assert d1 ^ A.z == - A.x | A.y
  24. assert d2 ^ A.x == - A.y | A.z
  25. assert A.x ^ d1 == 0
  26. assert A.y ^ d1 == - A.z | A.x
  27. assert A.z ^ d1 == A.y | A.x
  28. assert A.x & d1 == A.x
  29. assert A.y & d1 == 0
  30. assert A.y & d2 == A.y
  31. assert d1 & d3 == A.x | A.y
  32. assert d3 & d1 == 0
  33. assert d1.dt(A) == 0
  34. q = dynamicsymbols('q')
  35. qd = dynamicsymbols('q', 1)
  36. B = A.orientnew('B', 'Axis', [q, A.z])
  37. assert d1.express(B) == d1.express(B, B)
  38. assert d1.express(B) == ((cos(q)**2) * (B.x | B.x) + (-sin(q) * cos(q)) *
  39. (B.x | B.y) + (-sin(q) * cos(q)) * (B.y | B.x) + (sin(q)**2) *
  40. (B.y | B.y))
  41. assert d1.express(B, A) == (cos(q)) * (B.x | A.x) + (-sin(q)) * (B.y | A.x)
  42. assert d1.express(A, B) == (cos(q)) * (A.x | B.x) + (-sin(q)) * (A.x | B.y)
  43. assert d1.dt(B) == (-qd) * (A.y | A.x) + (-qd) * (A.x | A.y)
  44. assert d1.to_matrix(A) == Matrix([[1, 0, 0], [0, 0, 0], [0, 0, 0]])
  45. assert d1.to_matrix(A, B) == Matrix([[cos(q), -sin(q), 0],
  46. [0, 0, 0],
  47. [0, 0, 0]])
  48. assert d3.to_matrix(A) == Matrix([[0, 1, 0], [0, 0, 0], [0, 0, 0]])
  49. a, b, c, d, e, f = symbols('a, b, c, d, e, f')
  50. v1 = a * A.x + b * A.y + c * A.z
  51. v2 = d * A.x + e * A.y + f * A.z
  52. d4 = v1.outer(v2)
  53. assert d4.to_matrix(A) == Matrix([[a * d, a * e, a * f],
  54. [b * d, b * e, b * f],
  55. [c * d, c * e, c * f]])
  56. d5 = v1.outer(v1)
  57. C = A.orientnew('C', 'Axis', [q, A.x])
  58. for expected, actual in zip(C.dcm(A) * d5.to_matrix(A) * C.dcm(A).T,
  59. d5.to_matrix(C)):
  60. assert (expected - actual).simplify() == 0
  61. raises(TypeError, lambda: d1.applyfunc(0))
  62. def test_dyadic_simplify():
  63. x, y, z, k, n, m, w, f, s, A = symbols('x, y, z, k, n, m, w, f, s, A')
  64. N = ReferenceFrame('N')
  65. dy = N.x | N.x
  66. test1 = (1 / x + 1 / y) * dy
  67. assert (N.x & test1 & N.x) != (x + y) / (x * y)
  68. test1 = test1.simplify()
  69. assert (N.x & test1 & N.x) == (x + y) / (x * y)
  70. test2 = (A**2 * s**4 / (4 * pi * k * m**3)) * dy
  71. test2 = test2.simplify()
  72. assert (N.x & test2 & N.x) == (A**2 * s**4 / (4 * pi * k * m**3))
  73. test3 = ((4 + 4 * x - 2 * (2 + 2 * x)) / (2 + 2 * x)) * dy
  74. test3 = test3.simplify()
  75. assert (N.x & test3 & N.x) == 0
  76. test4 = ((-4 * x * y**2 - 2 * y**3 - 2 * x**2 * y) / (x + y)**2) * dy
  77. test4 = test4.simplify()
  78. assert (N.x & test4 & N.x) == -2 * y
  79. def test_dyadic_subs():
  80. N = ReferenceFrame('N')
  81. s = symbols('s')
  82. a = s*(N.x | N.x)
  83. assert a.subs({s: 2}) == 2*(N.x | N.x)
  84. def test_check_dyadic():
  85. raises(TypeError, lambda: _check_dyadic(0))
  86. def test_dyadic_evalf():
  87. N = ReferenceFrame('N')
  88. a = pi * (N.x | N.x)
  89. assert a.evalf(3) == Float('3.1416', 3) * (N.x | N.x)
  90. s = symbols('s')
  91. a = 5 * s * pi* (N.x | N.x)
  92. assert a.evalf(2) == Float('5', 2) * Float('3.1416', 2) * s * (N.x | N.x)
  93. assert a.evalf(9, subs={s: 5.124}) == Float('80.48760378', 9) * (N.x | N.x)
  94. def test_dyadic_xreplace():
  95. x, y, z = symbols('x y z')
  96. N = ReferenceFrame('N')
  97. D = outer(N.x, N.x)
  98. v = x*y * D
  99. assert v.xreplace({x : cos(x)}) == cos(x)*y * D
  100. assert v.xreplace({x*y : pi}) == pi * D
  101. v = (x*y)**z * D
  102. assert v.xreplace({(x*y)**z : 1}) == D
  103. assert v.xreplace({x:1, z:0}) == D
  104. raises(TypeError, lambda: v.xreplace())
  105. raises(TypeError, lambda: v.xreplace([x, y]))