def test_dyadic_xreplace(): x, y, z = symbols('x y z') N = ReferenceFrame('N') D = outer(N.x, N.x) v = x*y * D assert v.xreplace({x : cos(x)}) == cos(x)*y * D assert v.xreplace({x*y : pi}) == pi * D v = (x*y)**z * D assert v.xreplace({(x*y)**z : 1}) == D assert v.xreplace({x:1, z:0}) == D raises(TypeError, lambda: v.xreplace()) raises(TypeError, lambda: v.xreplace([x, y]))
def test_operator_match(): """Test that the output of dot, cross, outer functions match operator behavior. """ A = ReferenceFrame('A') v = A.x + A.y d = v | v zerov = Vector(0) zerod = Dyadic(0) # dot products assert d & d == dot(d, d) assert d & zerod == dot(d, zerod) assert zerod & d == dot(zerod, d) assert d & v == dot(d, v) assert v & d == dot(v, d) assert d & zerov == dot(d, zerov) assert zerov & d == dot(zerov, d) raises(TypeError, lambda: dot(d, S(0))) raises(TypeError, lambda: dot(S(0), d)) raises(TypeError, lambda: dot(d, 0)) raises(TypeError, lambda: dot(0, d)) assert v & v == dot(v, v) assert v & zerov == dot(v, zerov) assert zerov & v == dot(zerov, v) raises(TypeError, lambda: dot(v, S(0))) raises(TypeError, lambda: dot(S(0), v)) raises(TypeError, lambda: dot(v, 0)) raises(TypeError, lambda: dot(0, v)) # cross products raises(TypeError, lambda: cross(d, d)) raises(TypeError, lambda: cross(d, zerod)) raises(TypeError, lambda: cross(zerod, d)) assert d ^ v == cross(d, v) assert v ^ d == cross(v, d) assert d ^ zerov == cross(d, zerov) assert zerov ^ d == cross(zerov, d) assert zerov ^ d == cross(zerov, d) raises(TypeError, lambda: cross(d, S(0))) raises(TypeError, lambda: cross(S(0), d)) raises(TypeError, lambda: cross(d, 0)) raises(TypeError, lambda: cross(0, d)) assert v ^ v == cross(v, v) assert v ^ zerov == cross(v, zerov) assert zerov ^ v == cross(zerov, v) raises(TypeError, lambda: cross(v, S(0))) raises(TypeError, lambda: cross(S(0), v)) raises(TypeError, lambda: cross(v, 0)) raises(TypeError, lambda: cross(0, v)) # outer products raises(TypeError, lambda: outer(d, d)) raises(TypeError, lambda: outer(d, zerod)) raises(TypeError, lambda: outer(zerod, d)) raises(TypeError, lambda: outer(d, v)) raises(TypeError, lambda: outer(v, d)) raises(TypeError, lambda: outer(d, zerov)) raises(TypeError, lambda: outer(zerov, d)) raises(TypeError, lambda: outer(zerov, d)) raises(TypeError, lambda: outer(d, S(0))) raises(TypeError, lambda: outer(S(0), d)) raises(TypeError, lambda: outer(d, 0)) raises(TypeError, lambda: outer(0, d)) assert v | v == outer(v, v) assert v | zerov == outer(v, zerov) assert zerov | v == outer(zerov, v) raises(TypeError, lambda: outer(v, S(0))) raises(TypeError, lambda: outer(S(0), v)) raises(TypeError, lambda: outer(v, 0)) raises(TypeError, lambda: outer(0, v))
==================== In constructing a dyad product from two vectors, we form the term-by-term product of each of their individual components and add. The result is a dyad (rank 2 tensor) U = u1.i + u2.j + u3.k V = v1.i + v2.j + v3.k UV = u1.v1.ii + u1.v2.ij + u1.v3.ik + u2.v1.ji + ··· Note that the dyad product is neither a dot nor a cross product. """ from sympy.physics.vector import vprint, ReferenceFrame, outer, cross from sympy import symbols N = ReferenceFrame('N') a, b, c, d, e, f = symbols('a b c d e f') U = a * N.x + b * N.y + c * N.z V = d * N.x + e * N.y + f * N.z # Dyad product of vectors U and V d = outer(U, V) vprint(d) # Matrix of scalar components of the dyad product vprint(d.to_matrix(N))