空间线段距离

 1 前言
在一些特殊需求中,需要计算空间中两条线段的距离,这里定义的距离为两线段上所有点相互连接中,以距离最小值作为两线段距离的度量。由于线段距离计算涉及到二次规划,因此这里单独开篇进行记录。

2 理论
对于空间中的两条线段,这里设其参数方程如下  
(1)
$$
\begin{cases}
线段1: \mathbf{p}=\mathbf{n}_1t+\mathbf{p}_1&,0 \leq t \leq \alpha_1
\\
线段2:\mathbf{p}=\mathbf{n}_2t+\mathbf{p}_2&,0 \leq t \leq \alpha_2
\end{cases}
$$
为了便于后续简化,这里约定\(\mathbf{n}_1、\mathbf{n}_2\)为单位向量。进一步,设线段1上\(t=t_1\)与线段2上\(t=t_2\)的点形成的距离为两线段距离,则这时的距离求解等价于求解如下数学模型的参数\(t_1、t_2\):  
(2)
$$
\begin{aligned}
\mathbf{Min}:&||(\mathbf{n}_1t_1+\mathbf{p}_1)-(\mathbf{n}_2t_2+\mathbf{p}_2)||_2^2
\\
\mathbf{s}\cdot\mathbf{t}\cdot:&\begin{cases}
0 \leq t_1 \leq \alpha_1
\\
0 \leq t_2\leq \alpha_2
\end{cases}
\end{aligned}
$$
对(2)的最小化目标函数化简有  
(3)
$$
\begin{aligned}
d^2&=||(\mathbf{n}_1t_1+\mathbf{p}_1)-(\mathbf{n}_2t_2+\mathbf{p}_2)||_2^2 \\&=||\mathbf{n}_1t_1-\mathbf{n}_2t_2||_2^2+2(\mathbf{p}_1-\mathbf{p}_2)\cdot(\mathbf{n}_1t_1-\mathbf{n}_2t_2)+||\mathbf{p}_1-\mathbf{p}_2||_2^2
\\
&=t_1^2+t_2^2-2\mathbf{n}_1\cdot\mathbf{n}_2t_1t_2+2(\mathbf{p}_1-\mathbf{p}_2)\cdot \mathbf{n}_1t_1-2(\mathbf{p}_1-\mathbf{p}_2)\cdot \mathbf{n}_2t_2+||\mathbf{p}_1-\mathbf{p}_2||_2^2
\\
&=t_1^2+t_2^2+2at_1t_2+2bt_1+2ct_2+||\mathbf{p}_1-\mathbf{p}_2||_2^2
\end{aligned}
$$
上面公式里的系数\(a、b、c\)如下  
(4)
$$
\begin{cases}
a=-\mathbf{n}_1\cdot \mathbf{n}_2
\\
b=(\mathbf{p}_1-\mathbf{p}_2)\cdot \mathbf{n}_1
\\
c=(\mathbf{p}_2-\mathbf{p}_1)\cdot \mathbf{n}_2
\end{cases}
$$
将(3)(4)代入(2),最终等价求解如下问题  
(5)
$$
\begin{aligned}
\mathbf{Min}:&t_1^2+t_2^2+2at_1t_2+2bt_1+2ct_2
\\
\mathbf{s}\cdot\mathbf{t}\cdot:&\begin{cases}
0 \leq t_1 \leq \alpha_1
\\
0 \leq t_2\leq \alpha_2
\end{cases}
\end{aligned}
$$
上面是一个二次规划问题,通过求解(5)得到\(t_1、t_2\),最终两个线段的距离\(d\)可以按如下公式计算  
(6)
$$
d=||(\mathbf{n}_1t_1+\mathbf{p}_1)-(\mathbf{n}_2t_2+\mathbf{p}_2)||
$$

3 二次规划求解
这里考虑(5)的二次规划模型,将模型标准化有  
(7)
$$
\begin{aligned}
\mathbf{Min}:&\begin{bmatrix}t_1 & t_2\end{bmatrix}A\begin{bmatrix}t_1 \\ t_2\end{bmatrix}+\begin{bmatrix}2b & 2c\end{bmatrix}\begin{bmatrix}t_1 \\ t_2\end{bmatrix}
\\
\mathbf{s}\cdot\mathbf{t}\cdot:&\begin{cases}
0 \leq t_1 \leq \alpha_1
\\
0 \leq t_2 \leq \alpha_2
\end{cases}
\end{aligned}
$$
上面公式里的\(A\)为如下矩阵  
(8)
$$
A=\begin{bmatrix}1 & a\\a&1\end{bmatrix}
$$
由于\(A\)的一阶顺序主子式为1,而二阶主子式为  
(9)
$$
1-a^2=1-(\mathbf{n}_1\cdot\mathbf{n}_2)^2=1-\cos^2\theta=\sin^2\theta \geq 0
$$
上面公式的\(\theta\)为\(\mathbf{n}_1\)与\(\mathbf{n}_2\)的夹角。从(9)可以得出,当两个线段不平行时,\(A\)的顺序主子式都大于0,这时\(A\)是一个正定矩阵,(7)就是一个凸二次规划。当两线段平行时,这时可以退化成点到线段的距离。因此这里分两种情况进行求解。

3.1 两线段平行
当两线段平行时,任意选择一条线段,分别计算线段两端点到另一线段的距离,这里计距离为\(d_1、d_2\),这时两线段的距离一定与\(d_1、d_2\)中的较小者值一致。因此算法退化成点到线段的计算。

设空间点\(\mathbf{p}_3\)以及如下线段  
(10)
$$
\mathbf{p}=\mathbf{n}t+\mathbf{p}_0,0 \leq t \leq \alpha
$$
设\(\mathbf{p}_3\)在上面线段的垂点为\(\mathbf{p}_4\),则有  
(11)
$$
\begin{aligned}
\mathbf{p}_4&=\mathbf{n}t_4+\mathbf{p}_0
\\
0 &= \mathbf{n}\cdot(\mathbf{p}_4-\mathbf{p}_3) \Rightarrow t_4=\dfrac{\mathbf{n}\cdot(\mathbf{p}_3-\mathbf{p}_0)}{\mathbf{n}\cdot \mathbf{n}}
\end{aligned}
$$
这时点到线段距离按下式确定  
(12)
$$
d=||\mathbf{n}t_5+\mathbf{p}_0-\mathbf{p}_3||
$$
公式里的\(t_5\)按下式确定  
(13)
$$
t_5=\begin{cases}
0&,t_4<0
\\
t_4&,0 \leq t_4 \leq \alpha
\\
\alpha&,t_4>\alpha
\end{cases}
$$

3.2 两线段不平行
当两线段不平行时,就变成了一个凸二次规划问题,这时的解要么在目标函数无约束情况下的极小值处,要么就在约束的边界上。因此这里分别进行求解。

对于(5)的目标函数,由于是凸函数,为了计算其极小值,这里进行如下变化  
(14)
$$
\begin{aligned}
t_1^2+t_2^2+2at_1t_2+2bt_1+2ct_2 &=(t_1+(at_2+b))^2+(1-a^2)t_2+2(c-ab)t_2-b^2
\\
&=(t_1+(at_2+b))^2+(1-a^2)(t_2+\dfrac{c-ab}{1-a^2})^2-b^2-\dfrac{(c-ab)^2}{1-a^2}
\end{aligned}
$$
上面表达式取极值得到  
(15)
$$
\begin{cases}
t_1=\dfrac{ac-b}{1-a^2}
\\
\\
t_2=\dfrac{ab-c}{1-a^2}
\end{cases}
$$
如果(15)的解满足(5)的约束条件,则这时(15)的解为最佳解。  
如果(15)的解不满足(5)的约束条件,则这时的解一定在约束边界上。由于\(t_1、t_2\)的约束形式一样,不失一般性,假设\(t_2\)处于边界上,则通过(14)可以得到  
(16)
$$
t_1=-(at_2+b)=\begin{cases}
-b&,t_2=0
\\
-b-a\alpha_2&,t_2=\alpha_2
\end{cases}
$$
同理,假设\(t_1\)处于边界上,这时可以得到  
(17)
$$
t_2=-(at_1+c)=\begin{cases}
-c&,t_1=0
\\
-c-a\alpha_1&,t_1=\alpha_1
\end{cases}
$$
结合(16)(17)可以得到如下四组候选解  
(18)
$$

\begin{cases}
t_1=0
\\
t_2=-c
\end{cases},②
\begin{cases}
t_1=\alpha_1
\\
t_2=-c-a\alpha_1
\end{cases},③
\begin{cases}
t_1=-b
\\
t_2=0
\end{cases},④
\begin{cases}
t_1=-b-a\alpha_2
\\
t_2=\alpha_2
\end{cases}
$$
最终在(18)式里,排除不满足(5)约束的解,在剩下解中选择使得(5)目标最小的解作为最佳解。

3.3 总结
最终,对于(5)的解,将在(12)、(15)、(18)里产生。

4 空间直线距离
对于空间直线距离,这是线段距离的特例,即将(5)里的约束去掉,就变成了直线距离求解。根据(9)的结论,直线距离求解依然分为直线平行时与不平行时求解。

4.1 两直线平行
当两直线平行时,在任意一条直线上选择一个点,计算这个点到另一条直线的距离,这个距离也是两直线的距离。

4.2 两直线不平行
根据(9)的结论,这时求解一个无约束的凸二次规划问题,因此公式(15)的解为最终计算两直线距离参数的解,得到解后代入公式(6)则得最佳距离。

刚体角速度求解

1 前言
有时,已知刚体上一些速度信息,想确定刚体当前的状态或者想求刚体的角速度、或者任一点速度。比如,已知任意非共线三点位置与速度,求刚体角速度;已知任意非共线三点的速度方向共线,这时推断刚体运行状态等等。这时可以通过刚体动力学知识来求解。

2 理论
假设刚体上不共线三点的位置与速度分别为\(\mathbf{p}_1、\mathbf{p}_2、\mathbf{p}_3\)以及\(\mathbf{v}_1、\mathbf{v}_2、\mathbf{v}_3\), 刚体的角速度为\(\omega\), 则根据刚体上速度与角速度关系可以得到  
(1)
$$
\begin{cases}
\mathbf{v}_2 = \omega \times (\mathbf{p}_2 – \mathbf{p}_1) + \mathbf{v}_1
\\
\mathbf{v}_3 = \omega \times (\mathbf{p}_3 – \mathbf{p}_1) + \mathbf{v}_1
\end{cases}
$$
联合(1)中的两式有  
(2)
$$
\begin{aligned}
(\mathbf{v}_2 – \mathbf{v}_1)\times (\mathbf{v}_3 – \mathbf{v}_1) &=(\omega \times (\mathbf{p}_2 – \mathbf{p}_1))\times (\omega \times (\mathbf{p}_3 – \mathbf{p}_1))
\\
&=( (\mathbf{p}_3 – \mathbf{p}_1))\times (\omega \times  (\mathbf{p}_2 – \mathbf{p}_1))\times \omega
\\
&=((\omega \times (\mathbf{p}_2 – \mathbf{p}_1))\cdot  (\mathbf{p}_3 – \mathbf{p}_1))\omega
\end{aligned}
$$
在上面的算式里,注意\(((\omega \times (\mathbf{p}_2 – \mathbf{p}_1))\cdot  (\mathbf{p}_3 – \mathbf{p}_1))\)为一个数值,由于等式两边均是向量,因此这里必然存在一个缩放系数\(s\),使得下式成立  
(3)
$$
\omega = s(\mathbf{v}_2 – \mathbf{v}_1)\times (\mathbf{v}_3 – \mathbf{v}_1)
$$
将(3)代入(1)里的第1个等式有  
(4)
$$
\begin{aligned}
\mathbf{v}_2 &=\omega \times (\mathbf{p}_2 – \mathbf{p}_1) + \mathbf{v}_1
\\
&=s(\mathbf{v}_2 – \mathbf{v}_1)\times (\mathbf{v}_3 – \mathbf{v}_1) \times (\mathbf{p}_2 – \mathbf{p}_1) + \mathbf{v}_1
\\
&\Downarrow
\\
s &=\dfrac{||\mathbf{v}_2-\mathbf{v}_1||^2}{(\mathbf{v}_2-\mathbf{v}_1)\times (\mathbf{v}_3-\mathbf{v}_1)\times (\mathbf{p}_2-\mathbf{p}_1)\cdot (\mathbf{v}_2-\mathbf{v}_1)}
\end{aligned}
$$
将(4)代入(3)得到角速度  
(5)
$$
\omega = \dfrac{||\mathbf{v}_2-\mathbf{v}_1||^2(\mathbf{v}_2 – \mathbf{v}_1)\times (\mathbf{v}_3 – \mathbf{v}_1)}{(\mathbf{v}_2-\mathbf{v}_1)\times (\mathbf{v}_3-\mathbf{v}_1)\times (\mathbf{p}_2-\mathbf{p}_1)\cdot (\mathbf{v}_2-\mathbf{v}_1)}
$$
另外,通过公式(1)第1式可以发现速度与位置满足如下关系  
(6)
$$
(\mathbf{v}_2 – \mathbf{v}_1)\cdot  (\mathbf{p}_2 – \mathbf{p}_1)=0
$$
也就是说,刚体上任意两点的速度与位置必然满足(6)式,因此在构造数据验证刚体速度与位置关系时,不能随意构造,构造的数据必须满足(6)式,在一些工程应用场景里,这个式子也可以作为速度的修正。

这里将(6)代入(5)有  
(7)
$$
\begin{aligned}
\omega &=\dfrac{||\mathbf{v}_2-\mathbf{v}_1||^2(\mathbf{v}_2 – \mathbf{v}_1)\times (\mathbf{v}_3 – \mathbf{v}_1)}{(\mathbf{v}_2-\mathbf{v}_1)\times (\mathbf{v}_3-\mathbf{v}_1)\times (\mathbf{p}_2-\mathbf{p}_1)\cdot (\mathbf{v}_2-\mathbf{v}_1)}
\\
&=\dfrac{||\mathbf{v}_2-\mathbf{v}_1||^2(\mathbf{v}_2 – \mathbf{v}_1)\times (\mathbf{v}_3 – \mathbf{v}_1)}{(\mathbf{v}_2-\mathbf{v}_1)\times ((\mathbf{v}_2-\mathbf{v}_1)\times (\mathbf{v}_3-\mathbf{v}_1))\cdot (\mathbf{p}_2-\mathbf{p}_1)}
\\
&=\dfrac{||\mathbf{v}_2-\mathbf{v}_1||^2(\mathbf{v}_2 – \mathbf{v}_1)\times (\mathbf{v}_3 – \mathbf{v}_1)}{((\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{v}_3-\mathbf{v}_1))((\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_2-\mathbf{p}_1))-((\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{v}_2-\mathbf{v}_1))((\mathbf{v}_3-\mathbf{v}_1)\cdot (\mathbf{p}_2-\mathbf{p}_1))}
\\
&=\dfrac{(\mathbf{v}_3-\mathbf{v}_1)\times (\mathbf{v}_2-\mathbf{v}_1)}{(\mathbf{v}_3-\mathbf{v}_1)\cdot (\mathbf{p}_2-\mathbf{p}_1)}
\end{aligned}
$$
同理,可以得到\(\omega\)另一种表达式  
(8)
$$
\omega = \dfrac{(\mathbf{v}_2-\mathbf{v}_1)\times (\mathbf{v}_3-\mathbf{v}_1)}{(\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_3-\mathbf{p}_1)}
$$
很明显,(8)成立的条件是\((\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_3-\mathbf{p}_1)\ne 0\)。这时需要确定\((\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_3-\mathbf{p}_1)=0\)时\(\omega\)的取值。

要使得\((\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_3-\mathbf{p}_1)=0\), 这里存在如下三种情况  
(9)
$$
\begin{cases}
①\mathbf{p}_3-\mathbf{p}_1=\mathbf{0}
\\
②\mathbf{v}_2-\mathbf{v}_1=\mathbf{0}
\\
③\mathbf{p}_3-\mathbf{p}_1\ne\mathbf{0},\mathbf{v}_2-\mathbf{v}_1\ne\mathbf{0},\mathbf{p}_3-\mathbf{p}_1 \perp  \mathbf{v}_2-\mathbf{v}_1
\end{cases}
$$
对于第①种情况,因为三点不共线,因此这种情况不成立。  
对于第②种情况,如果要成立,则对于刚体上任意一点\(\mathbf{p}\)以及其速度\(\mathbf{v}\)有如下等式成立  
(10)
$$
\mathbf{v}-\mathbf{v}_1=\omega \times (\mathbf{p}-\mathbf{p}_1)=\omega \times (\mathbf{p}-\mathbf{p}_2)
$$
对于公式(10)分两种情况:第一种情况,\(\omega = \mathbf{0}\), 这时\(\mathbf{v}=\mathbf{v}_1\),即刚体上任意一点速度一致;第二种情况,\(\omega \ne \mathbf{0}\),这时由公式(10)可知\(\mathbf{v}-\mathbf{v}_1\)垂直于\(\mathbf{p}_1、\mathbf{p}_2、\mathbf{p}\)组成的平面,由于\(\omega\)也与\(\mathbf{v} – \mathbf{v}_1\)垂直,因此\(\omega\)必然在\(\mathbf{p}_1、\mathbf{p}_2、\mathbf{p}\)组成的平面上,由于\(\mathbf{p}\)的任意性,\(\omega\)不可能同时多个平面上,因此这种情况不存在。

最终,②的条件成立时,\(\omega=\mathbf{0}\),这也说明刚体上任意不同位置两点的速度一样,则刚体这时仅做平移运动,刚体上任意一点的速度大小和方向一致

对于第③种情况,如果要成立,结合公式(6)可以发现\(\mathbf{v}_2-\mathbf{v}_1\)垂直于\(\mathbf{p}_1、\mathbf{p}_2、\mathbf{p}_3\)组成的平面, 这里对于(1)的第2式做如下变换  
(11)
$$
\begin{aligned}
(\mathbf{v}_3-\mathbf{v}_1)\cdot (\mathbf{p}_2-\mathbf{p}_1)&=\omega \times (\mathbf{p}_3 – \mathbf{p}_1) \cdot (\mathbf{p}_2-\mathbf{p}_1)
\\
&=(\mathbf{p}_2-\mathbf{p}_1) \times \omega \cdot (\mathbf{p}_3-\mathbf{p}_1)
\\
&=-(\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_3-\mathbf{p}_1)
\\
&=0
\end{aligned}
$$
通过(11)可以发现\(\mathbf{v}_3-\mathbf{v}_1\)与\(\mathbf{p}_2-\mathbf{p}_1\)垂直,而通过(6)的性质可以发现\(\mathbf{v}_3-\mathbf{v}_1\)也与\(\mathbf{p}_3-\mathbf{p}_1\)垂直,因此\(\mathbf{v}_3-\mathbf{v}_1\)也垂直于\(\mathbf{p}_1、\mathbf{p}_2、\mathbf{p}_3\)组成的平面,则可以得到\(\mathbf{v}_3-\mathbf{v}_1\)与\(\mathbf{v}_2-\mathbf{v}_1\)线性相关,这里不妨设置\(\mathbf{v}_3-\mathbf{v}_1=\alpha(\mathbf{v}_2-\mathbf{v}_1)\), 结合公式(1)有  
(12)
$$
\begin{aligned}
\alpha ||\mathbf{v}_2-\mathbf{v}_1||^2&=(\mathbf{v}_3-\mathbf{v}_1)\cdot (\mathbf{v}_2-\mathbf{v}_1)
\\
&=(\omega \times (\mathbf{p}_3-\mathbf{p}_1))\cdot (\omega \times (\mathbf{p}_2-\mathbf{p}_1))
\\
&=(\omega \times (\mathbf{p}_3-\mathbf{p}_1) \times \omega)\cdot (\mathbf{p}_2-\mathbf{p}_1)
\\
&=0
\end{aligned} \Rightarrow \alpha = 0
$$
通过(12)可以得到\(\mathbf{v}_3=\mathbf{v}_1\),这与③的条件矛盾,因此第③种情况不存在。

综合上面的情况,角速度可按如下方式求解  
(13)
$$
\omega=\begin{cases}
\mathbf{0} &,\mathbf{v}_1=\mathbf{v}_2 \text{ or } \mathbf{v}_2=\mathbf{v}_3 \text{ or } \mathbf{v}_3=\mathbf{v}_1
\\
\dfrac{(\mathbf{v}_2-\mathbf{v}_1)\times (\mathbf{v}_3-\mathbf{v}_1)}{(\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_3-\mathbf{p}_1)} &,\mathbf{v}_1\ne\mathbf{v}_2 \text{ or } \mathbf{v}_2\ne\mathbf{v}_3 \text{ or } \mathbf{v}_3\ne\mathbf{v}_1
\end{cases}
$$
得到了角速度,对于刚体上任意一点\(\mathbf{p}\),其速度\(\mathbf{v}\)可按如下公式求得  
(14)
$$
\mathbf{v}=\omega\times(\mathbf{p}-\mathbf{p}_1)+\mathbf{v}_1
$$

3 进阶
3.1 三个点速度线性相关
对于刚体上不共线的三点\(\mathbf{p}_1、\mathbf{p}_2、\mathbf{p}_3\),速度分别为\(\mathbf{v}_1、\mathbf{v}_2、\mathbf{v}_3\),这些速度均不为\(\mathbf{0}\), 是否存在这么一种场景,它们的速度不一样,但是它们两两之间的速度线性相关?

假设存在上面这种场景,则存在非0系数\(\alpha、\beta\)使得下式成立  
(15)
$$
\begin{cases}
\mathbf{v}_2=\alpha \mathbf{v}_1
\\
\mathbf{v}_3=\beta \mathbf{v}_1
\end{cases}
$$
将(15)代入(8)可以得到  
(16)
$$
\begin{aligned}
\omega &=\dfrac{(\mathbf{v}_2-\mathbf{v}_1)\times (\mathbf{v}_3-\mathbf{v}_1)}{(\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_3-\mathbf{p}_1)}
\\
&=\dfrac{(\alpha – 1)(\beta-1)\mathbf{v}_1\times \mathbf{v}_1}{(\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_3-\mathbf{p}_1)}
\\
&=\mathbf{0}
\end{aligned}
$$
从(16)式可以发现,刚体这时没有旋转,即刚体各个点速度应该一致,这个和假设矛盾。

因此,可以得到结论:刚体上任意不共线的三点,如果它们之间的速度线性相关,则刚体这时仅做平移运动,刚体上任意一点的速度大小和方向一致

3.2 两个点速度方向线性相关
对于刚体上不共线的三点\(\mathbf{p}_1、\mathbf{p}_2、\mathbf{p}_3\),速度分别为\(\mathbf{v}_1、\mathbf{v}_2、\mathbf{v}_3\),这些速度均不为\(\mathbf{0}\), 是否存在这么一种场景,仅两个点的速度线性相关,第三个点的速度不与另外两个点的速度线性相关?

假设存在上面这种场景,不失一般性,设仅\(\mathbf{v}_1、\mathbf{v}_2\)线性相关,则存在非0系数\(\alpha\)使得下式成立  
(17)
$$
\mathbf{v}_2=\alpha \mathbf{v}_1
$$
将(17)代入(8)有  
(18)
$$
\omega = \dfrac{\mathbf{v}_1\times \mathbf{v}_3}{\mathbf{v}_1\cdot (\mathbf{p}_3-\mathbf{p}_1)}
$$
对于(18)这里分两种情况讨论。

第一种情况:\(\mathbf{v}_1\cdot (\mathbf{p}_3-\mathbf{p}_1)=0\),由于\(\mathbf{v}_1、\mathbf{v}_2\)线性相关,结合公式(6)可以发现\(\mathbf{v}_1、\mathbf{v}_2\)垂直于\(\mathbf{p}_1、\mathbf{p}_2、\mathbf{p}_3\)组成的平面,如果 \(\omega = \mathbf{0}\), 这和第3个点速度线性无关的假设相悖,因此这时只能 \(\omega \ne \mathbf{0}\), 而在此时,通过公式(1)的第1式可以发现 \(\mathbf{v}_1\)与 \(\omega\)垂直,因此\(\omega\)在\(\mathbf{p}_1、\mathbf{p}_2、\mathbf{p}_3\)组成的平面上,而这时(1)的第2式里的 \(\omega \times (\mathbf{p}_3 – \mathbf{p}_1)\)将得到一个和 \(\mathbf{v}_1\)线性相关的向量,因此这时的\(\mathbf{v}_3\)将与\(\mathbf{v}_1\)线性相关,这与假设相悖,因此第一种情况不成立。

第二种情况:\(\mathbf{v}_1\cdot (\mathbf{p}_3-\mathbf{p}_1)\ne0\),这时结合(6)(17)可以得到  
(19)
$$
\begin{aligned}
0&=(\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_2-\mathbf{p}_1)
\\
&=(\alpha-1)\mathbf{v}_1\cdot (\mathbf{p}_2-\mathbf{p}_1)
\\
&\Downarrow
\\
0&=\mathbf{v}_1\cdot (\mathbf{p}_2-\mathbf{p}_1)
\end{aligned}
$$
从(19)式可以看出,当\(\mathbf{v}_1\)的方向不与\(\mathbf{p}_2、\mathbf{p}_1\)连线方向垂直时,结论就会与假设冲突,因此这里仅讨论速度方向与点位置连线垂直的情况,进一步这里根据速度关系有  
(20)
$$
\begin{aligned}
\mathbf{v}_2 &=\omega (\mathbf{p}_2-\mathbf{p}_1)+\mathbf{v}_1
\\
&=\dfrac{\mathbf{v}_1\times \mathbf{v}_3}{\mathbf{v}_1\cdot (\mathbf{p}_3-\mathbf{p}_1)}\times (\mathbf{p}_2-\mathbf{p}_1)+\mathbf{v}_1
\\
&=(1-\dfrac{\mathbf{v}_3\cdot (\mathbf{p}_2-\mathbf{p}_1)}{\mathbf{v}_1\cdot (\mathbf{p}_3-\mathbf{p}_1)})\mathbf{v}_1
\\
&=\alpha \mathbf{v}_1
\end{aligned}
\Rightarrow \alpha =1-\dfrac{\mathbf{v}_3\cdot (\mathbf{p}_2-\mathbf{p}_1)}{\mathbf{v}_1\cdot (\mathbf{p}_3-\mathbf{p}_1)}
$$
因此,这里有如下结论:  
①刚体上,有两点的速度线性相关,且速度方向不与两点位置连线垂直,则刚体这时仅做平移运动,刚体上任意一点的速度大小和方向一致。  
②刚体上,有两点的速度线性相关,其它任意非共线点的速度均不与此两点的速度线性相关,则这两点的速度方向一定与两点位置的连线垂直,且其速度大小满足(17)(20)式

从上面的结论,可以解释我们平时开车时,如果车非直线行驶,我们转动方向盘,两个前轮转过的角度不一样(轮速方向不一样)。很明显,在车辆坐标系下,如果前轮胎不与车侧面平行,则这时轮速方向不与前左右车轮轴心连线垂直,根据上面②的结论,可以反推出前左右车轮轮速方向不一致。这里我们使用刚体动力学理论解释了这个现象。

3.3 阿克曼几何车模型

常见的四轮汽车阿克曼转向模型中,车两前轮可以单独转向,车两后轮只能沿着车身方向转动,在不考虑打滑,且所有车轮轴中心在一个平面上等理想情况下,能否通过两后轮轮速求出当前车的角速度呢?

这里以车两后轮轴中心为原点,车身右侧为x正轴,车身前进方向为y正轴,向上为z正轴建立车辆局部坐标系。且已知左右轮轴中心距离为\(l\),前后轮轴中心距离为\(h\),左后轮轮速为\(v_1\),右后轮轮速为\(v_2\)。

这里记左后轮中心位置为\(\mathbf{p}_1=[-\dfrac{l}{2},0,0]\),右后轮中心位置为\(\mathbf{p}_2=[\dfrac{l}{2},0,0]\),左前轮中心位置为\(\mathbf{p}_3=[-\dfrac{l}{2},h,0]\),左后轮轮速为\(\mathbf{v}_1=[0,v_1,0]\),右后轮轮速为\(\mathbf{v}_2=[0,v_2,0]\)。

这里设左前轮轮速为 \(\mathbf{v}_3=[v_x,v_y,0]\), 车辆角速度为\(\omega\)。

结合公式(13)(14)可以得到  

(21)

$$
\begin{cases}
\omega &= \dfrac{(\mathbf{v}_2-\mathbf{v}_1)\times (\mathbf{v}_3-\mathbf{v}_1)}{(\mathbf{v}_2-\mathbf{v}_1)\cdot (\mathbf{p}_3-\mathbf{p}_1)}
\\
&=\dfrac{1}{h}\begin{bmatrix}0\\1\\0\end{bmatrix}^\wedge(\mathbf{v}_3-\mathbf{v}_1)
\\
&=-\dfrac{1}{h}\begin{bmatrix}0\\0\\v_x\end{bmatrix}
\\
\\
\mathbf{v}_2-\mathbf{v}_1&=\omega\times(\mathbf{p}_2-\mathbf{p}_1)
\\
&=(\mathbf{p}_1-\mathbf{p}_2)^\wedge \omega
\\
&=-\dfrac{l}{h}\begin{bmatrix}1\\0\\0\end{bmatrix}^\wedge\begin{bmatrix}0\\1\\0\end{bmatrix}^\wedge(\mathbf{v}_3-\mathbf{v}_1)
\\
&=-\dfrac{l}{h}\begin{bmatrix}0&0&0\\1&0&0\\0&0&0\end{bmatrix}\begin{bmatrix}v_x\\v_y-v_1\\0\end{bmatrix}
\\
&=\begin{bmatrix}0\\v_2-v_1\\0\end{bmatrix}
\\
&\Downarrow
\\
v_x&=-\dfrac{h}{l}(v_2-v_1)
\\
\omega&=\begin{bmatrix}0&0&\dfrac{v_2-v_1}{l}\end{bmatrix}^T
\end{cases}
$$
注意,可以通过同样的方式导出右前轮在x方向的分量依然为\(-\dfrac{h}{l}(v_2-v_1)\),即两个前轮轮速在x方向的分量一直一致

最终,从(21)的结果可知,在阿克曼转向模型下,已知汽车两个后轮的轮速,则可以计算车的角速度,进而可以计算出车身任意一点的速度

4 附加
在原坐标系下刚体的角速度为\(\omega\),将原坐标系下的变量先旋转\(R\)再偏移\(\mathbf{t}\)到新坐标系下,这时刚体角速度变成了\(\omega'\),求这时新坐标系下角速度的表示。这里根据(8)可以得到 

(22)$$
\begin{aligned}
\omega'&=\dfrac{(R(\mathbf{v}_2-\mathbf{v}_1))\times (R(\mathbf{v}_3-\mathbf{v}_1))}{(R(\mathbf{v}_2-\mathbf{v}_1))\cdot(R(\mathbf{p}_3-\mathbf{p}_1))}
\\
&=\dfrac{R((\mathbf{v}_2-\mathbf{v}_1)\times (\mathbf{v}_3-\mathbf{v}_1))}{(\mathbf{v}_2-\mathbf{v}_1)\cdot(\mathbf{p}_3-\mathbf{p}_1)}
\\
&=R\omega
\end{aligned}
$$

 

主方向计算

1 前言
有时,我们需要在一系列方向向量中,找到一个特征方向向量来表示这些方向向量的主方向。这里设已知的\(n\)个已经归一化的方向向量序列为 \(\mathbf{p}_1,\mathbf{p}_2,…,\mathbf{p}_n\), 待求的归一化后的特征方向向量为\(\mathbf{p}\)。当拿到\(\mathbf{p}\)后就可以进行后续其它操作。

2 理论
要求特征方向向量\(\mathbf{p}\), 这里得先约定特征方向向量形式。试想一下,所有序列向量均是从原点往外延伸1个单元得到一个位置,如果特征向量位置距离所有序列向量的位置最短,那可以作为一种特征的度量。因此,这里使用欧式距离和约定\(\mathbf{p}\)满足如下要求  
(1)
$$
\begin{aligned}
\mathbf{Min}:e_1&=\sum_{i=1}^nw_i||\mathbf{p}-\mathbf{p}_i||_2^2
\\
&=2\sum_{i=1}^nw_i(1-\mathbf{p}\cdot \mathbf{p}_i)
\\
&\Updownarrow
\\
\mathbf{Max}:e_2&=\sum_{i=1}^nw_i\mathbf{p}\cdot \mathbf{p}_i
\end{aligned}
$$
公式里\(w_i\)为每个序列对应的权重,这里要求 \(w_i \geq 0\),一般情况下\(w_i=1\)即可。

在实际方向处理中,一般处理三维情况较多。因此,这里以三维情况来加以推导。需要注意的是,这里的向量为归一化的单位向量,特征主向量的各个值满足一定约束,为了释放约束,这里以\(-\pi<\theta\leq\pi,-\pi<\alpha\leq \pi\)来表示 \(\mathbf{p}\)  
(2)
$$
\mathbf{p}=\begin{bmatrix}
\cos\theta \cos \alpha
\\
\cos \theta \sin\alpha
\\
\sin\theta
\end{bmatrix}
$$
且设如下值  
(3)
$$
\begin{cases}
\mathbf{p}_i&=\begin{bmatrix}
x_i
\\
y_i
\\
z_i
\end{bmatrix}
\\
\\
a &=\sum_{i=1}^nw_ix_i
\\
\\
b &=\sum_{i=1}^nw_iy_i
\\
\\
c &=\sum_{i=1}^nw_iz_i
\end{cases}
$$
这里将(2)(3)代入(1)有  
(4)
$$
\begin{aligned}
\mathbf{Max}:e_2&=\sum_{i=1}^nw_i\mathbf{p}\cdot \mathbf{p}_i
\\
&=\sum_{i=1}^nw_i(\cos\theta \cos \alpha x_i+\cos \theta \sin\alpha y_i+\sin\theta z_i)
\\
&=\cos\theta (a\cos \alpha + b\sin\alpha)+c\sin\theta
\end{aligned}
$$
对于(4), 当\(a=0,b=0\)时,明显可以得到如下解  
(5)
$$
\begin{cases}
\theta &= \begin{cases}
\dfrac{\pi}{2}&c>0
\\
\\
-\dfrac{\pi}{2}& c \leq 0
\end{cases}
\\
\alpha &=任意值
\end{cases}
$$

接下来,讨论\(|a| +|b|\neq 0\)的情况。由于\(e_2\)是连续函数,因此\(e_2\)的最大值一定出现在极值处。这里令导数为0有  
(6)
$$
\begin{cases}
\dfrac{d e_2}{d\theta} &=c\cos\theta -\sin\theta(a\cos\alpha+b\sin\alpha)&=0
\\
\\
\dfrac{d e_2}{d\alpha} &=\cos \theta(b\cos\alpha-a\sin\alpha)&=0
\end{cases}
$$
对于(6)的问题,这里先考虑\(\cos\theta =0\)的情况,这时(6)等价于如下问题  
(7)
$$
\begin{cases}
\cos\theta &=0
\\
\\
a\cos \alpha + b\sin\alpha&=0
\end{cases}\Rightarrow 
\begin{cases}
\theta&=\pm \dfrac{\pi}{2}
\\
\\
\alpha &=-\arctan(\dfrac{a}{b})
\end{cases}
$$
接下来考虑\(\cos\theta \neq 0\)的情况,对于(6)有  
(8)
$$
\begin{cases}
\tan\theta(a\cos\alpha+b\sin\alpha)&=c
\\
\\
b\cos\alpha-a\sin\alpha&=0
\end{cases}\Rightarrow 
\begin{cases}
\theta&=\arctan(\dfrac{c}{\sqrt{a^2+b^2}})
\\
\\
\alpha &=\arctan(\dfrac{b}{a})
\end{cases}
$$

由于(7)是(5)的特例,结合(8)可以得到如下三组候选解  
(9)
$$
\begin{cases}
\theta&=\dfrac{\pi}{2}
\\
\\
\alpha &=-\arctan(\dfrac{a}{b})
\end{cases},\begin{cases}
\theta&=-\dfrac{\pi}{2}
\\
\\
\alpha &=-\arctan(\dfrac{a}{b})
\end{cases},\begin{cases}
\theta&=\arctan(\dfrac{c}{\sqrt{a^2+b^2}})
\\
\\
\alpha &=\arctan(\dfrac{b}{a})
\end{cases}
$$
因此,最终将(9)的3组解代入(4),选择最大值对应的解作为最佳解。

3 高维向量  
对于维度为\(m>3\)的向量,可以使用上面的类似处理方式来进行处理。在三维空间里,本质上使用了4组解来确定出最佳特征向量,而对于维度为\(m\)的向量,需要使用\(2^{m-1}\)组解来确定。如果处理维度特别大,则计算效率不高,上面的方式不再合适,这时可考虑如下方式来计算特征方向向量  
(10)
$$
\begin{aligned}
&w=0
\\
&\mathbf{p}=\mathbf{0}
\\
&\begin{cases}
\mathbf{p} = w\mathbf{p}+w_i\mathbf{p}_i
\\
\mathbf{p}=\dfrac{\mathbf{p}}{|\mathbf{p}|+\delta}
\\
w=w+w_i
\end{cases},i=1,2,3,…,n
\end{aligned}
$$
上面公式里\(\delta\)为大于0的小量。

观察公式(10)可以发现,这样计算的特征向量对序列顺序是敏感的,不同顺序结果有所差异。如果本身聚类向量方向比较接近,则不同顺序的结果差异也比较小。如果要算法对输入顺序不敏感,可以使用某种方式将序列排序后,再进行(10)的计算,这样设计的算法能保证顺序不敏感。

高精度反三角函数计算

 1 背景
有时需要进行高精度的反三角函数计算,本文就导出反三角函数的计算方式。

 

2 反正切函数计算
由于反正弦、反余弦、反余切函数均可以利用反正切函数进行计算,因此这里主要给出反正切的计算方式。

2.1 函数展开
对于反正切函数,存在如下展开形式
(1)
$$
\arctan(z)=z-\dfrac{z^3}{3+\dfrac{9z^2}{5+\dfrac{4z^2}{7+\dfrac{25z^2}{9+\dfrac{16z^2}{11+\dfrac{49z^2}{…}}}}}}
$$
很明显,上面z趋近0时,收敛速度才快一些。公式里\(9、4、25、16、49\)对应表达式为 \((i+1-(-1)^i)^2\)时 \(i=1、2、3、4、5、…\)

2.2 性质
当 \(xy \geq 0\)时有如下表达式  
(2)
$$
\arctan(x)=\arctan(\dfrac{x-y}{1+xy})+\arctan(y)
$$
明显,如果 \(\arctan(y)\)的值被提前计算出来,则这时计算 \(\arctan(x)\)变成计算 \(\arctan(\dfrac{x-y}{1+xy})\).

另一方面 \(\arctan(-x)=-\arctan(x)\),因此在实际处理时,仅考虑 \(x> 0\)的情况。而我们知道\(\tan\)函数在正向取值时,可以仅考虑\([0,\dfrac{\pi}{2})\)区间,而\(\tan(\pi/4)=1\),因此当\(x \geq 1\)时,使用如下公式进行转换  
(3)
$$
\arctan(x)=\dfrac{\pi}{4}+\arctan(\dfrac{x-1}{x+1})
$$
可以发现公式(3)在\(x\)趋近1时,求解的值才变得小一点,根据公式(2),当\(y\)趋近无穷大时,可以得到如下结果  
(4)
$$
\arctan(x)=\dfrac{\pi}{2}-\arctan(\dfrac{1}{x})
$$
结合(3)(4)令  
(5)
$$
\dfrac{x-1}{x+1}=\dfrac{1}{x}
$$
可以得到 \(x=1+\sqrt{2}\),这时\(\dfrac{1}{x}\approx 0.41421356237309 < 0.415\)。因此对于\(\arctan(x)\),当\(x\geq 0\)时,总能通过(3)或者(4)将其值区间变到\([0,0.415)\)范围内。

另一方面,令   
(6)
$$
\dfrac{x-1}{x+1}=-\dfrac{1}{1+\sqrt{2}}
$$
求解方程(6)可以得到\(x=\dfrac{1}{1+\sqrt{2}}\approx 0.41421356237309\),由于函数\(\dfrac{x-1}{x+1}\)在\([0,1]\)区间单调递增,因此对于\(\arctan(x)\),当 \(x>\dfrac{1}{1+\sqrt{2}}\)且\(x \leq 1+\sqrt{2}\) 时,可以先使用公式(3)进行变换,最终求值区间均在\([0,\dfrac{1}{1+\sqrt{2}}]\)范围内。

因此从(3)到(6)有如下结论:  
(7)
$$
\arctan({x})=\begin{cases}
\dfrac{\pi}{2}-\arctan(\dfrac{1}{x}) &, x \geq 1+ \sqrt{2}
\\
\\
\dfrac{\pi}{4}+\arctan(\dfrac{x-1}{x+1}) &, \dfrac{1}{1+\sqrt{2}} < x < 1+\sqrt{2}
\\
\\
\arctan(x) &, 0 \leq x \leq \dfrac{1}{1+\sqrt{2}}
\\
\\
-\arctan(-x) &, x < 0
\end{cases}
$$

上面公式虽然可以把反正切函数参数区间限制在\([0,0.415)\)范围内,但区间间范围依然不够小,在这个区间范围内,反正切函数有如下性质  
(8)
$$
\arctan(x)=\dfrac{1}{2}\arctan(\dfrac{2x}{1-x^2})
$$
当\(0 \leq x < 1\)`时 \(\dfrac{2x}{1-x^2}> x\),明显,上式不是预期的效果,这里需要将参数变小而不是变大,因此这时对(8)进行变形有  
(9)
$$
\arctan(x)=2\arctan(\dfrac{\sqrt{1+x^2}-1}{x})
$$
这里设  
(10)
$$
\dfrac{\sqrt{1+x^2}-1}{x}=ax  \Rightarrow a=\dfrac{\sqrt{1+x^2}-1}{x^2}
$$
由于 \(f(x)= \dfrac{\sqrt{1+x^2}-1}{x^2}\)在区间\((0,\dfrac{1}{1+\sqrt{2}})\)单调递减,因此有  
(11)
$$
\begin{cases}
a<\lim_{x \rightarrow 0} \dfrac{\sqrt{1+x^2}-1}{x^2}=\dfrac{1}{2}
\\
\\
a >\lim_{x \rightarrow \dfrac{1}{1+\sqrt{2}}} \dfrac{\sqrt{1+x^2}-1}{x^2}=\sqrt{20+14\sqrt{2}}-(3+2\sqrt{2})\approx 0.48021693505171 > 0.48
\end{cases}
$$
因此,从(11)可以看出,每执行一次(9)的变换,参数变小大概在\(\dfrac{1}{2}\)倍。

使用(9)时,存在开方的成本,如果想尽量减少变换次数(也即减少开方次数),可以利用(2)式再预制几个系数。
(12)
$$
\begin{cases}
\arctan(x)= \arctan(\dfrac{1}{8})+\arctan(\dfrac{8x-1}{x+8})
\\
\\
\arctan(x)= \arctan(\dfrac{5}{16})+\arctan(\dfrac{16x-5}{16+5x})
\end{cases}
$$
最终结合(7)、(9)、(12)可以得到如下算法  
(13)
$$
\arctan({x})=\begin{cases}
-\arctan(-x) &, x < 0
\\
\\
\arctan(x) &, 0 \leq x \leq \delta,这里直接进行计算
\\
\\
2\arctan(\dfrac{\sqrt{1+x^2}-1}{x}) &,\delta < x \leq \sqrt{65}-8
\\
\\
\arctan(\dfrac{1}{8})+\arctan(\dfrac{8x-1}{x+8}) &,\sqrt{65}-8 < x \leq \dfrac{\sqrt{18265}-123}{56}
\\
\\
\arctan(\dfrac{5}{16})+\arctan(\dfrac{16x-5}{16+5x})&, \dfrac{\sqrt{18265}-123}{56} < x \leq \dfrac{1}{1+\sqrt{2}}
\\
\\
\dfrac{\pi}{4}+\arctan(\dfrac{x-1}{x+1}) &, \dfrac{1}{1+\sqrt{2}} < x \leq 1+\sqrt{2}
\\
\\
\dfrac{\pi}{2}-\arctan(\dfrac{1}{x}) &, x > 1+ \sqrt{2}
\end{cases}
$$
公式里\(\delta\)为一个小量。在实际使用中可设置为0.01。这个参数对计算精度贡献较小。

 

2.3 截断

在使用(1)式进行迭代时,需要进行项数\(m\)截断。对于10进制下有效位位数为\(p\)的情况下,使用如下经验公式计算\(m\)

(14)$$
m = \lceil -1.49834822214794+1.30624309011713p \rceil
$$

2.4 算法
最终使用如下算法计算 \(\arctan(x)\):
① 设小量\(\delta=0.01\)。

② 根据公式(13)将参数变到\((0,\delta]\)范围内。设变换后的参数为\(z\)。

③ 根据有效位\(p\),依据公式(14)计算截断项数\(m\)。

④ 设 \(y_m = 2m+1\)。

⑤ 循环计算 \(y_i=2i+1+\dfrac{(i+1-(-1)^i)^2z^2}{y_{i+1}}\),这里 \(i=m-1,m-2,…,1\)。

⑥ 返回 \(\arctan(z)=z – \dfrac{z^3}{y_1}\)。

 

3 其它反函数计算
3.1 反余切计算  
(15)
$$
\mathbf{arccot}(x)=\arctan(\dfrac{1}{x})
$$

3.2 反正弦计算  
根据复数运算规则,可以推出如下表达式

(16)
$$
\arcsin(x)=\arctan(\dfrac{x}{\sqrt{1-x^2}})
$$

3.3 反余弦计算  
根据正余弦 \(\dfrac{\pi}{2}\)的关系,结合(15)可以得到  
(17)
$$
\arccos(x)=\dfrac{\pi}{2} -\arctan(\dfrac{x}{\sqrt{1-x^2}})
$$

高精度正余弦计算

1 背景

有时需要进行高精度的正余弦函数计算,这时就需要正余弦的计算方式。

2 正弦函数计算

2.1 函数展开
对于正弦函数,存在如下展开形式
(1)
$$
\sin(z)=\dfrac{z}{1+\dfrac{z^2}{6-z^2+\dfrac{6z^2}{20-z^2+\dfrac{20z^2}{42-z^2+\dfrac{42z^2}{72-z^2+\dfrac{72z^2}{110-z^2+\dfrac{110z^2}{156-z^2+…}}}}}}}
$$

很明显,上面\(z\)趋近0时,收敛速度才快一些。公式里\(6、20、42、72、110\)对应的表达式为 \(2i(2i+1)\) 时 \(i=1、2、3、4、5、…\)。

2.2 性质
对于正弦函数,有如下性质  
(2)
$$
\sin(x)=3\sin(\dfrac{x}{3})-4\sin^3(\dfrac{x}{3})
$$
由于\(\sin\)函数为\(2\pi\)的周期函数,因此这里考虑\(x\)在\((-\pi/2,\pi/2)\)取值计算。则总存在如下一个整数\(n\),使得\(z\)值接近0  
(3)
$$
z = \dfrac{x}{3^n}
$$

这里约定\(n\)按如下形式取值

(4)$$
 \dfrac{|x|}{3^n}<\dfrac{1}{3^{31}}
$$

2.3 截断

 

在使用(1)式进行迭代时,需要进行项数\(m\)截断。对于10进制下有效位位数为\(p\)的情况下,使用如下经验公式计算\(m\)

(5)$$
m =\lfloor 1.02497850806725+0.02956390486989p  \rfloor
$$

2.4 算法
最终使用如下步骤计算\(\sin(x)\):

① 根据(4)找到一个最小\(n\)使得\(|z|<\dfrac{1}{3^{31}}\)。

② 根据有效位\(p\),根据(5)计算截断项数\(m\)。

③ 设 \(y_m=1\)。

④ 循环计算 \(y_i = 2i(2i+1)-z^2+\dfrac{2i(2i+1)z^2}{y_{i+1}}\),这里 \(i=m-1,m-2,…,1\)。

⑤ 设 \(r_0 = \dfrac{z}{1+\dfrac{z^2}{y_1}}\)。

⑥ 循环计算 \(r_i=3\sin(r_{i-1})-4\sin^3(r_{i-1})\),这里\(i=1,2,3,…,n\)。

⑦ 返回 \(\sin(x)=r_n\)。

 

3 余弦函数计算
第2部分给出了正弦函数计算方式,而余弦函数可以通过如下方式进行计算  
(4)
$$
\cos(x)=1-2\sin^2(\dfrac{x}{2})
$$

 

高精度正余切计算

1 背景

有时需要进行高精度的正余切函数计算,因此需要知道正余切的计算方式。

2 正切函数计算

由于余切函数可以通过正切函数计算,因此这里主要给出正切函数计算方式。

2.1  函数展开
对于正切函数,存在如下展开形式
(1)
$$
\tan(z)=\dfrac{z}{1-\dfrac{z^2}{3-\dfrac{3z^2}{15-\dfrac{15z^2}{35-\dfrac{35z^2}{63-\dfrac{63z^2}{99-\dfrac{99z^2}{…}}}}}}}
$$

很明显,上面\(z\)趋近0时,收敛速度才快一些。公式里\(3、15、35、63、99\)对应的表达式为 \((2i-1)(2i+1)\)时 \(i=1、2、3、4、5、…\)。

2.2 性质
对于正切函数,有如下性质  
(2)
$$
\tan(x)=\dfrac{2\tan(\dfrac{x}{2})}{1-\tan^2(\dfrac{x}{2})}
$$
由于\(\tan\)函数为\(\pi\)的周期函数,因此这里考虑\(x\)在\((-\pi/2,\pi/2)\)取值计算。则总存在如下一个整数\(n\),使得\(z\)值接近0  
(3)
$$
z = \dfrac{x}{2^n}
$$

这里约定\(n\)按如下方式取得

(4)
$$
\dfrac{|x|}{2^n}<\dfrac{1}{2^{40}}
$$

2.3 截断

在使用(1)式进行迭代时,需要进行项数\(m\)截断。对于10进制下有效位位数为\(p\)的情况下,使用如下经验公式计算\(m\)

(5)$$
m = \lceil 0.43116670516841+0.03508654522889p \rceil
$$

2.4 算法
这里使用如下步骤计算\(\tan(x)\):

① 根据(4)找到一个最小的\(n\)值使得\(|z|<\dfrac{1}{2^{40}}\)。

② 根据有效位\(p\),根据(5)计算截断项数\(m\)。

③ 设 \(y_m=(2m-1)(2m+1)\)。

④ 循环计算 \(y_i=(2i-1)(2i+1)(1-\dfrac{z^2}{y_{i+1}})\),这里 \(i=m-1,m-2,…,1\)。

⑤ 设 \(r_1 =\dfrac{z}{1-\dfrac{z^2}{y_1}} \)。

⑥ 循环计算 \(r_i = \dfrac{2r_{i-1}}{1-r_{i-1}^2}\),这里 \(i=1,2,3,…,n\)。

⑦ 最终 \(\tan(x)=r_n\)。
 

高精度指数函数计算

1 背景

有时需要进行高精度次方函数计算,这时就需要进行特别处理。

 

2 指数函数计算

对于任意正数\(a\),以及实数\(b\)存在如下性质  

(1)$$a^b=\exp(b\ln(a))$$

由公式(1)可知,任意正数的次方可以通过指数函数与对数函数计算,高精度对数函数计算已经有文章介绍,而这里仅讨论指数函数计算方式。

 

2.1  函数展开

对于自然指数函数,存在如下展开形式 

(2)$$\begin{aligned}\exp(z)=1+\dfrac{2z}{2-z+\dfrac{z^2}{6+\dfrac{z^2}{10+\dfrac{z^2}{14+\dfrac{z^2}{18+\dfrac{z^2}{22+\dfrac{z^2}{…}}}}}}}\end{aligned}$$

很明显,上面\(z\)趋近0时,收敛速度才快一些。上面数据\(6、10、14、18、22\)为表达式\(2+4i\)中\(i=1、2、3、4、5、…\)时的值。

 

2.2 性质

对于正整数\(n\),自然指数函数存在如下性质  

(3)$$\exp(x)=\exp(2^nz)=\exp(z)^{2^n}$$

从上面可以得到

(4)$$z=\dfrac{x}{2^n}$$

由公式(2)可知,为了加快收敛速度,只有\(z\)趋近0时,速度才会更快。因此实际计算时,需要找到一个合适的\(n\)。这里约定\(n\)按如下方式取值

(5)$$\dfrac{|x|}{2^n}<\dfrac{1}{2^{46}}$$

2.3 截断

在使用(2)式进行迭代时,需要进行项数\(m\)截断。对于10进制下有效位位数为\(p\)的情况下,使用如下经验公式计算\(m\)

(6)$$
m = \lceil 0.10515032199532+0.03087406498127p\rceil
$$

2.4 算法

这里使用如下步骤计算 \(\exp(x)\):

①根据(5)找到一个满足条件的最小值\(n\)。

②根据有效位\(p\),根据(6)计算截断项数\(m\)。

③设 \(y_m=2+4m\)。

④循环计算 \(y_i=2+4i+\dfrac{z^2}{y_{i+1}}\),这里 \(i=m-1,m-2,…, 1\)。

⑤设 \(r_0=1+\dfrac{2z}{2-z+\dfrac{z^2}{y_1}}\)。

⑥循环计算 \(r_i=r_{i-1}^2\),这里 \(i=1,2,3,…, n\)。

⑦最终 \(\exp(x)=r_n\)。

高精度自然对数函数计算

1 背景

有时需要进行高精度的对数函数计算,这时可以使用连分式的方式进行处理。

 

2 自然对数函数计算

由于所有对数函数均可以通过自然对数函数来计算,因此这里考虑自然对数函数的计算方式。

2.1 函数展开
对于自然对数,有如下展开式  
(1)
$$
\begin{aligned}
\ln(x)&=\ln(\dfrac{1+z}{1-z}) =\dfrac{2z}{1-\dfrac{1^2z^2}{3-\dfrac{2^2z^2}{5-\dfrac{3^2z^2}{7-\dfrac{4^2z^2}{9-\dfrac{5^2z^2}{11-\dfrac{6^2z^2}{13-…}}}}}}}
\\
\\
z &= \dfrac{x-1}{x+1}
\end{aligned}
$$
从上面公式可以发现,只有\(x\)趋近1(即\(z\)趋近0)时,收敛速度才快一些。

2.2 性质
总存在整数\(a\),以及非负整数\(b\)可以将正数\(x\)的值\(\dfrac{x}{10^a2^b}\)变换到区间\([1,2)\)。这时求对数变成  
(2)
$$
\begin{aligned}
\ln(x)&=\ln(10^a2^b\dfrac{x}{10^a2^b})
\\
&=a\ln(10)+b\ln(2)+\ln(\dfrac{x}{10^a2^b})
\\
&=a\ln(5)+(a+b)\ln(2)+\ln(\dfrac{x}{10^a2^b})
\end{aligned}
$$
因此这时\(\ln(x)\)参数区间变成了\([1,2)\),这时利用1,2边界,计算这个区间\(|z|\)的最大值。这里设\(|z|\)取最大值时参数为\(x'\),则  
(3)
$$
|z|=\dfrac{x'-1}{x'+1} = \dfrac{1-\dfrac{x'}{2}}{1+\dfrac{x'}{2}} \Rightarrow x'=\sqrt{2},|z|=3-2\sqrt{2}
$$
从(3)可以发现,在\(\sqrt{2}\)处有最大值\(3-2\sqrt{2}\),这个值依然不小。但是,如果在这个区间内,将大于等于\(\sqrt{2}\)的值除以\(\sqrt{2}\),这时可以将\(\ln(x)\)参数区间变成\([1,\sqrt{2})\)。同理,反复多次,最终,可以将\(\ln(x)\)参数区间变成\([1,2^\frac{1}{2^n})\),这时有  
(4)
$$
0 \leq z < \dfrac{2^\frac{1}{2^n}-1}{2^\frac{1}{2^n}+1}
$$
最终,按如下算式计算对数函数  
(5)
$$
\ln(x)=\begin{cases}
a\ln(5)+(a+b)\ln(2)+\ln(\dfrac{x}{10^a2^b}) &, \dfrac{x}{10^a2^b} \leq \delta
\\
\\
a\ln(5)+(a+b+\sum_{i=1}^n\dfrac{1}{2^{k_i}})\ln(2)+\ln(\dfrac{x}{10^a2^b\prod_{i=1}^n2^\frac{1}{2^{k_i}}})&, \dfrac{x}{10^a2^b} > \delta
\end{cases}
$$

公式\(k_i\)表示满足条件的整数索引。另外公式里\(\delta\)为参数值上限,这里约定\(\delta = 2^\frac{1}{2^8}\),则\(n\)按如下方式取值  
(6)
$$
\dfrac{x}{10^a2^b\prod_{i=1}^n2^\frac{1}{2^{k_i}}} < \dfrac{\delta-1}{\delta+1}<0.0013538023
$$

2.3 截断
这里假设有效位数为\(p\),则通过如下经验公式计算截断项数\(m\)  
(7)$$
m=\lceil -0.30831792741497+0.14992079831328p \rceil​
$$

2.4 算法
对于\(\ln(x)\)函数,使用如下流程进行计算  
① 按公式(5)(6)确定出参数\(a,b,n\)。  
② 根据\(a,b,n\)计算参数\(z\)。  
③ 根据公式(7)计算出截断项数\(m\)。  
④ 设\(y_m=2m-1\)。  
⑤ 循环计算\(y_i = 2i-1-\dfrac{i^2z^2}{y_{i+1}}\),这里\(i = m-1,m-2,…,1\)。  
⑥ 然后 \(\ln(x')=\dfrac{2z}{y_1}\)。  
⑦ 按公式(5)计算最终\(\ln(x)\).

PS:\(\ln(2)、\ln(5)\)预制数据,也可以使用本算法先提前计算出来。

高精度误差函数计算

1 背景

有时需要进行高精度的误差函数计算,这时就需要误差函数的计算方式。

2 误差函数

2.1 性质

误差函数定义如下  
(1)
$$
\mathbf{erf}(x)=\dfrac{2}{\sqrt{\pi}}\int_0^x\exp(-t^2)dt
$$
而对于误差函数有如下性质  
(2)
$$
\begin{aligned}
\mathbf{erf}(x)&=-\mathbf{erf}(-x)
\\
\mathbf{erf}(0)&=0
\\
\mathbf{erf}(\infty)&=1
\\
-1 < \mathbf{erf}(x) &< 1
\\
\dfrac{\partial \mathbf{erf}(x)}{\partial x}&=\dfrac{2}{\sqrt{\pi}}\exp(-x^2)
\\
|\mathbf{erf}(20)-1| &< 10^{-175}
\\
|\mathbf{erf}(30)-1| &< 10^{-392}
\\
|\mathbf{erf}(40)-1| &< 10^{-696}
\\
|\mathbf{erf}(50)-1| &< 10^{-1087}
\end{aligned}
$$

2.2 函数展开

这里给出误差函数两种展开形式。  
(3)
$$
\begin{aligned}
\mathbf{erf}1(x)&=1-\dfrac{1}{e^{z^2}\sqrt{\pi}g(x)}
\\
&=1-\dfrac{1}{\sqrt{\pi}\exp(x^2+\ln(g(x)))}
\\
\\
g(x)&=x+\dfrac{1}{2(x+\dfrac{1}{x+\dfrac{3}{2(x+\dfrac{2}{x+\dfrac{5}{2(x+\dfrac{3}{x+\dfrac{7}{2(x+\dfrac{4}{x+\dfrac{9}{…}})}})}})}})}
\end{aligned}
$$

(4)
$$
\begin{aligned}
\mathbf{erf}2(x)&=\dfrac{2x}{\exp(x^2)\sqrt{\pi}(1-\dfrac{2x^2}{3+\dfrac{4x^2}{5-\dfrac{6x^2}{7+\dfrac{8x^2}{9-\dfrac{10x^2}{11+\dfrac{12x^2}{13-…}}}}}})}
\end{aligned}
$$

上面两种展开方式,计算误差函数时,收敛效率有差异。它们分别适用不同场景。

2.3 迭代计算

对于\(\mathbf{erf}1(x)\)可以构建如下的迭代算式  
(5)
$$
\begin{cases}
y_m=x+\dfrac{2m-1}{2x}
\\
\\
y_i=x+\dfrac{2i-1}{2(x+\dfrac{i}{y_{i+1}})} ,i=m-1,m-2,…,1
\\
\\
\mathbf{erf}1(x)=1-\dfrac{1}{y_1\sqrt{\pi}\exp(x^2)}=1-\dfrac{1}{\sqrt{\pi}\exp(x^2+\ln(y_1))}
\end{cases}
$$

对于\(\mathbf{erf}2(x)\)可以构建如下的迭代算式  
(6)
$$
\begin{cases}
y_m=2m-1
\\
\\
y_i=2i-1+(-1)^i\dfrac{2ix^2}{y_{i+1}},i=m-1,m-2,…,1
\\
\\
\mathbf{erf}2(x)=\dfrac{2x}{y_1\sqrt{\pi}\exp(x^2)}
\end{cases}
$$

2.4 截断与计算

由于\(\mathbf{erf}1(x)\)与\(\mathbf{erf}2(x)\)收敛效率有差异,因此这里根据经验,设有效位数为\(p\),则截断项数\(m\)根据不同的展开式进行获取  
(7)
$$
\mathbf{erf}(x)=\begin{cases}
x \leq 1 &,
\mathbf{erf}2(x),m=\lfloor 51.1267+0.35426p\rfloor
\\
1< x \leq 2 &,\mathbf{erf}2(x),m=\lfloor 83.1015+0.42509p\rfloor
\\
2< x \leq 3 &,\mathbf{erf}2(x),m=\lfloor 98.1029+0.49867p\rfloor
\\
3< x \leq 4 &,
\begin{cases}
q\leq 70&, \mathbf{erf}1(x) &, m=\lfloor 0.03074 + 0.02114p^2\rfloor
\\
q>70&, \mathbf{erf}2(x) &, m=\lfloor 130.000+0.55234p \rfloor
\end{cases}
\\
4< x \leq 5 &,
\begin{cases}
q\leq 110&, \mathbf{erf}1(x) &, m=\lfloor (0.119868p – 0.459333)^2 +2.409230\rfloor
\\
q>110&, \mathbf{erf}2(x) &, m=\lfloor 146.1909+ 0.607895p \rfloor
\end{cases}
\\
5< x \leq 10 &,
\begin{cases}
q\leq 450&, \mathbf{erf}1(x) &, m=\lfloor 0.003320773p^2-6.645615\rfloor
\\
q>450&, \mathbf{erf}2(x) &, m=\lfloor 493.4462 + 0.647483p \rfloor
\end{cases}
\\
10< x \leq 20 &,
\begin{cases}
q\leq 1790&, \mathbf{erf}1(x) &, m=\lfloor 0.0008286871p^2-25.99427\rfloor
\\
q>1790&, \mathbf{erf}2(x) &, m=\lfloor 1072.955+0.869305 p \rfloor
\end{cases}
\end{cases}
$$

因此,最终可以根据(3-7)结合性质(2)来进行误差函数计算。

线性分布离散流体力学控制方程

1 前言
作为力学出生的人,对自己力学专业的一些方程有特别的情感。因此这篇文章简单记录一下流体力学的几个方程,以及其在线性分布假设情况下的一种离散形式。

不管是无人驾驶当中的多传感器融合问题,还是力学模型仿真问题,它本身可以看成一个优化问题。既然是优化问题,就需要确定出优化变量以及变量之间的约束方程。整个模型可以看成一个大的优化模型,而变量之间通过约束相互耦合,进而所有变量通过约束相互影响力学中控制方程的离散形式,决定了约束方程建立的方式

在离散公式得出前,先约定如下变量含义:

\(\rho\): 密度,单位 \(kg/m^3\).
\(p\): 压力,单位\(Pa\).
\(e\): 单位质量内能,单位\(m^2/s^2\).
\(c\): 摩尔浓度,单位 \(mol/m^3\).
\(v_x\): \(x\)方向流速,单位\(m/s\).
\(v_y\): \(y\)方向流速,单位\(m/s\).
\(v_z\): \(z\)方向流速,单位\(m/s\).
\(v\):速度,其值满足\(v^2=v_x^2+v_y^2+v_z^2\).
\(g\): 重力加速度,单位 \(m/s^2\).
\(f_x\): \(x\)方向体积力加速度,单位\(m/s^2\).
\(f_y\): \(y\)方向体积力加速度,单位\(m/s^2\).
\(f_z\): \(z\)方向体积力加速度,单位\(m/s^2\).
\(T\):温度,单位°C.
\(k\):导热系数(thermal conductivity).
\(D\):溶质在液体里的扩散系数,单位为\(m^2/s\).
\(\mu\):运动粘度系数(molecular viscosity coefficient),单位为\(Pa \cdot s\).
\(\gamma\):体积粘度系数(bulk viscosity coefficient), 其值满足\(\gamma = -\dfrac{2}{3}\mu\).

2 线性分布假设
对于平面,可以将一个多边形区域,使用三角形单元进行网格划分。不失一般性,设三角形单元三个节点坐标为\((x_0,y_0)\)、\((x_1,y_1)\)、\((x_2,y_2)\),设某物理量(这里以压力为例)在三个节点上的值分别为\(p_0、p_1、p_2\)。现在假设物理量在三角形单元内为线性分布,即对三角形单元内任意一点\((x,y)\),其对应的物理量\(p\)满足如下形式  
(2-1)
$$
p=a_p x + b_b y + c_p
$$
公式里\(a_p、b_p、c_p\)为变量\(p\)在单元里的线性分布系数。这里设置如下矩阵\(M\)  
(2-2)
$$
M = \begin{bmatrix}
x_0 & y_0 & 1
\\
x_1 & y_1 & 1
\\
x_2 & y_2 & 1
\end{bmatrix}
$$
则系数\((a_p,b_p,c_p)\)可以用如下形式表示  
(2-3)
$$
\begin{bmatrix}
a_p
\\
b_p
\\
c_p
\end{bmatrix} = M^{-1}
\begin{bmatrix}
p_0
\\
p_1
\\
p_2
\end{bmatrix}
$$
这里,设三角形单元形心坐标为  
(2-4)
$$
\begin{cases}
x_c=\dfrac{x_0+x_1+x_2}{3}
\\
y_c=\dfrac{y_0+y_1+y_2}{3}
\end{cases}
$$
然后,设置如下中间变量  
(2-5)
$$
\mathbf{m}^T =\begin{bmatrix}m_0 & m_1 & m_2 \end{bmatrix}= \begin{bmatrix}
x_c & y_c & 1
\end{bmatrix}M^{-1}
$$
则形心上的物理量\(p_c\)可表示为  
(2-6)
$$
\begin{aligned}
p_c &= a_p x_c+b_py_c+c_p
\\
&=\begin{bmatrix}
x_c & y_c & 1
\end{bmatrix}M^{-1}
\begin{bmatrix}
p_0
\\
p_1
\\
p_2
\end{bmatrix}
\\
&=m_0p_0+m_1p_1+m_2p_2
\end{aligned}
$$
很明显,(2-6)显示了形心上的物理量与三个节点上物理量的关系。

进一步,结合(2-1)到(2-6),很明显如下偏导成立  
(2-7)
$$
\begin{cases}
\dfrac{\partial p_c}{\partial x} = a_p
\\
\\
\dfrac{\partial p_c}{\partial y} = b_p
\\
\\
\dfrac{\partial p_c}{\partial p_0} = m_0
\\
\\
\dfrac{\partial p_c}{\partial p_1} = m_1
\\
\\
\dfrac{\partial p_c}{\partial p_2} = m_2
\\
\\
\dfrac{\partial p_c}{\partial t} = m_0\dfrac{\partial p_0}{\partial t} + m_1\dfrac{\partial p_1}{\partial t} + m_2\dfrac{\partial p_2}{\partial t}
\end{cases}
$$
根据线性分布假设,结合(2-7)可以得出\(m_0+m_1+m_2=1\)。

另外,在计算中,可能涉及到系数\(a_p、b_p、c_p\)对变量\(p_0、p_1、p_2\)求导的情况,因此根据(2-3)可以得到  
(2-8)
$$
\begin{bmatrix}
\dfrac{\partial a_p}{\partial p_0} & \dfrac{\partial a_p}{\partial p_1} & \dfrac{\partial a_p}{\partial p_2}
\\
\\
\dfrac{\partial b_p}{\partial p_0} & \dfrac{\partial b_p}{\partial p_1} & \dfrac{\partial b_p}{\partial p_2}
\\
\\
\dfrac{\partial c_p}{\partial p_0} & \dfrac{\partial c_p}{\partial p_1} & \dfrac{\partial c_p}{\partial p_2}
\end{bmatrix}=M^{-1}
$$

同理,对于密度、速度物理量在三角形单元内均做线性分布假设,则有上面类似的结论。这里假设密度的线性分布系数为\((a_\rho,b_\rho,c_\rho)\),\(x\)方向流速线性分布系数为\((a_x,b_x,c_x)\),\(y\)方向流速线性分布系数为\((a_y,b_y,c_y)\).


3 控制方程
这里的控制方程,是指物质点上物理量需要满足的约束方程。为了简化计算,一般会在空间中选取多个控制点(比如常见的单元上的节点),让控制点满足某些约束,而控制点之间通过某种方式进行关联起来,进而可以模拟一个较大区域的物理变化情况。流体力学中,一般涉及到质量守恒、动量守恒、能量守恒控制方程,有时也会使用扩散方程,或者其它形式的控制方程。

 3.1 质量守恒

质量守恒方程也叫连续性方程,这个控制方程描述了任意微元流体在流动过程中质量保持不变的性质。这里使用文献[1]里的守恒型质量控制方程来描述
(3.1-1)
$$
\dfrac{\partial \rho}{\partial t} + \dfrac{\partial(\rho v_x)}{\partial x} + \dfrac{\partial(\rho v_y)}{\partial y} + \dfrac{\partial(\rho v_z)}{\partial z} = 0
$$
对于二维情况,可以得到如下变量表达式  
(3.1-2)
$$
\begin{aligned}
0&=\dfrac{\partial \rho}{\partial t}+\dfrac{\partial(\rho v_x)}{\partial x}+\dfrac{\partial(\rho v_y)}{\partial y}
\\
&=\dfrac{\partial \rho}{\partial t}+v_x\dfrac{\partial \rho}{\partial x}+v_y\dfrac{\partial \rho}{\partial y}+\rho(\dfrac{\partial v_x}{\partial x}+\dfrac{\partial v_y}{\partial y})
\end{aligned}
$$
因此,对二维模型使用线性分布假设,则可以得到如下的质量守恒方程
(3.1-3)
$$
\dfrac{\partial \rho}{\partial t} + v_x a_\rho + v_y b_\rho + \rho(a_x+b_y)=0
$$

 

 3.2 动量守恒

动量守恒方程也叫运动方程,流体的动量守恒方程描述了流体总动量保持不变的特性。这里使用文献[1]里的守恒型动量控制方程来描述
(3.2-1)
$$
\begin{cases}
\dfrac{\partial (\rho v_x)}{\partial t} + \dfrac{\partial(\rho v_x v_x)}{\partial x} + \dfrac{\partial(\rho v_x v_y)}{\partial y} + \dfrac{\partial(\rho v_x v_z)}{\partial z} = -\dfrac{\partial p}{\partial x} + \dfrac{\partial \tau_{xx}}{\partial x} + \dfrac{\partial \tau_{yx}}{\partial y} + \dfrac{\partial \tau_{zx}}{\partial z} + \rho f_x
\\
\\
\dfrac{\partial (\rho v_y)}{\partial t} + \dfrac{\partial(\rho v_y v_x)}{\partial x} + \dfrac{\partial(\rho v_y v_y)}{\partial y} + \dfrac{\partial(\rho v_y v_z)}{\partial z} = -\dfrac{\partial p}{\partial y} + \dfrac{\partial \tau_{xy}}{\partial x} + \dfrac{\partial \tau_{yy}}{\partial y} + \dfrac{\partial \tau_{zy}}{\partial z} + \rho f_y
\\
\\
\dfrac{\partial (\rho v_z)}{\partial t} + \dfrac{\partial(\rho v_z v_x)}{\partial x} + \dfrac{\partial(\rho v_z v_y)}{\partial y} + \dfrac{\partial(\rho v_z v_z)}{\partial z} = -\dfrac{\partial p}{\partial z} + \dfrac{\partial \tau_{xz}}{\partial x} + \dfrac{\partial \tau_{yz}}{\partial y} + \dfrac{\partial \tau_{zz}}{\partial z} + \rho f_z
\end{cases}
$$
上面公式中\(\tau_{xx}、\tau_{yy}、\tau_{zz}、\tau_{xy}、\tau_{yx}、\tau_{xz}、\tau_{zx}、\tau_{yz}、\tau_{zy}\)取如下值  
(3.2-2)
$$
\begin{cases}
\tau_{xx} = 2\mu \dfrac{\partial v_x}{\partial x} + \gamma(\dfrac{\partial v_x}{\partial x} + \dfrac{\partial v_y}{\partial y} + \dfrac{\partial v_z}{\partial z})
\\
\\
\tau_{yy} = 2\mu \dfrac{\partial v_y}{\partial y} + \gamma(\dfrac{\partial v_x}{\partial x} + \dfrac{\partial v_y}{\partial y} + \dfrac{\partial v_z}{\partial z})
\\
\\
\tau_{zz} = 2\mu \dfrac{\partial v_z}{\partial z} + \gamma(\dfrac{\partial v_x}{\partial x} + \dfrac{\partial v_y}{\partial y} + \dfrac{\partial v_z}{\partial z})
\\
\\
\tau_{xy} = \tau_{yx}=\mu(\dfrac{\partial v_x}{\partial y} + \dfrac{\partial v_y}{\partial x})
\\
\\
\tau_{yz} = \tau_{zy}=\mu(\dfrac{\partial v_y}{\partial z} + \dfrac{\partial v_z}{\partial y})
\\
\\
\tau_{zx} = \tau_{xz}=\mu(\dfrac{\partial v_z}{\partial x} + \dfrac{\partial v_x}{\partial z})
\end{cases}
$$

对于2维情况,且y取竖直方向,则可简化为如下公式  
(3.2-3)
$$
\begin{cases}
v_x\dfrac{\partial \rho}{\partial t}+\rho\dfrac{\partial v_x}{\partial t}
+v_x^2\dfrac{\partial \rho}{\partial x}+2\rho v_x\dfrac{\partial v_x}{\partial x}+v_xv_y\dfrac{\partial\rho}{\partial y}+\rho(v_y\dfrac{\partial v_x}{\partial y}+ v_x\dfrac{\partial v_y}{\partial y}) = -\dfrac{\partial p}{\partial x} + \dfrac{\partial \tau_{xx}}{\partial x} + \dfrac{\partial \tau_{yx}}{\partial y}
\\
\\
v_y\dfrac{\partial \rho}{\partial t}+\rho\dfrac{\partial v_y}{\partial t}+
v_y^2\dfrac{\partial \rho}{\partial y}+2\rho v_y\dfrac{\partial v_y}{\partial y}+v_xv_y\dfrac{\partial \rho}{\partial x}+\rho(v_y\dfrac{\partial v_x}{\partial x}+v_x\dfrac{\partial v_y}{\partial x})= -\dfrac{\partial p}{\partial y} + \dfrac{\partial \tau_{xy}}{\partial x} + \dfrac{\partial \tau_{yy}}{\partial y} + \rho g
\end{cases}
$$

这里使用线性假设分布,因为速度满足线性分布假设,则可以得到  
(3.2-4)
$$
\dfrac{\partial \tau_{xx}}{\partial x}=0,
\dfrac{\partial \tau_{yy}}{\partial y}=0,
\dfrac{\partial \tau_{xy}}{\partial x}=0,
\dfrac{\partial \tau_{yx}}{\partial y}=0
$$

因此,对二维模型使用线性分布假设,结合(3.2-3)、(3.2-4)可以得到如下动量守恒方程
(3.2-5)
$$
\begin{cases}
v_x\dfrac{\partial \rho}{\partial t}+\rho\dfrac{\partial v_x}{\partial t}+v_x^2 a_\rho+2\rho v_x a_x + v_xv_yb_\rho+\rho(v_yb_x+v_xb_y)+a_p = 0
\\
\\
v_y\dfrac{\partial \rho}{\partial t}+\rho\dfrac{\partial v_y}{\partial t}+v_y^2b_\rho+2\rho v_yb_y+v_xv_ya_\rho+\rho(v_ya_x+v_xa_y)+b_p-\rho g = 0
\end{cases}
$$

 

3.3 能量守恒

能量守恒也叫能量方程,是指在考虑流速、密度、温度、内能变化时, 微元流体总能量不变的特性。对于能量方程,这里采用[1]里的守恒型能量控制方程来描述
(3.3-1)
$$
\begin{aligned}
&\dfrac{\partial}{\partial t}(\rho (e + v^2/2)) + \dfrac{\partial}{\partial x}(\rho (e + v_x v^2/2)) + \dfrac{\partial}{\partial y}(\rho (e + v_y v^2/2))+ \dfrac{\partial}{\partial z}(\rho (e + v_z v^2/2))\\=&\rho q-\dfrac{\partial (pv_x)}{\partial x} -\dfrac{\partial (pv_y)}{\partial y} -\dfrac{\partial (pv_z)}{\partial z}
\\
&+ \rho(f_xv_x + f_yv_y+f_zv_z)
\\
&+\dfrac{\partial}{\partial x}(k\dfrac{\partial T}{\partial x}) + \dfrac{\partial}{\partial y}(k\dfrac{\partial T}{\partial y})+ \dfrac{\partial}{\partial z}(k\dfrac{\partial T}{\partial z})
\\
&+\dfrac{\partial (v_x \tau_{xx})}{\partial x} +\dfrac{\partial (v_x \tau_{yx})}{\partial y} +\dfrac{\partial (v_x \tau_{zx})}{\partial z}
\\
&+\dfrac{\partial (v_y \tau_{xy})}{\partial x} +\dfrac{\partial (v_y \tau_{yy})}{\partial y} +\dfrac{\partial (v_y \tau_{zy})}{\partial z}
\\
&+\dfrac{\partial (v_z \tau_{xz})}{\partial x} +\dfrac{\partial (v_z \tau_{yz})}{\partial y} +\dfrac{\partial (v_z \tau_{zz})}{\partial z}
\end{aligned}
$$
上面公式里\(q\)为单位质量体积热能变化率,其在 \(x,y,z\)三个方向的分量分别为
(3.3-2)
$$
\begin{cases}
q_x = -k\dfrac{\partial T}{\partial x}
\\
\\
q_y = -k\dfrac{\partial T}{\partial y}
\\
\\
q_z = -k\dfrac{\partial T}{\partial z}
\end{cases}
$$
对于常温的二维模型,(3.3-1)可变为如下形式  
(3.3-3)
$$
\begin{aligned}
&\dfrac{\partial}{\partial t}(\rho (e + v^2/2)) + \dfrac{\partial}{\partial x}(\rho (e + v_x v^2/2)) + \dfrac{\partial}{\partial y}(\rho (e + v_y v^2/2))
\\=&-\dfrac{\partial (pv_x)}{\partial x} -\dfrac{\partial (pv_y)}{\partial y} 
+\dfrac{\partial (v_x \tau_{xx})}{\partial x} +\dfrac{\partial (v_x \tau_{yx})}{\partial y}
+\dfrac{\partial (v_y \tau_{xy})}{\partial x} +\dfrac{\partial (v_y \tau_{yy})}{\partial y} + \rho g v_y
\\
=&\dfrac{\partial (v_x \tau_{xx}+v_y\tau_{xy} – pv_x)}{\partial x}+\dfrac{\partial (v_y \tau_{yy}+v_x\tau_{yx} – pv_y)}{\partial y}+\rho g v_y
\end{aligned}
$$
因此,对于二维模型,使用线性分布假设,由(3.3-3)可以得到能量守恒方程
(3.3-4)
$$
\begin{aligned}
&\dfrac{\partial}{\partial t}(\rho (e + v^2/2)) + \rho (\dfrac{\partial e}{\partial x} + \dfrac{\partial e}{\partial y})\\=
&-(p(a_x+b_y)+v_xp_a+v_yp_b)
\\
&-a_\rho(e+v_xv^2/2) – b_\rho(e+v_yv^2/2) – \dfrac{\rho}{2}(3a_xv_x^2+a_xv_y^2+2a_yv_xv_y + 3b_y^2v_y^2+b_yv_x^2+2v_xv_yb_x)
\\
&+a_x\tau_{xx}+b_x\tau_{xy}+a_y\tau{xy}+b_y\tau_{yy}+\rho g v_y
\end{aligned}
$$

 

3.4 扩散方程
扩散方程表征了流动系统的质量传递规律,这里将文献[2]里的数学模型进行速度梯度项扩展来描述
(3.4-1)
$$
\dfrac{\partial c}{\partial t} + c(\dfrac{\partial v_x}{\partial x}+ \dfrac{\partial v_y}{\partial y} + \dfrac{\partial v_z}{\partial z})+(v_x\dfrac{\partial c}{\partial x}+ v_y\dfrac{\partial c}{\partial y} + v_z\dfrac{\partial c}{\partial z})=D(\dfrac{\partial^2 c}{\partial x^2}+\dfrac{\partial^2 c}{\partial y^2}+\dfrac{\partial^2 c}{\partial z^2})
$$

而对于二维情况,可以得到如下模型

(3.4-2)
$$
\dfrac{\partial c}{\partial t} + c(\dfrac{\partial v_x}{\partial x}+ \dfrac{\partial v_y}{\partial y})+(v_x\dfrac{\partial c}{\partial x}+ v_y\dfrac{\partial c}{\partial y})=D(\dfrac{\partial^2 c}{\partial x^2}+\dfrac{\partial^2 c}{\partial y^2})
$$
在方程里,由于涉及到摩尔浓度,而浓度一般和密度有很好的相关性,因此这里使用
盐水浓度与密度关系[3]里的二阶模型将浓度与密度进行关联。即浓度与密度满足如下方程  
(3.4-3)
$$
c = b_0 + b_1\rho + b_2\rho^2
$$
这里取如下中间变量  
(3.4-4)
$$
\eta=\dfrac{\partial c}{\partial \rho} = b_1+2b_2\rho
$$
进而可以使用密度替换掉浓度变量,这里将(3.4-3)与(3.4-4)代入(3.4-2)有  
(3.4-5)
$$
\eta \dfrac{\partial \rho}{\partial t}+c(\dfrac{\partial v_x}{\partial x}+\dfrac{\partial v_y}{\partial y})+\eta(v_x\dfrac{\partial \rho}{\partial x}+v_y\dfrac{\partial \rho}{\partial y})=D(\partial(\eta\dfrac{\rho}{\partial x})/\partial x+\partial(\eta\dfrac{\rho}{\partial y})/\partial y)
$$

因为假设密度满足线性分布,因此密度对位置的二阶导为0,因此上式可以变为  
(3.4-6)
$$
\begin{aligned}
\eta \dfrac{\partial \rho}{\partial t}+c(\dfrac{\partial v_x}{\partial x}+\dfrac{\partial v_y}{\partial y})+\eta(v_x\dfrac{\partial \rho}{\partial x}+v_y\dfrac{\partial \rho}{\partial y})&=D(\partial(\eta\dfrac{\rho}{\partial x})/\partial x+\partial(\eta\dfrac{\rho}{\partial y})/\partial y)
\\
&=D(\dfrac{\partial \eta}{\partial x}\dfrac{\partial \rho}{\partial x}+\dfrac{\partial \eta}{\partial y}\dfrac{\partial \rho}{\partial y})
\\
&=2b_2D((\dfrac{\partial \rho}{\partial x})^2+(\dfrac{\partial \rho}{\partial y})^2)
\end{aligned}
$$

为了让方程误差量级尽量与(3.1-3)一致,这里根据(3.4-6)建立如下约束方程 
(3.4-7)
$$
\dfrac{\partial \rho}{\partial t}+\dfrac{c}{\eta}(\dfrac{\partial v_x}{\partial x}+\dfrac{\partial v_y}{\partial y})+(v_x\dfrac{\partial \rho}{\partial x}+v_y\dfrac{\partial \rho}{\partial y})
-\dfrac{2b_2D}{\eta} ((\dfrac{\partial \rho}{\partial x})^2+(\dfrac{\partial \rho}{\partial y})^2)=0
$$
最终代入线性分布系数可以得到扩散方程  
(3.4-8)
$$
\dfrac{\partial \rho}{\partial t}+\dfrac{c}{\eta}(a_x+b_y)+v_xa_\rho+v_yb_\rho-\dfrac{2b_2D}{\eta}(a_\rho^2+b_\rho^2)=0
$$

 

4 方程离散

上面的公式(3.1-3)、(3.2-5)、(3.3-4)、(3.4-8)为需要离散的控制方程。可以发现,这几个公式,因为线性假设的关系,已经没有对位置偏导项的存在。这时仅需考虑对时间项的偏导处理,而时间偏导可以用差分代替。

由于(3.1-3)反映了质量守恒规律,而(3.4-8)反映了质量传递规律,因此在实际使用中按情况可使用其中一个方程。而公式(3.3-4)为能量守恒方程,在考虑温度与能量情况下,需要对此方程进行离散,否则就不需要离散。

接下来,本文将提供一种显示离散方式,其中使用前(后)差分格式代替求导。在提供离散公式前,这里约定:\(t_1=t_0+\delta t\),其中\(\delta t\)表示时间步长,变量带上划线表示\(t_1\)时刻的值,变量不带上划线表示\(t_0\)时刻的值。例如,在时刻\(t_0\)时,压力、密度、\(x\)方向速度、\(y\)方向速度变量为\(p、\rho、v_x、v_y\);在\(t_1\)时,压力、密度、\(x\)方向速度、\(y\)方向速度变量为\(\bar{p}、\bar{\rho}、\bar{v}_x、\bar{v}_y\)。

 4.1 密度求解

如果不考虑浓度梯度引起的质量传递,则在\(t_0\)时刻,物理变量需要满足控制方程(3.1-3),即  
(4.1-1)
$$
\begin{aligned}
0 &= \dfrac{\partial \rho}{\partial t} + v_xa_\rho+v_yb_\rho+\rho(a_x+b_y)
\\
&=\dfrac{\bar{\rho}-\rho}{\delta t} + v_xa_\rho+v_yb_\rho+\rho(a_x+b_y)
\end{aligned}
$$
由上面公式可以得到  
(4.1-2)
$$
\bar{\rho} = \rho – \delta t(v_xa_\rho+v_yb_\rho+\rho(a_x+b_y))
$$

如果考虑浓度梯度引起的质量传递,则在\(t_0\)时刻,物理变量需要满足控制方程(3.4-8),即  
(4.1-3)
$$
\begin{aligned}
0 &= \dfrac{\partial \rho}{\partial t} + \dfrac{c}{\eta}(a_x+b_y)+v_xa_\rho+v_yb_\rho-\dfrac{2b_2D}{\eta}(a_\rho^2+b_\rho^2)
\\
&= \dfrac{\bar{\rho} – \rho}{\delta t} + \dfrac{c}{\eta}(a_x+b_y)+v_xa_\rho+v_yb_\rho-\dfrac{2b_2D}{\eta}(a_\rho^2+b_\rho^2)
\end{aligned}
$$
由上面公式可以得到  
(4.1-4)
$$
\bar{\rho}=\rho + \delta t(\dfrac{c}{\eta}(a_x+b_y)+v_xa_\rho+v_yb_\rho-\dfrac{2b_2D}{\eta}(a_\rho^2+b_\rho^2))
$$

 

4.2 速度求解
在\(t_0\)时刻,物理变量需要满足控制方程(3.2-5),即  
(4.2-1)
$$
\begin{cases}
\begin{aligned}
0&=v_x\dfrac{\partial \rho}{\partial t}+\rho\dfrac{\partial v_x}{\partial t}+v_x^2 a_\rho+2\rho v_x a_x + v_xv_yb_\rho+\rho(v_yb_x+v_xb_y)+a_p 
\\
&=v_x \dfrac{\bar{\rho} – \rho}{\delta t} + \rho \dfrac{\bar{v}_x – v_x}{\delta t}+v_x^2 a_\rho+2\rho v_x a_x + v_xv_yb_\rho+\rho(v_yb_x+v_xb_y)+a_p 
\\
\\
0&=v_y\dfrac{\partial \rho}{\partial t}+\rho\dfrac{\partial v_y}{\partial t}+v_y^2b_\rho+2\rho v_yb_y+v_xv_ya_\rho+\rho(v_ya_x+v_xa_y)+b_p-\rho g
\\
&=v_y \dfrac{\bar{\rho} – \rho}{\delta t} + \rho \dfrac{\bar{v}_y-v_y}{\delta t}+v_y^2b_\rho+2\rho v_yb_y+v_xv_ya_\rho+\rho(v_ya_x+v_xa_y)+b_p-\rho g
\end{aligned}
\end{cases}
$$

由上面公式可以得到  
(4.2-2)
$$
\begin{cases}
\begin{aligned}
\bar{v}_x &= v_x – \dfrac{1}{\rho}(v_x(\bar{\rho} – \rho) + \delta t (v_x^2 a_\rho+2\rho v_x a_x + v_xv_yb_\rho+\rho(v_yb_x+v_xb_y)+a_p))
\\
\bar{v}_y &= v_y – \dfrac{1}{\rho}(v_y(\bar{\rho} – \rho) + \delta t(v_y^2b_\rho+2\rho v_yb_y+v_xv_ya_\rho+\rho(v_ya_x+v_xa_y)+b_p-\rho g))
\end{aligned}
\end{cases}
$$


4.3 压力梯度求解
在\(t_1\)时刻,物理变量需要满足控制方程(3.2-5),即  
(4.3-1)
$$
\begin{cases}
\begin{aligned}
0&=\bar{v}_x\dfrac{\partial \bar{\rho}}{\partial t}+\bar{\rho}\dfrac{\partial \bar{v}_x}{\partial t}+\bar{v}_x^2 \bar{a}_\rho+2\bar{\rho} \bar{v}_x \bar{a}_x + \bar{v}_x\bar{v}_y\bar{b}_\rho+\bar{\rho}(\bar{v}_y\bar{b}_x+\bar{v}_x\bar{b}_y)+\bar{a}_p
\\
&=\bar{v}_x\dfrac{\bar{\rho} – \rho}{\delta t}+\bar{\rho}\dfrac{\bar{v}_x – v_x}{\delta t}+\bar{v}_x^2 \bar{a}_\rho+2\bar{\rho} \bar{v}_x \bar{a}_x + \bar{v}_x\bar{v}_y\bar{b}_\rho+\bar{\rho}(\bar{v}_y\bar{b}_x+\bar{v}_x\bar{b}_y)+\bar{a}_p
\\
\\
0&=\bar{v}_y\dfrac{\partial \bar{\rho}}{\partial t}+\bar{\rho}\dfrac{\partial \bar{v}_y}{\partial t}+\bar{v}_y^2\bar{b}_\rho+2\bar{\rho} \bar{v}_y\bar{b}_y+\bar{v}_x\bar{v}_y\bar{a}_\rho+\bar{\rho}(\bar{v}_y\bar{a}_x+\bar{v}_x\bar{a}_y)+\bar{b}_p-\bar{\rho} g
\\
&=\bar{v}_y\dfrac{\bar{\rho} – \rho}{\delta t}+\bar{\rho}\dfrac{\bar{v}_y – v_y}{\delta t}+\bar{v}_y^2\bar{b}_\rho+2\bar{\rho} \bar{v}_y\bar{b}_y+\bar{v}_x\bar{v}_y\bar{a}_\rho+\bar{\rho}(\bar{v}_y\bar{a}_x+\bar{v}_x\bar{a}_y)+\bar{b}_p-\bar{\rho} g
\end{aligned}
\end{cases}
$$

由上面公式可以得到  
(4.3-2)
$$
\begin{cases}
\begin{aligned}
\bar{a}_p &=-(\bar{v}_x\dfrac{\bar{\rho} – \rho}{\delta t}+\bar{\rho}\dfrac{\bar{v}_x – v_x}{\delta t}+\bar{v}_x^2 \bar{a}_\rho+2\bar{\rho} \bar{v}_x \bar{a}_x + \bar{v}_x\bar{v}_y\bar{b}_\rho+\bar{\rho}(\bar{v}_y\bar{b}_x+\bar{v}_x\bar{b}_y))
\\
\\
\bar{b}_p &= \bar{\rho} g – (\bar{v}_y\dfrac{\bar{\rho} – \rho}{\delta t}+\bar{\rho}\dfrac{\bar{v}_y – v_y}{\delta t}+\bar{v}_y^2\bar{b}_\rho+2\bar{\rho} \bar{v}_y\bar{b}_y+\bar{v}_x\bar{v}_y\bar{a}_\rho+\bar{\rho}(\bar{v}_y\bar{a}_x+\bar{v}_x\bar{a}_y))
\end{aligned}
\end{cases}
$$

 

5 过程求解

5.1 控制方程

这里使用三角形单元对平面进行单元划分,所有待求解物理量均挂在单元节点上,然后单元内的变量符合线性分布假设。

这里的边界条件有速度边界与密度(浓度)边界条件。因此求解就变成了对每个迭代步\(\delta t\)求解。

通过观察4里的离散方程: (1)对于质量方程这里考虑浓度,因此使用公式(4.1-4)来对密度进行更新,当然,如果不考虑浓度,也可以使用公式(4.1-2)来对密度进行更新; (2)速度的更新使用公式(4.2-2);(3) 而对于压力则不直接更新,这里只更新压力梯度,因为在公式里,只要知道每个时刻压力梯度,则密度、速度就能完全关联起来,因此对于压力梯度的更新使用公式(4.3-2)

因此,最终需要求解的变量为:密度、速度、压力梯度

 

5.2 常规求解

上面的离散公式均是针对单元内某个点的离散公式,也就是说单元内的点位上的物理属性满足上面的控制方程。不失一般性,这里设单元形心点位上的物理量满足上述控制方程。而形心上的物理量,可以直接使用类似(2-6)的公式来表示,因此最终将所有方程组合在一起,将求解一个大型稀疏线性方程组

 

5.3 加速递推求解

每次迭代求解时,如果均需要求解一个大型稀疏线性方程组,消耗的时间与计算成本较高。那是否可以规避求解一个大型稀疏线性方程组,而直接求解这些控制方程呢?答案是可以的。

通过观察(4.1-4)可以发现,当知道\(t_0\)时刻的物理量,那通过(4.1-4)则可以得到\(t_1\)时刻每个单元中心点的密度\(\bar{\rho}\)。注意,这时只得到\(t_1\)时刻单元中心点的密度,而单元当前密度分布系数以及各个节点的密度值并不知道。然而,单元密度有线性分布的假设,在\(t_1\)时刻,只要知道单元上任意两个节点的密度,那结合单元中心点的密度值,就可以得到单元密度的线性分布系数,进而第三个节点的密度值可以通过分布系数计算出来,也就是说,对每个单元,只要确定了单元相邻的任意两个节点上的密度,那这个单元的密度分布系数以及相连的三个节点密度就可以确定下来。只要有一个单元的两个节点有密度边界约束,那这个单元的所有节点密度就可以确定下来,而和这个单元有共同边的单元,因为共同边上的节点密度已经计算出,因此共同边所在的单元也能确定出所有节点密度,进而通过单元拓扑关系,所有连通域的单元密度均能确定下来。

当所有单元在\(t_1\)时刻的密度以及密度线性分布系数确定下来后,可以通过(4.2-2)确定出每个单元\(t_1\)时刻形心点的速度值。和密度节点更新类似,使用速度边界,然后根据拓扑关系,可以更新所有单元在\(t_1\)时刻的速度以及速度线性分布系数。

而对于\(t_1\)时刻的压力梯度,则对每个单元直接使用(4.3-2)进行更新。由于更新的是单元内压力梯度值,因此不需要再通过拓扑关系进行更新压力。

最终由\(t_0\)时刻迭代到\(t_1\)时刻的密度、速度、压力梯度值,按如下步骤计算

step1:使用(5.3-1)更新中心密度,接着通过密度(浓度)边界条件启动计算边界节点密度,然后通过拓扑关系更新所有节点密度。

(5.3-1)

$$
\bar{\rho}=\rho + \delta t(\dfrac{c}{\eta}(a_x+b_y)+v_xa_\rho+v_yb_\rho-\dfrac{2b_2D}{\eta}(a_\rho^2+b_\rho^2))
$$

step2:使用(5.3-2)更新中心速度,接着通过速度边界条件启动计算边界节点速度,然后通过拓扑关系更新所有节点速度。

(5.3-2)
$$
\begin{cases}
\begin{aligned}
\bar{v}_x &= v_x – \dfrac{1}{\rho}(v_x(\bar{\rho} – \rho) + \delta t (v_x^2 a_\rho+2\rho v_x a_x + v_xv_yb_\rho+\rho(v_yb_x+v_xb_y)+a_p))
\\
\bar{v}_y &= v_y – \dfrac{1}{\rho}(v_y(\bar{\rho} – \rho) + \delta t(v_y^2b_\rho+2\rho v_yb_y+v_xv_ya_\rho+\rho(v_ya_x+v_xa_y)+b_p-\rho g))
\end{aligned}
\end{cases}
$$

step3:使用(5.3-3)更新压力梯度。

(5.3-3)
$$
\begin{cases}
\begin{aligned}
\bar{a}_p &=-(\bar{v}_x\dfrac{\bar{\rho} – \rho}{\delta t}+\bar{\rho}\dfrac{\bar{v}_x – v_x}{\delta t}+\bar{v}_x^2 \bar{a}_\rho+2\bar{\rho} \bar{v}_x \bar{a}_x + \bar{v}_x\bar{v}_y\bar{b}_\rho+\bar{\rho}(\bar{v}_y\bar{b}_x+\bar{v}_x\bar{b}_y))
\\
\\
\bar{b}_p &= \bar{\rho} g – (\bar{v}_y\dfrac{\bar{\rho} – \rho}{\delta t}+\bar{\rho}\dfrac{\bar{v}_y – v_y}{\delta t}+\bar{v}_y^2\bar{b}_\rho+2\bar{\rho} \bar{v}_y\bar{b}_y+\bar{v}_x\bar{v}_y\bar{a}_\rho+\bar{\rho}(\bar{v}_y\bar{a}_x+\bar{v}_x\bar{a}_y))
\end{aligned}
\end{cases}
$$

注意

(1) 这里提到的拓扑关系求解,需要使用外部边界条件进行启动(密度速度边界),另外需要模型在一个连通域内,并且这种求解方式:对于5.2中建立的大型非线性稀疏方程组,如果这个线性方程组是满秩的,则两种方法求到的结果是一致的。

(2) 5.3的方法不需要求解大型稀疏线性方程组,它本身是一种递推求解,因此也适合多线程加速求解,其求解效率上要比直接求解线性方程组效率高。

 

6 后话

力学仿真,控制方程虽然是核心,但是非规则模型、网格划分、单元预处理、网格单元自动增删、以及特殊边界处理、以及能量沙漏(固体力学)、边界反射(固体力学)、求解计算等问题,可能会被大部分研究者给忽视,但是对一个完整的仿真系统而言,有时一个细小处理过程的差异会引导着结果朝不可预期的方向发展。


参考
[1] https://users.metu.edu.tr/csert/me582/ME582%20Ch%2001.pdf

[2] https://cushman.host.dartmouth.edu/courses/engs43/Diffusion-Advection.pdf

[3] 盐水浓度与密度关系