Unfortunately, this is a limitation in SymPy right now, which is that
our trigonometric simplification is not very good.

For now, you can use a work-around suggested in another thread:

def mytrigsimp(expr):
    expr = expr.rewrite(exp)
    expr = expr.expand()
    expr = expr.rewrite(cos)
    expr = expr.expand()
    return expr

and do skew.applyfunc(mytrigsimp).  This works by rewriting the trig
functions in terms of complex exponentials, expanding, rewriting them
back as trig functions, and expanding again.  In your case, it
simplifies nicely:

In [32]: def mytrigsimp(expr):
   ....:         expr = expr.rewrite(exp)
   ....:         expr = expr.expand()
   ....:         expr = expr.rewrite(cos)
   ....:         expr = expr.expand()
   ....:         return expr
   ....:

In [33]: print skew.applyfunc(mytrigsimp)
[
0, -sin(g(t))*Derivative(b(t), t) +
cos(b(t))*cos(g(t))*Derivative(a(t), t),
-sin(g(t))*cos(b(t))*Derivative(a(t), t) - cos(g(t))*Derivative(b(t),
t)]
[sin(g(t))*Derivative(b(t), t) - cos(b(t))*cos(g(t))*Derivative(a(t),
t),
    0,                     -sin(b(t))*Derivative(a(t), t) +
Derivative(g(t), t)]
[sin(g(t))*cos(b(t))*Derivative(a(t), t) + cos(g(t))*Derivative(b(t),
t),                      sin(b(t))*Derivative(a(t), t) -
Derivative(g(t), t),
                     0]

Aaron Meurer

On Tue, Mar 13, 2012 at 8:13 PM, Southern.Cross <hays....@gmail.com> wrote:
> Hello,
>
> I'm new to sympy so please excuse me if this question is obvious to
> the experienced.
>
> In multibody kinematics there is a classic relationship between a
> rotating body's angular velocity and the rotation matrices
> representing the configuration at a given point in time. Basically, if
> I am using a roll/pitch/yaw representation of the rotation then I have
> three rotation matrices that comprise the full instantaneous rotation,
>
> R =  rotx(gamma) * roty(beta) * rotz(alpha)
>
> Meaning, if I rotate the body by 'alpha' about a body fixed 'Z' axis,
> followed by a rotation 'beta' about the once rotated body fixed 'Y'
> axis, followed by a rotation 'gamma' about the twice rotated body
> fixed 'X' axis... I now have a complete instantaneous rotation matrix
> R.
>
> The relationship of the angular velocity of the body is,
>
> skew(w) = Rdot * R.transpose
>
> so, a new skew symmetric matrix is created from the matrix product
> between the time derivative of R and the transpose of R. (Since alpha,
> beta, and gamma are all functions of time then R is a function of
> time.)
>
> Completing the above described equations in Mathematica does in fact
> give me a skew-symmetric matrix. However, my first attempt in SYMPY
> did not produce a skew-symmetric matrix. So, I'm including the code
> below and asking the group if there is a simple newbie user error I
> may have performed causing the problem. Or, is this simply a
> limitation of SYMPY?  By the way, TRIGSIMP() did not help...
>
> <snip>
> from sympy import *
>
> t = Symbol('t')
> a = Symbol('a')
> b = Symbol('b')
> g = Symbol('g')
>
> rotX = Matrix([ [1,  0,         0],
>                [0,  cos(g(t)), sin(g(t))],
>                [0, -sin(g(t)), cos(g(t))] ])
> rotY = Matrix([ [cos(b(t)),  0,         -sin(b(t))],
>                [0,          1,          0],
>                [sin(b(t)), 0,           cos(b(t))] ])
> rotZ = Matrix([ [cos(a(t)),  sin(a(t)),  0],
>                [-sin(a(t)),  cos(a(t)),  0],
>                [0,          0,          1] ])
>
> R = rotX * rotY * rotZ
> Rdot = R.diff(t)
> skew = Rdot * R.T
>
> print ''
> print 'skew = '
> print skew
>
> # 'skew' should result in a skew-symmetic matrix.
> # or, of the form,
> #  [[ 0,   -w_z,   w_y ],
> #   [ w_z,  0,    -w_x],
> #   [-w_y,  w_x,   0] ]
> #
> # where w = [w_x, w_y, w_z]^T
> #
> # looks like SYMPY fails to produce this results, yet, this same code
> in
> # Mathematica works as expected...
> #
> # is this a result of a "newbie" mistake? Or, a limitation of sympy?
>
> print ''
> print 'trigsimp(skew[0,0]) = '
> print trigsimp(skew[0,0])
> </snip>
>
> Thanks in advance!
>
> --
> You received this message because you are subscribed to the Google Groups 
> "sympy" group.
> To post to this group, send email to sympy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sympy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sympy?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To post to this group, send email to sympy@googlegroups.com.
To unsubscribe from this group, send email to 
sympy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sympy?hl=en.

Reply via email to