123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- # -*- coding: utf-8 -*-
- from sympy.core.function import Function
- from sympy.core.symbol import symbols
- from sympy.functions.elementary.miscellaneous import sqrt
- from sympy.functions.elementary.trigonometric import (asin, cos, sin)
- from sympy.physics.vector import ReferenceFrame, dynamicsymbols, Dyadic
- from sympy.physics.vector.printing import (VectorLatexPrinter, vpprint,
- vsprint, vsstrrepr, vlatex)
- a, b, c = symbols('a, b, c')
- alpha, omega, beta = dynamicsymbols('alpha, omega, beta')
- A = ReferenceFrame('A')
- N = ReferenceFrame('N')
- v = a ** 2 * N.x + b * N.y + c * sin(alpha) * N.z
- w = alpha * N.x + sin(omega) * N.y + alpha * beta * N.z
- ww = alpha * N.x + asin(omega) * N.y - alpha.diff() * beta * N.z
- o = a/b * N.x + (c+b)/a * N.y + c**2/b * N.z
- y = a ** 2 * (N.x | N.y) + b * (N.y | N.y) + c * sin(alpha) * (N.z | N.y)
- x = alpha * (N.x | N.x) + sin(omega) * (N.y | N.z) + alpha * beta * (N.z | N.x)
- xx = N.x | (-N.y - N.z)
- xx2 = N.x | (N.y + N.z)
- def ascii_vpretty(expr):
- return vpprint(expr, use_unicode=False, wrap_line=False)
- def unicode_vpretty(expr):
- return vpprint(expr, use_unicode=True, wrap_line=False)
- def test_latex_printer():
- r = Function('r')('t')
- assert VectorLatexPrinter().doprint(r ** 2) == "r^{2}"
- r2 = Function('r^2')('t')
- assert VectorLatexPrinter().doprint(r2.diff()) == r'\dot{r^{2}}'
- ra = Function('r__a')('t')
- assert VectorLatexPrinter().doprint(ra.diff().diff()) == r'\ddot{r^{a}}'
- def test_vector_pretty_print():
- # TODO : The unit vectors should print with subscripts but they just
- # print as `n_x` instead of making `x` a subscript with unicode.
- # TODO : The pretty print division does not print correctly here:
- # w = alpha * N.x + sin(omega) * N.y + alpha / beta * N.z
- expected = """\
- 2
- a n_x + b n_y + c*sin(alpha) n_z\
- """
- uexpected = """\
- 2
- a n_x + b n_y + c⋅sin(α) n_z\
- """
- assert ascii_vpretty(v) == expected
- assert unicode_vpretty(v) == uexpected
- expected = 'alpha n_x + sin(omega) n_y + alpha*beta n_z'
- uexpected = 'α n_x + sin(ω) n_y + α⋅β n_z'
- assert ascii_vpretty(w) == expected
- assert unicode_vpretty(w) == uexpected
- expected = """\
- 2
- a b + c c
- - n_x + ----- n_y + -- n_z
- b a b\
- """
- uexpected = """\
- 2
- a b + c c
- ─ n_x + ───── n_y + ── n_z
- b a b\
- """
- assert ascii_vpretty(o) == expected
- assert unicode_vpretty(o) == uexpected
- def test_vector_latex():
- a, b, c, d, omega = symbols('a, b, c, d, omega')
- v = (a ** 2 + b / c) * A.x + sqrt(d) * A.y + cos(omega) * A.z
- assert vlatex(v) == (r'(a^{2} + \frac{b}{c})\mathbf{\hat{a}_x} + '
- r'\sqrt{d}\mathbf{\hat{a}_y} + '
- r'\cos{\left(\omega \right)}'
- r'\mathbf{\hat{a}_z}')
- theta, omega, alpha, q = dynamicsymbols('theta, omega, alpha, q')
- v = theta * A.x + omega * omega * A.y + (q * alpha) * A.z
- assert vlatex(v) == (r'\theta\mathbf{\hat{a}_x} + '
- r'\omega^{2}\mathbf{\hat{a}_y} + '
- r'\alpha q\mathbf{\hat{a}_z}')
- phi1, phi2, phi3 = dynamicsymbols('phi1, phi2, phi3')
- theta1, theta2, theta3 = symbols('theta1, theta2, theta3')
- v = (sin(theta1) * A.x +
- cos(phi1) * cos(phi2) * A.y +
- cos(theta1 + phi3) * A.z)
- assert vlatex(v) == (r'\sin{\left(\theta_{1} \right)}'
- r'\mathbf{\hat{a}_x} + \cos{'
- r'\left(\phi_{1} \right)} \cos{'
- r'\left(\phi_{2} \right)}\mathbf{\hat{a}_y} + '
- r'\cos{\left(\theta_{1} + '
- r'\phi_{3} \right)}\mathbf{\hat{a}_z}')
- N = ReferenceFrame('N')
- a, b, c, d, omega = symbols('a, b, c, d, omega')
- v = (a ** 2 + b / c) * N.x + sqrt(d) * N.y + cos(omega) * N.z
- expected = (r'(a^{2} + \frac{b}{c})\mathbf{\hat{n}_x} + '
- r'\sqrt{d}\mathbf{\hat{n}_y} + '
- r'\cos{\left(\omega \right)}'
- r'\mathbf{\hat{n}_z}')
- assert vlatex(v) == expected
- # Try custom unit vectors.
- N = ReferenceFrame('N', latexs=(r'\hat{i}', r'\hat{j}', r'\hat{k}'))
- v = (a ** 2 + b / c) * N.x + sqrt(d) * N.y + cos(omega) * N.z
- expected = (r'(a^{2} + \frac{b}{c})\hat{i} + '
- r'\sqrt{d}\hat{j} + '
- r'\cos{\left(\omega \right)}\hat{k}')
- assert vlatex(v) == expected
- expected = r'\alpha\mathbf{\hat{n}_x} + \operatorname{asin}{\left(\omega ' \
- r'\right)}\mathbf{\hat{n}_y} - \beta \dot{\alpha}\mathbf{\hat{n}_z}'
- assert vlatex(ww) == expected
- expected = r'- \mathbf{\hat{n}_x}\otimes \mathbf{\hat{n}_y} - ' \
- r'\mathbf{\hat{n}_x}\otimes \mathbf{\hat{n}_z}'
- assert vlatex(xx) == expected
- expected = r'\mathbf{\hat{n}_x}\otimes \mathbf{\hat{n}_y} + ' \
- r'\mathbf{\hat{n}_x}\otimes \mathbf{\hat{n}_z}'
- assert vlatex(xx2) == expected
- def test_vector_latex_arguments():
- assert vlatex(N.x * 3.0, full_prec=False) == r'3.0\mathbf{\hat{n}_x}'
- assert vlatex(N.x * 3.0, full_prec=True) == r'3.00000000000000\mathbf{\hat{n}_x}'
- def test_vector_latex_with_functions():
- N = ReferenceFrame('N')
- omega, alpha = dynamicsymbols('omega, alpha')
- v = omega.diff() * N.x
- assert vlatex(v) == r'\dot{\omega}\mathbf{\hat{n}_x}'
- v = omega.diff() ** alpha * N.x
- assert vlatex(v) == (r'\dot{\omega}^{\alpha}'
- r'\mathbf{\hat{n}_x}')
- def test_dyadic_pretty_print():
- expected = """\
- 2
- a n_x|n_y + b n_y|n_y + c*sin(alpha) n_z|n_y\
- """
- uexpected = """\
- 2
- a n_x⊗n_y + b n_y⊗n_y + c⋅sin(α) n_z⊗n_y\
- """
- assert ascii_vpretty(y) == expected
- assert unicode_vpretty(y) == uexpected
- expected = 'alpha n_x|n_x + sin(omega) n_y|n_z + alpha*beta n_z|n_x'
- uexpected = 'α n_x⊗n_x + sin(ω) n_y⊗n_z + α⋅β n_z⊗n_x'
- assert ascii_vpretty(x) == expected
- assert unicode_vpretty(x) == uexpected
- assert ascii_vpretty(Dyadic([])) == '0'
- assert unicode_vpretty(Dyadic([])) == '0'
- assert ascii_vpretty(xx) == '- n_x|n_y - n_x|n_z'
- assert unicode_vpretty(xx) == '- n_x⊗n_y - n_x⊗n_z'
- assert ascii_vpretty(xx2) == 'n_x|n_y + n_x|n_z'
- assert unicode_vpretty(xx2) == 'n_x⊗n_y + n_x⊗n_z'
- def test_dyadic_latex():
- expected = (r'a^{2}\mathbf{\hat{n}_x}\otimes \mathbf{\hat{n}_y} + '
- r'b\mathbf{\hat{n}_y}\otimes \mathbf{\hat{n}_y} + '
- r'c \sin{\left(\alpha \right)}'
- r'\mathbf{\hat{n}_z}\otimes \mathbf{\hat{n}_y}')
- assert vlatex(y) == expected
- expected = (r'\alpha\mathbf{\hat{n}_x}\otimes \mathbf{\hat{n}_x} + '
- r'\sin{\left(\omega \right)}\mathbf{\hat{n}_y}'
- r'\otimes \mathbf{\hat{n}_z} + '
- r'\alpha \beta\mathbf{\hat{n}_z}\otimes \mathbf{\hat{n}_x}')
- assert vlatex(x) == expected
- assert vlatex(Dyadic([])) == '0'
- def test_dyadic_str():
- assert vsprint(Dyadic([])) == '0'
- assert vsprint(y) == 'a**2*(N.x|N.y) + b*(N.y|N.y) + c*sin(alpha)*(N.z|N.y)'
- assert vsprint(x) == 'alpha*(N.x|N.x) + sin(omega)*(N.y|N.z) + alpha*beta*(N.z|N.x)'
- assert vsprint(ww) == "alpha*N.x + asin(omega)*N.y - beta*alpha'*N.z"
- assert vsprint(xx) == '- (N.x|N.y) - (N.x|N.z)'
- assert vsprint(xx2) == '(N.x|N.y) + (N.x|N.z)'
- def test_vlatex(): # vlatex is broken #12078
- from sympy.physics.vector import vlatex
- x = symbols('x')
- J = symbols('J')
- f = Function('f')
- g = Function('g')
- h = Function('h')
- expected = r'J \left(\frac{d}{d x} g{\left(x \right)} - \frac{d}{d x} h{\left(x \right)}\right)'
- expr = J*f(x).diff(x).subs(f(x), g(x)-h(x))
- assert vlatex(expr) == expected
- def test_issue_13354():
- """
- Test for proper pretty printing of physics vectors with ADD
- instances in arguments.
- Test is exactly the one suggested in the original bug report by
- @moorepants.
- """
- a, b, c = symbols('a, b, c')
- A = ReferenceFrame('A')
- v = a * A.x + b * A.y + c * A.z
- w = b * A.x + c * A.y + a * A.z
- z = w + v
- expected = """(a + b) a_x + (b + c) a_y + (a + c) a_z"""
- assert ascii_vpretty(z) == expected
- def test_vector_derivative_printing():
- # First order
- v = omega.diff() * N.x
- assert unicode_vpretty(v) == 'ω̇ n_x'
- assert ascii_vpretty(v) == "omega'(t) n_x"
- # Second order
- v = omega.diff().diff() * N.x
- assert vlatex(v) == r'\ddot{\omega}\mathbf{\hat{n}_x}'
- assert unicode_vpretty(v) == 'ω̈ n_x'
- assert ascii_vpretty(v) == "omega''(t) n_x"
- # Third order
- v = omega.diff().diff().diff() * N.x
- assert vlatex(v) == r'\dddot{\omega}\mathbf{\hat{n}_x}'
- assert unicode_vpretty(v) == 'ω⃛ n_x'
- assert ascii_vpretty(v) == "omega'''(t) n_x"
- # Fourth order
- v = omega.diff().diff().diff().diff() * N.x
- assert vlatex(v) == r'\ddddot{\omega}\mathbf{\hat{n}_x}'
- assert unicode_vpretty(v) == 'ω⃜ n_x'
- assert ascii_vpretty(v) == "omega''''(t) n_x"
- # Fifth order
- v = omega.diff().diff().diff().diff().diff() * N.x
- assert vlatex(v) == r'\frac{d^{5}}{d t^{5}} \omega\mathbf{\hat{n}_x}'
- assert unicode_vpretty(v) == ' 5\n d\n───(ω) n_x\n 5\ndt'
- assert ascii_vpretty(v) == ' 5\n d\n---(omega) n_x\n 5\ndt'
- def test_vector_str_printing():
- assert vsprint(w) == 'alpha*N.x + sin(omega)*N.y + alpha*beta*N.z'
- assert vsprint(omega.diff() * N.x) == "omega'*N.x"
- assert vsstrrepr(w) == 'alpha*N.x + sin(omega)*N.y + alpha*beta*N.z'
- def test_vector_str_arguments():
- assert vsprint(N.x * 3.0, full_prec=False) == '3.0*N.x'
- assert vsprint(N.x * 3.0, full_prec=True) == '3.00000000000000*N.x'
- def test_issue_14041():
- import sympy.physics.mechanics as me
- A_frame = me.ReferenceFrame('A')
- thetad, phid = me.dynamicsymbols('theta, phi', 1)
- L = symbols('L')
- assert vlatex(L*(phid + thetad)**2*A_frame.x) == \
- r"L \left(\dot{\phi} + \dot{\theta}\right)^{2}\mathbf{\hat{a}_x}"
- assert vlatex((phid + thetad)**2*A_frame.x) == \
- r"\left(\dot{\phi} + \dot{\theta}\right)^{2}\mathbf{\hat{a}_x}"
- assert vlatex((phid*thetad)**a*A_frame.x) == \
- r"\left(\dot{\phi} \dot{\theta}\right)^{a}\mathbf{\hat{a}_x}"
|