In [1]:
import transforms3d.quaternions as tf
import sympy
sympy.init_printing()

In [2]:
a = sympy.symbols('a_1:3')
b = sympy.symbols('b_1:3')
c = sympy.symbols('c_1:3')
d = sympy.symbols('d_1:3')

q0 = sympy.Matrix([a[0], b[0], c[0], d[0]])
q1 = sympy.Matrix([a[1], b[1], c[1], d[1]])

In [3]:
def qmult(q0, q1):
    res = sympy.Matrix(tf.qmult(q0, q1))
    res.simplify()
    return res

def qconj(q):
    return sympy.Matrix([q[0], -q[1], -q[2], -q[3]])

def qnorm(q):
    return sympy.sqrt(qmult(q, qconj(q))[0])

In [4]:
qmult(q0, q1)


Out[4]:
$$\left[\begin{matrix}a_{1} a_{2} - b_{1} b_{2} - c_{1} c_{2} - d_{1} d_{2}\\a_{1} b_{2} + a_{2} b_{1} + c_{1} d_{2} - c_{2} d_{1}\\a_{1} c_{2} + a_{2} c_{1} - b_{1} d_{2} + b_{2} d_{1}\\a_{1} d_{2} + a_{2} d_{1} + b_{1} c_{2} - b_{2} c_{1}\end{matrix}\right]$$

In [5]:
qconj(q1).T


Out[5]:
$$\left[\begin{matrix}a_{2} & - b_{2} & - c_{2} & - d_{2}\end{matrix}\right]$$

In [6]:
qnorm(q1)


Out[6]:
$$\sqrt{a_{2}^{2} + b_{2}^{2} + c_{2}^{2} + d_{2}^{2}}$$

In [7]:
qmult(q0, qconj(q0)/qnorm(q0)**2)


Out[7]:
$$\left[\begin{matrix}1\\0\\0\\0\end{matrix}\right]$$

In [8]:
qmult(q0, qconj(q0)/qnorm(q0))


Out[8]:
$$\left[\begin{matrix}\sqrt{a_{1}^{2} + b_{1}^{2} + c_{1}^{2} + d_{1}^{2}}\\0\\0\\0\end{matrix}\right]$$

In [9]:
def qinv(q):
    res = qconj(q)/qnorm(q)**2
    res.simplify()
    return res

In [10]:
qmult(q0, qinv(q1))


Out[10]:
$$\left[\begin{matrix}\frac{a_{1} a_{2} + b_{1} b_{2} + c_{1} c_{2} + d_{1} d_{2}}{a_{2}^{2} + b_{2}^{2} + c_{2}^{2} + d_{2}^{2}}\\\frac{- a_{1} b_{2} + a_{2} b_{1} - c_{1} d_{2} + c_{2} d_{1}}{a_{2}^{2} + b_{2}^{2} + c_{2}^{2} + d_{2}^{2}}\\\frac{- a_{1} c_{2} + a_{2} c_{1} + b_{1} d_{2} - b_{2} d_{1}}{a_{2}^{2} + b_{2}^{2} + c_{2}^{2} + d_{2}^{2}}\\\frac{- a_{1} d_{2} + a_{2} d_{1} - b_{1} c_{2} + b_{2} c_{1}}{a_{2}^{2} + b_{2}^{2} + c_{2}^{2} + d_{2}^{2}}\end{matrix}\right]$$