|
以下是使用 2×2 复数矩阵$\begin{pmatrix}
z & w\\
-\bar{w} & \bar{z}\\
\end{pmatrix}
\in M_2(\mathbb{C})$表示四元数$z+wj$的 Mathematica 代码:
- Clear["Global`*"]
- Unprotect[Dot];
- Dot[x_?NumberQ, y_] := x y;
- Protect[Dot];
- Matrix /: Matrix[x_?MatrixQ] :=
- First[First[x]] /; x == First[First[x]] IdentityMatrix[Length[x]];
- Matrix /: NonCommutativeMultiply[Matrix[x_?MatrixQ], y_] :=
- Dot[Matrix[x], y];
- Matrix /: NonCommutativeMultiply[y_, Matrix[x_?MatrixQ]] :=
- Dot[y, Matrix[x]];
- Matrix /: Dot[Matrix[x_], Matrix[y_]] := Matrix[x . y];
- Matrix /: Matrix[x_] + Matrix[y_] := Matrix[x + y];
- Matrix /: x_?NumericQ + Matrix[y_] :=
- Matrix[x IdentityMatrix[Length[y]] + y];
- Matrix /: x_?NumericQ Matrix[y_] := Matrix[x y];
- Matrix /: Matrix[x_]*Matrix[y_] := Matrix[x . y] /; x . y == y . x;
- Matrix /: Power[Matrix[x_?MatrixQ], y_?NumericQ] :=
- Matrix[MatrixPower[x, y]];
- Matrix /: Power[Matrix[x_?MatrixQ], Matrix[y_?MatrixQ]] :=
- Exp[Matrix[y] . Log[Matrix[x]]];
- Matrix /: Im[Matrix[x_?MatrixQ]] := Matrix[Im[x]]
- Matrix /: Re[Matrix[x_?MatrixQ]] := Matrix[Re[x]]
- Matrix /: Arg[Matrix[x_?MatrixQ]] := Matrix[Arg[x]]
- $Post2 = FullSimplify[FullSimplify[# /. i -> Matrix[( {
- {I, 0},
- {0, -I}
- } )] /. j -> Matrix[( {
- {0, 1},
- {-1, 0}
- } )] /. k -> Matrix[( {
- {0, I},
- {I, 0}
- } ) ] /.
- f_[args1___?NumericQ, Matrix[mat_], args2___?NumericQ] :>
- Matrix[MatrixFunction[f[args1, #, args2] &, mat]]] /.
- Matrix[{{a_, c_}, {d_, b_}}] :>
- Re[a] + Im[a] i + Re[c] j + Im[c] k ] /.
- Matrix[{{a_, c_}, {d_, b_}}] :>
- Re[a] + Im[a] i + Re[c] j + Im[c] k &;
- $Post = Nest[$Post2, #, 3] &;
复制代码
执行此操作后,您可以在普通表达式中使用四元数(i、j 和 k 的表达式)与其他数字。只有当四元数可交换时,才会计算四元数的乘法,在其他情况下,使用非交换乘法运算符 (**),始终会计算四元数的乘法。
测试:四元数的 Exp 和 Log 与矩阵的 Exp 和 Log 相同。
In:=Log[(i + 5) ** (j - 1)]
Out:=1/18 (-2 Sqrt[3] (i - 5 j - k) (Pi - ArcTan[(3 Sqrt[3])/5]) + 9 Log[52]) |
|