技术背景
文章中我们介绍了欧拉角死锁问题的一些产生背景,还有基于四元数的求解方案。四元数这个概念虽然重要,但是很少会在通识教育课程中涉及到,更多的是一些图形学或者是工程学当中才会进行讲解。本文主要是面向四元数,相比上一篇文章更加详细的介绍和总结一下四元数的一些运算法则,还有基于四元数的插值法。
基本运算
\(z=x+iy\这样的形式去定义一个复数(Complex Number),其中\(x\是实部,而\(y\是虚部,\(i\是虚数单位,并且有\(i^2=-1\这样的特性。并且对于一个虚数而言,如果取自然指数(运算规则为:\(e^{i\theta}=cos\theta+i\ sin\theta\),还能够得到一个很美的数学公式:\(e^{i\pi}=-1\,这就是非常著名的欧拉公式。
\[q=s+ix+jy+kz \]
其中\(s,x,y,z\都是实数,并满足这样的一些运算规则:
\[i^2=j^2=k^2=ijk=-1\\ i\times j=k,j\times k=i,k\times i=j\\ j\times i=-k,k\times j=-i,i\times k=-j \]
四元数加法
两个四元数的加法就是将“实部虚部”对应位置做元素求和:
\[q_1+q_2=(s_1+ix_1+jy_1+kz_1+(s_2+ix_2+jy_2+kz_2=(s_1+s_2+i(x_1+x_2+j(y_1+y_2+k(z_1+z_2 \]
四元数缩放
在系数缩放这一点上,四元数与复数是一致的:
\[\lambda q=\lambda s+i\lambda x+j\lambda y+k\lambda z \]
四元数乘法
四元数的乘法是所有元素之前都要运算一遍:
\[\begin{align*} q_1q_2&=(s_1+ix_1+jy_1+kz_1*(s_2+ix_2+jy_2+kz_2\\ &=(s_1s_2-x_1x_2-y_1y_2-z_1z_2\\ &\ +i(s_1x_2+s_2x_1+y_1z_2-y_2z_1\\ &\ +j(s_1y_2+s_2y_1+x_2z_1-x_1z_2\\ &\ +k(s_1z_2+s_2z_1+x_1y_2-x_2y_1 \end{align*} \]
\(q=q_1q_2=s+ix+jy+kz\,那么这个乘法运算最终组成\(s\这个元素的,分别是\(s_1*s_2, (ix_1*(ix_2, (iy_1*(iy_2, (iz_1*(iz_2\这些项,而\(i^2=j^2=k^2=-1\,因此最终得到\(s=(s_1s_2-x_1x_2-y_1y_2-z_1z_2\。但是直到这里为止,我们所涉及到的元素乘法只是在“实部”和相同的“虚数单位”之间的运算,如果一旦涉及到不同的“虚数单位”之间的乘法运算,那就要自动转化成向量叉乘,比如\(ij=ji=k\。因此,我们要计算\(q\中的\(z\项的时候,只需要计算\(s_1z_2, s_2z_1, x_1y_2, x_2y_1\这些项即可,同时注意符号的变换,那么得到的最终的结果就是如上所示。
四元数与复数的最大的一点不同,复数乘法是有交换律的,而四元数没有。举个例子说,我们可以计算一下\(q_1,q_2\的对易:
\[\begin{align*} [q_1, q_2]&=q_1q_2-q_2q_1\\ &=(s_1s_2-x_1x_2-y_1y_2-z_1z_2+i(s_1x_2+s_2x_1+y_1z_2-y_2z_1+j(s_1y_2+s_2y_1+x_2z_1-x_1z_2+k(s_1z_2+s_2z_1+x_1y_2-x_2y_1-(s_2s_1-x_2x_1-y_2y_1-z_2z_1-i(s_2x_1+s_1x_2+y_2z_1-y_1z_2-j(s_2y_1+s_1y_2+x_1z_2-x_2z_1-k(s_2z_1+s_1z_2+x_2y_1-x_1y_2\\ &=2i(y_1z_2-y_2z_1+2j(x_2z_1-x_1z_2+2k(x_1y_2-x_2y_1 \end{align*} \]
\(q_1,q_2\之间是非对易的,也就是不可交换的。但是,四元数的运算是满足结合律和分配率的
。
\(s=0\):
\[a=ix_1+jy_1+kz_1\\ b=ix_2+jy_2+kz_2 \]
\[a\cdot b=x_1x_2+y_1y_2+z_1z_2\\ a\times b=(y_1z_2-y_2z_1i+(z_1x_2-z_2x_1j+(x_1y_2-x_2y_1k \]
需要注意的是,这里的叉积是向量叉积,跟四元数中的“虚数单位”相比,最大的一点不同就是:在向量叉积中,\(i\times i=0\,但是在四元数的乘法中,\(i\times i=-1\(非常重要)。
\[q_1q_2=s_1s_2-a\cdot b+s_ab+s_ba+a\times b \]
实四元数和纯四元数
对于一个实四元数而言,就是取\(x=y=z=0\:
\[q_r=s \]
\(s=0\:
\[q_i=ix+jy+kz \]
四元数共轭
\[q^*=s-ix-jy-kz \]
单位四元数
四元数的模的定义跟复数是一致的:
\[|q|=\sqrt{s^2+x^2+y^2+z^2}=\sqrt{qq*} \]
\[s^2+x^2+y^2+z^2=1 \]
如果给定的一个四元数不是单位四元数,那么我们可以对其进行规范化:
\[q'=\frac{q}{\sqrt{s^2+x^2+y^2+z^2}} \]
四元数的逆
\(qq^*=1\,所以单位四元数的逆就是其共轭四元数。如果是对于更加一般的场景,我们可以这样考虑:
\[q(q^{-1}*|q|^2=|q|^2\\ qq^*=|q|^2\\ q^{-1}=\frac{q^*}{|q|^2} \]
\(q^{-1}=q^*\。
四元数的二元表示
\[q=s+v\hat{q}=[s,v\hat{q}] \]
其中\(v=[x,y,z],\hat{q}=[i,j,k]\。关于此处的乘法描述,其实有一定的不严谨性,因为它既不是点积,也不是叉积,也不是外积,而是普通的元素乘。这种元素乘的概念在计算机领域是很常用的,但是在数学上其实并不是很常用。在这种二元描述下,四元数的乘法形式会略有调整:
\[q_1q_2=[s_1s_2-(v_1\hat{q}_1\cdot (v_2\hat{q}_2, s_1v_2\hat{q}_2+s_2v_1\hat{q}_1+(v_1\hat{q}_1\times(v_2\hat{q}_2] \]
四元数点积
\[q_1\cdot q_2=s_1s_2+v_1\cdot v_2 \]
这也是受益于四元数的二元表示,使得我们在书写结果的时候可以更加的简练。
四元数的指数
\(z=x+iy\的指数计算,根据泰勒展开公式\(f(x=\sum_n\frac{f^{(n}(x_0}{n!}(x-x_0^n\(比较特殊地,\(e^x=\sum_{k=0}^\infty\frac{x^k}{k!}\)对\(e^z\在\(y=0\处的展开有:
\[\begin{align*} e^{z}&=e^{x+iy}=e^xe^{iy}\\ &=e^x\left( 1+iy-\frac{1}{2!}y^2-\frac{i}{3!}y^3+\frac{1}{4!}y^4+\frac{i}{5!}y^5-\frac{1}{6!}y^6-\frac{i}{7!}y^7+... \right \end{align*} \]
\[sin\ x=x-\frac{1}{3!}x^3+\frac{1}{5!}x^5-\frac{1}{7!}x^7+...\\ cos\ x=1-\frac{1}{2!}x^2+\frac{1}{4!}x^4-\frac{1}{6!}x^6+... \]
代入可得:
\[e^{z}=e^xe^{iy} =e^x\left( cos\ y+i\ sin\ y \right \]
\(i\theta\而言,其指数为:\(e^{i\theta}=cos\theta+i\ sin\theta\。那么类似的,对于一个二元表示的四元数\(q=s+v\hat{q}\有:
\[\begin{align*} e^q&=e^{s+v\hat{q}}\\ &=e^s\left( 1+v\hat{q}-\frac{1}{2!}(v\hat{q}^2-\frac{1}{3!}(v\hat{q}^3+\frac{1}{4!}(v\hat{q}^4+\frac{1}{5!}(v\hat{q}^5-\frac{1}{6!}(v\hat{q}^6-\frac{1}{7!}(v\hat{q}^7+... \right \end{align*} \]
\[\begin{align*} (v\hat{q}^2&=0-(v\hat{q}\cdot (v\hat{q}+0+0+(v\hat{q}\times(v\hat{q}=-|v|^2\\ (v\hat{q}^3&=-|v|^2(v\hat{q}\\ (v\hat{q}^4&=|v|^4\\ (v\hat{q}^5&=|v|^4(v\hat{q}\\ (v\hat{q}^6&=-|v|^6\\ (v\hat{q}^7&=-|v|^6(v\hat{q}\\ &... \end{align*} \]
代入四元数的指数部分进行计算可得:
\[\begin{align*} e^q&=e^{s+v\hat{q}}\\ &=e^s\left( 1+v\hat{q}-\frac{1}{2!}|v|^2-\frac{1}{3!}|v|^2(v\hat{q}+\frac{1}{4!}|v|^4+\frac{1}{5!}|v|^4(v\hat{q}-\frac{1}{6!}|v|^6-\frac{1}{7!}|v|^6(v\hat{q}+... \right\\ &=e^s\left( cos|v|+\frac{v\hat{q}}{|v|}sin|v| \right \end{align*} \]
四元数的指数表示
区分于上一个章节中的四元数的指数运算,这个章节我们是要用一个指数形式去表示任意给定的一个四元数。因为在上一个章节中我们发现,一个四元数的指数形式是另外一个四元数,因此,理论上说我们可以用一个指数形式来表示任意的一个四元数。我们首先还是参考一下复数的指数表示:
\[z=x+iy=\sqrt{x^2+y^2}\left(\frac{x}{\sqrt{x^2+y^2}}+i\frac{y}{\sqrt{x^2+y^2}}\right=\sqrt{x^2+y^2}e^{i\frac{y}{|y|}\ arccos\left(\frac{x}{\sqrt{x^2+y^2}}\right} \]
\[q=s+v\hat{q}=\sqrt{s^2+|v|^2}\left( \frac{s}{\sqrt{s^2+|v|^2}}+\frac{v\hat{q}}{|v|}\frac{|v|}{\sqrt{s^2+|v|^2}} \right=\sqrt{s^2+|v|^2}e^{\hat{q}\frac{v}{|v|}\ arccos\left(\frac{s}{\sqrt{s^2+|v|^2}}\right} \]
比较有意思的是,如果我们取\(q=s+ix+jy+kz\中的\(y=0,z=0\时,我们发现\(v=\pm|v|,\hat{q}=i\,这样一来,四元数的指数表示形式就和复数的指数表示形式完全对应上了。
四元数的对数
\(q=s+v\hat{q}\的对数:
\[\begin{align*} log(q&=log\left(\sqrt{s^2+|v|^2}e^{\hat{q}\frac{v}{|v|}\ arccos\left(\frac{s}{\sqrt{s^2+|v|^2}}\right}\right\\ &=log\left(\sqrt{s^2+|v|^2}\right+\hat{q}\frac{v}{|v|}\ arccos\left(\frac{s}{\sqrt{s^2+|v|^2}}\right \end{align*} \]
四元数的幂次
了解了四元数的指数和对数的计算模块之后,我们可以计算一个四元数的幂次。正是由于四元数的指数表示形式,使得我们可以将四元数的幂次简单的转化成乘法的表示形式:
\[q^t=\left[\sqrt{s^2+|v|^2}e^{\hat{q}\frac{v}{|v|}\ arccos\left(\frac{s}{\sqrt{s^2+|v|^2}}\right}\right]^t= \left(s^2+|v|^2\right^{\frac{t}{2}}e^{\hat{q}\frac{vt}{|v|}\ arccos\left(\frac{s}{\sqrt{s^2+|v|^2}}\right} \]
欧拉角旋转四元数
每一个四元数其实都可以对应于三维空间的一个向量旋转,一个四元数\(q\作用在一个空间向量\(v\上就会旋转得到一个新的空间向量:
\[v'=qvq^* \]
\(X\轴旋转\(\beta\角所对应的四元数为:\(q=cos\frac{\beta}{2}+i\ sin\frac{\beta}{2}\,绕\(Y\轴旋转\(\alpha\角所对应的四元数为:\(q=cos\frac{\alpha}{2}-j\ sin\frac{\alpha}{2}\,绕\(Z\轴旋转\(\gamma\角所对应的四元数为:\(q=cos\frac{\gamma}{2}+k\ sin\frac{\gamma}{2}\。而通常使用的\(ZXY\顺规可表示为:
\[q=\left(cos\frac{\alpha}{2}-j\ sin\frac{\alpha}{2}\right\left(cos\frac{\beta}{2}+i\ sin\frac{\beta}{2}\right\left(cos\frac{\gamma}{2}+k\ sin\frac{\gamma}{2}\right \]
向量变换四元数
这个问题的定义是比较清晰的,如果给定空间中的两个不同的向量,能否直接获得这两个向量之间变换的四元数呢?如果用公式来表示就是:已知\(\textbf{v}_1,\textbf{v}_2\两个空间向量,求\(q\使得\(\textbf{v}_2=q\textbf{v}_1q^*\。关于这个问题的求解,在参考链接3中也是有介绍的,这里再简单提一下计算方法:
\[\textbf{u}=\textbf{v}_1\times\textbf{v}_2\\ cos\theta=\frac{\textbf{v}_1\cdot\textbf{v}_2}{|\textbf{v}_1||\textbf{v}_2|}\\ q=cos\frac{\theta}{2}+i\ sin\frac{\theta}{2}\textbf{u}\cdot i+j\ sin\frac{\theta}{2}\textbf{u}\cdot j+k\ sin\frac{\theta}{2}\textbf{u}\cdot k \]
总结概要
本文主要介绍四元数Quaternion的一些基本运算法则。四元数的概念,更像是复数的一个推广,在图形学和工程学中有大量的应用,在蛋白质结构预测软件AlphaFold和MEGA-Protein中都大量的使用了四元数的计算。而大部分的四元数的教材中写的计算法则,经常把各类乘法混在一起使用,阅读起来非常难受,因此只好自己总结一下四元数的相关运算。并且跟我们所熟悉的复数运算有一定的对比,更加容易去理解四元数的概念。
版权声明
https://www.cnblogs.com/dechinphy/p/quaternion.html