My method of solving this in a manner, that does not require loads of computation and with an acceptable number of terms is using a little bit of tensor algebra. The fundamental steps are:
- Express $R, R'$ as tensors
- Calculate $R^T \otimes R'$
- Expand the expression
- Take the traces between the 2nd and 3rd vector of each 4-tensor
- Calculate the vector $\omega$ by projecting the resulting 2-tensor onto the ($SO(3)$-irreducable) subspace of skew-symmetric 2-tensors (i.e. matrices) with the standard scalar product.
Steps 1 and 3 are equivalent to a matrix-matrix multiplication. Using the tensor product instead of writing everything in terms of matrices allows us to keep the calculation coordinate-free as long as possible, which greatly simplifies the endeavour.
Step 0:
We start with some definitions:
- $w:= u\times v$
- Identity matrix as tensor (i.e. the casimir element): $\Omega:= \sum_{i=1}^3 b_i \otimes b_i$ for any orthonormal basis set $\{b_1,b_2,b_3\}$, which looks basis dependent at first, but actually is not
- $u.v$ shall be a variable called
udotv
some calculations:
- $\frac{\partial}{\partial t}hat(w(t)) = hat(\frac{\partial}{\partial t}w(t))$ for $w(t) \in \mathbb{R}^3$
- $hat(v)^T = - hat(v)$
- except for the $hat$-operator, $R(u,v)$ consists of symmetric tensors, so transposing it only changes the sign of the $hat$-operator
to arrive with the variables
hat[_]
as stand-in for HodgeDual[_]
, which will be used in the end (hence the $+1=-1 \cdot -1$ for $R^T$ in front of hat[_]
)
rtensor
as $R^T$
rtensorprime
as $R'$
at the initial definitions:
rtensor[t_] = udotv[t] \[CapitalOmega] + hat[w[t]]
+ w[t]\[TensorProduct]w[t]/( 1 + udotv[t])
rtensorprime[t_] = D[ udotv[t] \[CapitalOmega]
+ w[t]\[TensorProduct]w[t]/(1 + udotv[t]), t] - hat[D[w[t], t] ]
Step 1 & Step 2 and some simplifications of the tensor product:
Expand[rtensor[t]\[TensorProduct]rtensorprime[t] ]//. {(a_ + b_)\[TensorProduct] c_ ->
a\[TensorProduct]c + b\[TensorProduct]c,
a_\[TensorProduct](b_ + c_) ->
a\[TensorProduct]b + a\[TensorProduct]c}
Step 3 I have done by hand. Identify all 4th-order tensors and calculate their traces. Mathematically, it is sufficient to identify the following equalities ($w,w_1,w_2,w_3,w_4\in\mathbb{R}^3$):
- $tr_{2,3}(\Omega \otimes w) = w $, $tr_{2,3}(\Omega \otimes \Omega)= \Omega $
- $tr_{2,3}(w_1\otimes w_2\otimes w_3 \otimes w_4) = (w_2.w_3)\ w_1\otimes w_4$
- $tr_{2,3}(hat(w_1)\otimes w_3 \otimes w_4) = (w_1\times w_3)\otimes w_4$, $tr_{2,3}(w_1\otimes w_2\otimes hat(w_3)) = -w_1\otimes(w_3\times w_2)$
Telling Mathematica, that these expressions hold, is a bit more finnicky.
In principle, one could calculate all possibilities, or try some generalized expressions. But since the expression from Step 2 is not too complex, I was happy by just defining specific replacement rules:
omegatraces = {(\[CapitalOmega] udotv[t])\[TensorProduct]a_ ->
udotv[t] a,
a_\[TensorProduct](\[CapitalOmega] Derivative[1][udotv][t]) ->
Derivative[1][udotv][t] a };
wtraces = {w[t]\[TensorProduct]w[t]\[TensorProduct]
(w[t]\[TensorProduct]w[t] Derivative[1][udotv][t]) ->
Derivative[1][udotv][t] wdotw w[t]\[TensorProduct]w[t],
w[t]\[TensorProduct]w[t]\[TensorProduct]w[ t]\[TensorProduct]Derivative[1][w][t] ->
wdotw w[t]\[TensorProduct]Derivative[1][w][t],
w[t]\[TensorProduct]w[t]\[TensorProduct]Derivative[1][w][
t]\[TensorProduct]w[t] -> wdotwprime w[t]\[TensorProduct]w[t]};
hattraces = {hat[
w[t]]\[TensorProduct](w[t]\[TensorProduct]w[t] Derivative[1][
udotv][t]) ->
Derivative[1][udotv][t] cross[w[t], w[t]]\[TensorProduct]w[t],
hat[w[t]]\[TensorProduct]w[t]\[TensorProduct]Derivative[1][w][
t] -> cross[w[t], w[t]]\[TensorProduct]Derivative[1][w][t],
hat[w[t]]\[TensorProduct]Derivative[1][w][t]\[TensorProduct]w[
t] -> cross[w[t], Derivative[1][w][t]]\[TensorProduct]w[t],
w[t]\[TensorProduct]w[t]\[TensorProduct]hat[
Derivative[1][w][t]] -> -w[t]\[TensorProduct]cross[
Derivative[1][w][t], w[t]]};
I intentionally used the undefined function cross
instead of Cross
due to personal preference whilst looking at the output and so I can immediately use
$w\times w = 0$ (which holds for any vector).
This will also be replaced in the very end. Applying the replacement lists in two steps:
rptensr =
FullSimplify[
Expand[rtensor[t]\[TensorProduct]rtensorprime[
t] ] //. {(a_ + b_)\[TensorProduct] c_ ->
a\[TensorProduct]c + b\[TensorProduct]c,
a_\[TensorProduct](b_ + c_) ->
a\[TensorProduct]b + a\[TensorProduct]c} /. omegatraces /.
wtraces]
rptensr2 = rptensr /. hattraces /. cross[a_, a_] -> 0
The result is
-hat[w[t]]\[TensorProduct]hat[Derivative[1][w][t]] + (1/((1 +
udotv[t])^3))(-(1 +
udotv[t]) (-wdotwprime w[t]\[TensorProduct]w[t] -
w[t]\[TensorProduct]Derivative[1][w][t] (wdotw + udotv[t] +
udotv[t]^2) + (1 +
udotv[t]) (-cross[w[t],
Derivative[1][w][t]]\[TensorProduct]w[t] -
w[t]\[TensorProduct]cross[Derivative[1][w][t], w[t]] +
udotv[t] (-Derivative[1][w][t]\[TensorProduct]w[t] +
hat[Derivative[1][w][t]] (1 + udotv[t])))) + (hat[
w[t]] (1 + udotv[t])^3 + \[CapitalOmega] udotv[
t] (1 + udotv[t])^3 +
w[t]\[TensorProduct]w[t] (1 - wdotw + udotv[t])) Derivative[1][
udotv][t])
which I rewrote by hand in preparation for the next step:
(-HodgeDual[w].HodgeDual[wp] +
1/(1 + udotv)^3 (-(1 +
udotv) (-wdotwprime w\[TensorProduct]w - (udotv + udotv^2 +
wdotw) w\[TensorProduct]wp + (1 +
udotv) (-w\[TensorProduct]Cross[wp, w] -
Cross[w, wp]\[TensorProduct]w +
udotv ((1 + udotv) HodgeDual[wp] -
wp\[TensorProduct]w))) + (udotv (1 +
udotv)^3 \[CapitalOmega] + (1 + udotv)^3 HodgeDual[
w] + (1 + udotv - wdotw) w\[TensorProduct]w) Derivative[1][
udotv]))
Here I finally took the trace between the two $hat$-tensors.
Step 4: Look at the output of MatrixForm[HodgeDual[{\[Omega]1[t], \[Omega]2[t], \[Omega]3[t]}]]
. It is clear, that this matrix can be seen as the linear combination of three basis matrices, each with coefficients $\omega_i$. Since we know, that $R^T R'$ must be from the same subspace of matrices, we will now calculate its coordinates with an orthogonal projection. Since our subspace is irreducable, any scalar product can be used for this, so we will simply use the standard scalar product for tensors.
\[Omega]3[t] = 1/2
FullSimplify[
With[{w = {w1, w2, w3}, \[CapitalOmega] = IdentityMatrix[3],
wp = {wp1, wp2, wp3}},
TensorContract[
TensorProduct[
Normal[(-HodgeDual[w].HodgeDual[wp] +
1/(1 + udotv)^3 (-(1 +
udotv) (-wdotwprime w\[TensorProduct]w - (udotv +
udotv^2 + wdotw) w\[TensorProduct]wp + (1 +
udotv) (-w\[TensorProduct]Cross[wp, w] -
Cross[w, wp]\[TensorProduct]w +
udotv ((1 + udotv) HodgeDual[wp] -
wp\[TensorProduct]w))) + (udotv (1 +
udotv)^3 \[CapitalOmega] + (1 + udotv)^3 HodgeDual[
w] + (1 + udotv -
wdotw) w\[TensorProduct]w) Derivative[1][udotv]))]
, {{0, 1, 0}, {-1, 0, 0}, {0, 0, 0}}], {{1, 3}, {2, 4}}] ]]
\[Omega]2[t] = 1/2
FullSimplify[
With[{w = {w1, w2, w3}, \[CapitalOmega] = IdentityMatrix[3],
wp = {wp1, wp2, wp3}},
TensorContract[
TensorProduct[
Normal[(-HodgeDual[w].HodgeDual[wp] +
1/(1 + udotv)^3 (-(1 +
udotv) (-wdotwprime w\[TensorProduct]w - (udotv +
udotv^2 + wdotw) w\[TensorProduct]wp + (1 +
udotv) (-w\[TensorProduct]Cross[wp, w] -
Cross[w, wp]\[TensorProduct]w +
udotv ((1 + udotv) HodgeDual[wp] -
wp\[TensorProduct]w))) + (udotv (1 +
udotv)^3 \[CapitalOmega] + (1 + udotv)^3 HodgeDual[
w] + (1 + udotv -
wdotw) w\[TensorProduct]w) Derivative[1][udotv]))]
, {{0, 0, -1}, {0, 0, 0}, {1, 0, 0}}], {{1, 3}, {2, 4}}] ]]
\[Omega]1[t] = 1/2
FullSimplify[
With[{w = {w1, w2, w3}, \[CapitalOmega] = IdentityMatrix[3],
wp = {wp1, wp2, wp3}},
TensorContract[
TensorProduct[
Normal[(-HodgeDual[w].HodgeDual[wp] +
1/(1 + udotv)^3 (-(1 +
udotv) (-wdotwprime w\[TensorProduct]w - (udotv +
udotv^2 + wdotw) w\[TensorProduct]wp + (1 +
udotv) (-w\[TensorProduct]Cross[wp, w] -
Cross[w, wp]\[TensorProduct]w +
udotv ((1 + udotv) HodgeDual[wp] -
wp\[TensorProduct]w))) + (udotv (1 +
udotv)^3 \[CapitalOmega] + (1 + udotv)^3 HodgeDual[
w] + (1 + udotv -
wdotw) w\[TensorProduct]w) Derivative[1][udotv]))]
, {{0, 0, 0}, {0, 0, 1}, {0, -1, 0}}], {{1, 3}, {2, 4}}] ]]
The factors $1/2$ are needed, since the matrices I chose are not normalized.
You probably want to simplify the obtained coordinates a bit further, for example:
FullSimplify[
FullSimplify[ 2 (1 + udotv)^2 \[Omega]3[t]] /.
w2^2 -> wdotw - w1^2 - w3^2 /.
w1 w3 wp1 -> wdotwp - w2 w3 wp2 - w3 w3 wp3] /. (w2 wp1 -
w1 wp2) -> wpcrossw3
which yields
-2 (1 + udotv) wdotwp -
2 (1 + udotv) (udotv + udotv^2 - wdotw) wp3 - ((1 + udotv)^2 +
wdotw) wpcrossw3 + 2 (1 + udotv)^2 w3 Derivative[1][udotv]
I hope this method helps. It certainly is prone to typos and while the approach is somewhat general, the actual implementation requires quite some fenagling by hand. On the plus side: The expressions are still small enough and mostly coordinate-independent.
With[{u = {u1, u2, u3}/Sqrt[u1^2 + u2^2 + u3^2], v = {v1, v2, v3}/Sqrt[v1^2 + v2^2 + v3^2]}, Transpose[#] . # &[Dot[u, v] IdentityMatrix[3] + HodgeDual[Cross[u, v]] + TensorProduct[Cross[u, v], Cross[u, v]]/(1 + Dot[u, v])]] // FullSimplify
; it might be a good start for someone else, tho. $\endgroup$HodgeDual
. There should be a minus sign beforeHodgeDual
but that gives $I_3$ in both cases because of symmetry in $u, v$. Actually the "explicit approach" might work provided it is possible to go back to a compact form, which I have not managed yet. $\endgroup$