MathSword 小型数值计算软件

简介

这是一款专门针对数据处理而开发的小型数值计算软件,其本身小巧、绿色、免费,且易于使用。可解决常规数值计算的一些计算问题。

其本身以命令行输入调用函数方式进行数据处理(目前支持大约1760个函数),对于一些特殊功能开发了对应处理窗口,以方便调用。

PS:

1. 您如果有什么好的建议,欢迎给我发邮件 shikang999@126.com

2. 程序运行中出现找不到dll模块的提示,可自行下载 Microsoft Visual c++ 2022(vc2022运行库) x86/x64库进行安装。

下载

MathSword.x64

MathSword.x86

教程

1. 基础操作

2. 线性/非线性规划求解

3. 非线性拟合

4. 非线性方程组求解

5. 数学公式搜索

6. 神经网络拟合

7. 曲线数据提取

8. 启发式求解器

9. 分段多项式拟合

10. 数据降噪与滤波器设计

功能

(1)常规的矩阵运算

(2)线性/非线性 方程组求解

(3)线性/非线性 规划

(4)线性稀疏矩阵求解

(5)常微分方程组求解

(6)一维、二维、多维数据插值

(7)一维、二维、三维定积分

(8)一维、二维、三维作图(曲线、云图)

(9)非线性数据拟合、公式查找、网络建模计算

(10)数据变换(傅里叶、Haar小波…)

(11)数据平滑、微分

(12)多项式计算

(13)大数、复数计算

(14)一些简单的符号计算

(15) 大部分特殊函数计算(贝塞尔函数、椭圆积分函数、雅克比函数、超几何函数、误差函数、Airy函数、Zeta函数等等)

(16)曲线扣图、曲线数据快速处理

(17)一些其它数据处理的相关计算

带约束多项式曲线拟合三

1 问题
平面上有两个点\((0,0),(\bar{x},\bar{y})\),其中\(\bar{x}\neq 0\)。现在需要构建一条满足如下条件的多项式曲线方程
① 曲线必须过\((0,0),(\bar{x},\bar{y})\)点。
② 曲线在\((0,0),(\bar{x},\bar{y})\)点处的斜率尽量逼近\(k_0,k_1\)。且每个点在整体误差权重占比为\(w_0,w_1\)。
③ 曲线在\((0,0),(\bar{x},\bar{y})\)之间逼近直线。

也就是说,想找一条曲线,使得曲线过两端点,使得曲线在两个端点处斜率尽量与指定值保持一致,且在两个端点内尽量逼近直线。

2 求解
这里设曲线为\(n\)次多项式
(1)
$$
y=a_1x+a_2x^2+…+a_nx^n
$$
明显上面方程过\((0,0)\)点,根据曲线必须过\((\bar{x},\bar{y})\)可以得到
(2)
$$
a_1=\dfrac{\bar{y}}{\bar{x}}-(a_2\bar{x} + a_3\bar{x}^2+…+a_n\bar{x}^{n-1})
$$
对于第②③个条件,这里以最小二乘思想求解。设在区间\((0,\bar{x})\)内均匀采样\(m-1\)个点,每个点贡献权重为\(w\),则可构建如下最小化目标函数
(3)
$$
\begin{aligned}
\mathbf{min}:e&=w_0^2(a_1-k_0)^2+w_1^2(a_1+2a_2\bar{x}+3a_3\bar{x}^2+…+(n-1)\bar{x}^{n-1}-k_1)^2+\dfrac{w^2}{m-1}\sum_{i=1}^{m-1}(a_1\dfrac{i}{m}\bar{x}+a_2(\dfrac{i}{m}\bar{x})^2+a_3(\dfrac{i}{m}\bar{x})^3+…+a_n(\dfrac{i}{m}\bar{x})^n-\dfrac{i}{m}\bar{y})^2
\\
\\
&=w_0^2(a_2\bar{x}+a_3\bar{x}^2+…+a_n\bar{x}^{n-1}+k_0-\dfrac{\bar{y}}{\bar{x}})^2
\\
\\
&+w_1^2(a_2\bar{x}+2a_3\bar{x}^2+…+(n-1)a_n\bar{x}^{n-1}+\dfrac{\bar{y}}{\bar{x}}-k_1)^2
\\
\\
&+\dfrac{w^2}{m-1}\sum_{i=1}^{m-1}(a_2((\dfrac{i}{m})^2-\dfrac{i}{m})\bar{x}^2+a_3((\dfrac{i}{m})^3-\dfrac{i}{m})\bar{x}^3+…+a_n((\dfrac{i}{m})^n-\dfrac{i}{m})\bar{x}^n)^2
\end{aligned}
$$
很明显,(3)和求解如下线性方程组的最小二乘解等价
(4)
$$
G\mathbf{a}=\mathbf{g}
$$
其中\(\mathbf{a},\mathbf{g},G\)来自如下参数
(5)
$$
\begin{aligned}
\mathbf{a}&=\begin{bmatrix}
a_2
\\
a_3
\\

\\
a_n
\end{bmatrix},\mathbf{b}=\begin{bmatrix}
0
\\
0
\\
0
\\
\\

\\
\\
0
\\
\\
\dfrac{\bar{y}}{\bar{x}}-k_0
\\
\\
k_1-\dfrac{\bar{y}}{\bar{x}}
\end{bmatrix}
\\
\\
C&=\begin{bmatrix}
(\dfrac{1}{m})^2-\dfrac{1}{m}&(\dfrac{1}{m})^3-\dfrac{1}{m}&…&(\dfrac{1}{m})^n-\dfrac{1}{m}
\\
\\
(\dfrac{2}{m})^2-\dfrac{2}{m}&(\dfrac{2}{m})^3-\dfrac{2}{m}&…&(\dfrac{2}{m})^n-\dfrac{2}{m}
\\
\\

\\
\\
(\dfrac{m-1}{m})^2-\dfrac{m-1}{m}&(\dfrac{m-1}{m})^3-\dfrac{m-1}{m}&…&(\dfrac{m-1}{m})^n-\dfrac{m-1}{m}
\\
\\
1 & 1 & … & 1
\\
\\
1 & 2 & … & n-1
\end{bmatrix}
\\
\\
X&=\begin{bmatrix}
\bar{x}&0&0&…&0
\\
0&\bar{x}^2&0&…&0
\\
0&0&\bar{x}^3&…&0
\\

\\
0 & 0 &…&\bar{x}^{n-2}&0
\\
0&0&…&0&\bar{x}^{n-1}
\end{bmatrix}
\\
\\
\bar{w} &=\dfrac{w}{\sqrt{m-1}}
\\
\\
W&=\begin{bmatrix}
\bar{w}&0&0&0&…&0
\\
0&\bar{w}&0&0&…&0
\\
0&0&\bar{w}&0&…&0
\\

\\
0&0&0&…&w_0&0
\\
0&0&0&…&0&w_1
\end{bmatrix}
\\
\\
G&=WCX,\mathbf{g}=W\mathbf{b}
\end{aligned}
$$
因此,可以根据(2)、(4)、(5)可以求得曲线方程所有系数(注意,为了避免矩阵运算,\(G,\mathbf{g}\)矩阵可直接进行构建)。

3 特殊求解
特别地,一般会设置\(w_0=w_1\),且设②整体权重为③整体权重的\(\alpha^2(\alpha>0)\)倍,这时可以推得
(6)
$$
w_0=w_1=\dfrac{1}{\sqrt{2}}\alpha w = \sqrt{\dfrac{m-1}{2}}\alpha \bar{w}
$$
当\(m\)不趋近无穷大时,公式(5)里的\(W\)可以等效使用如下矩阵代替
(7)
$$
W=\begin{bmatrix}
1 &0&0&0 &…&0
\\
0&1&0&0&…&0
\\
0&0&1&0&…&0
\\

\\
0&0&0&…&\sqrt{\dfrac{m-1}{2}}\alpha & 0
\\
0&0&0&…&0&\sqrt{\dfrac{m-1}{2}}\alpha
\end{bmatrix}
$$
因此,大部分情况下,只需要设置 \(\alpha,m,n\) 即可求解方程系数。

4 抛物线
特别地,当(1)里的\(n=2\)时,(3)可以变为
(8)
$$
\begin{aligned}
\mathbf{min}:e&=w_0^2(a_2\bar{x}+k_0-\dfrac{\bar{y}}{\bar{x}})^2+w_1^2(a_2\bar{x}+\dfrac{\bar{y}}{\bar{x}}-k_1)^2+\dfrac{w^2}{m-1}\sum_{i=1}^{m-1}(a_2((\dfrac{i}{m})^2-\dfrac{i}{m})\bar{x})^2
\\
\\
&=a_2^2\bar{x}^2(w_0^2+w_1^2+\dfrac{w^2}{m-1}\sum_{i=1}^{m-1}((\dfrac{i}{m})^2-\dfrac{i}{m})^2)+2a_2(w_0^2(k_0\bar{x}-\bar{y})+w_1^2(\bar{y}-k_1\bar{x}))+…
\\
\\
&=\bar{x}^2\beta_0(a_2+\dfrac{\beta_1}{\bar{x}^2\beta_0})^2+…
\end{aligned}
$$
公式里
(9)
$$
\begin{cases}
\beta_0&=w_0^2+w_1^2+\dfrac{m^3+m^2+m+1}{30m^3}w^2
\\
\\
\beta_1&=w_0^2(k_0\bar{x}-\bar{y})+w_1^2(\bar{y}-k_1\bar{x})
\end{cases}
$$
最终可以求解得到系数
(10)
$$
\begin{cases}
a_1&=\dfrac{\bar{y}}{\bar{x}}+\dfrac{\beta_1}{\beta_0 \bar{x}}
\\
\\
a_2&=-\dfrac{\beta_1}{\beta_0 \bar{x}^2}
\end{cases}
$$
特别地,当满足(6)的条件时,可以得到
(11)
$$
\dfrac{\beta_1}{\beta_0 \bar{x}}=\dfrac{\alpha^2(k_0-k_1)}{2\alpha^2+\dfrac{2}{30m^3}(m^3+m^2+m+1)}
$$

带约束多项式曲线拟合二

1 问题
平面上有\(m+q\)个点(\(q>0\)),其分别为\(\mathbf{p}_1、\mathbf{p}_2、…、\mathbf{p}_m、\mathbf{s}_1、\mathbf{s}_2、…、\mathbf{s}_q\)。现在要构建一条满足如下条件的曲线方程:
①曲线在\(\mathbf{s}_1\)位置处的方向为\(\mathbf{k}\)。
②曲线必须通过 \(\mathbf{s}_1、\mathbf{s}_2、…、\mathbf{s}_q\)。
③ 曲线距离 \(\mathbf{p}_1、\mathbf{p}_2、…、\mathbf{p}_m\) 的距离尽量小。

2 求解
2.1 坐标变换
这里以 \(\mathbf{s}_1\) 为原点,然后在 \(m+q\) 个点里优先选择距离 \(\mathbf{s}_1\) 较远的一个点 \(\mathbf{p}\) 且 \(\mathbf{k}\cdot(\mathbf{p}-\mathbf{s}_1)\neq 0\),然后以\(\mathbf{s}_1\)指向\(\mathbf{p}\)的方向为\(x\)轴正向建立局部坐标系,因此可以得到变换矩阵
(1)
$$
T=\begin{bmatrix}R&-R\mathbf{s}_1\end{bmatrix}
$$
公式里\(R\)为\(\mathbf{s}_1、\mathbf{p}\)构建的SO2变换矩阵。

设\(\mathbf{p}_1、\mathbf{p}_2、…、\mathbf{p}_m\)在新坐标系下的表示为\((x_1,y_1)、(x_2,y_2)、…、(x_m,y_m)\),\(\mathbf{s}_1、\mathbf{s}_2、…、\mathbf{s}_q\)在新坐标系下的表示为\((0,0)、(\bar{x}_2,\bar{y}_2)、…、(\bar{x}_q,\bar{y}_q)\)。
设\(\mathbf{k}\)对应斜率为\(k\),则
(2)
$$
\begin{cases}
\begin{bmatrix}
s_x
\\
s_y
\end{bmatrix}&=R(\mathbf{k}-\mathbf{s}_1)
\\
\\
k&=\dfrac{s_y}{s_x}
\end{cases}
$$

2.2 多项式模型
这里假设曲线方程为 \(n\) 次多项式(这里\(n>q\))。即在局部坐标系下,曲线方程为
(3)
$$
y=kx+a_2x^2+a_3x^3+…+a_nx^n
$$
很明显,(3)严格满足第①点,并且 \(\mathbf{s}_1\)也在曲线上,根据第②点其它点在曲线上的条件可以得到
(4)
$$
\begin{cases}
\bar{y}_2&=k\bar{x}_2+a_2\bar{x}_2^2+a_3\bar{x}_2^3+…+a_n\bar{x}_2^n
\\
\bar{y}_3&=k\bar{x}_3+a_2\bar{x}_3^2+a_3\bar{x}_3^3+…+a_n\bar{x}_3^n
\\

\\
\bar{y}_q&=k\bar{x}_q+a_2\bar{x}_q^2+a_3\bar{x}_q^3+…+a_n\bar{x}_q^n
\end{cases}
$$
设置如下中间变量
(5)
$$
\begin{aligned}
\mathbf{a}_1&=\begin{bmatrix}
a_2
\\
a_3
\\

\\
a_{n-q}
\end{bmatrix},
\mathbf{a}_2=\begin{bmatrix}
a_{n-q+1}
\\
a_{n-q+2}
\\

\\
a_n
\end{bmatrix},
\mathbf{b}=\begin{bmatrix}
\bar{y}_2-k\bar{x}_2
\\
\bar{y}_3-k\bar{x}_3
\\

\\
\bar{y}_q-k\bar{x}_q
\end{bmatrix}
\\
\\
B_1&=\begin{bmatrix}
\bar{x}_2^2&\bar{x}_2^3&…&\bar{x}_2^{n-q}
\\
\bar{x}_3^2&\bar{x}_3^3&…&\bar{x}_3^{n-q}
\\

\\
\bar{x}_q^2&\bar{x}_q^3&…&\bar{x}_q^{n-q}
\end{bmatrix}
\\
\\
B_2&=\begin{bmatrix}
\bar{x}_2^{n-q+1}&\bar{x}_2^{n-q+2}&…&\bar{x}_2^n
\\
\bar{x}_3^{n-q+1}&\bar{x}_3^{n-q+2}&…&\bar{x}_3^n
\\

\\
\bar{x}_q^{n-q+1}&\bar{x}_q^{n-q+2}&…&\bar{x}_q^n
\end{bmatrix}
\\
\\
\mathbf{g}&=B_2^{-1}\mathbf{b}
\\
G&=B_2^{-1}B_1
\end{aligned}
$$
将(5)代入(4)可以得到
(6)
$$
\mathbf{a}_2=\mathbf{g}-G\mathbf{a}_1
$$
公式里的 \(\mathbf{g}、G\) 为关系矩阵,如果对求解效率有要求,实际处理时可以跳过矩阵求逆而直接按线性拓扑关系计算此矩阵。
接下来,为了满足第③个条件,一种很自然的思想是,构建一个最小化目标函数,使得所有点距离曲线距离的平方和最小。对于距离,比较直观的是欧式距离,由于计算点到多项式曲线的欧式距离算法复杂,因此这不是构建目标的首选方式。这里退而求其次,构建每个点在\(y\)方向距离最小(注意,如果所有点均在曲线上,这种方式构建的最小化目标函数和欧式距离构建的最小化目标函数是等价的),也就是构建如下的最小化目标函数:
(7)
$$
\mathbf{min}:e=\sum_{i=1}^m(kx_i+a_2x_i^2+a_3x_i^3+…+a_nx_i^n-y_i)^2
$$
在导出公式前,先设置如下中间变量
(8)
$$
\begin{aligned}
\mathbf{c}&=\begin{bmatrix}
y_1-kx_1
\\
y_2-kx_2
\\

\\
y_m-kx_m
\end{bmatrix}
\\
\\
A_1&=\begin{bmatrix}
x_1^2&x_1^3&…&x_1^{n-q}
\\
x_2^2&x_2^3&…&x_2^{n-q}
\\

\\
x_m^2&x_m^3&…&x_m^{n-q}
\end{bmatrix}
\\
\\
A_2&=\begin{bmatrix}
x_1^{n-q+1}&x_1^{n-q+2}&…&x_1^n
\\
x_2^{n-q+1}&x_2^{n-q+2}&…&x_2^n
\\

\\
x_m^{n-q+1}&x_m^{n-q+2}&…&x_m^n
\end{bmatrix}
\\
\\
D&=A_1-A_2G
\\
\mathbf{d}&=\mathbf{c}-A_2\mathbf{g}
\end{aligned}
$$
对于公式(7)的最小化目标函数,等效于求解如下线性方程组的最小二乘解
(9)
$$
A_1\mathbf{a}_1+A_2\mathbf{a}_2=\mathbf{c}
$$
将(6)代入(9)可以得到
(10)
$$
D\mathbf{a}_1=\mathbf{d}
$$
求解(10)的最小二乘解,即是(7)的最佳解。因此通过(5)、(6)、(8)、(10)可以求得曲线方程所有系数。

3 带权求解
对于1中的第③个条件,假如 \(\mathbf{p}_1、\mathbf{p}_2、…、\mathbf{p}_m\) 影响到距离目标函数的权重分别为 \(w_1、w_2、…、w_m\),则很容易得到,最小化目标函数的解将变为求解如下线性方程的最小二乘解
(11)
$$
WD\mathbf{a}_1=W\mathbf{d}
$$
公式中的\(W\)矩阵如下
(12)
$$
W=\begin{bmatrix}
w_1&0&…&0
\\
0&w_2&…&0
\\

\\
0&0&…&w_m
\end{bmatrix}
$$
因此通过(5)、(6)、(8)、(11)可以求得曲线方程所有系数。

4 后记
使用中,需要注意,模型是在局部坐标系下建立的方程。如果想计算一些信息,比如位置、方向,可以先通过曲线方程,获取局部坐标系下的表示方式,然后再回转回原坐标系。对于一些不变的信息,比如长度、曲率等,则可以直接使用局部坐标系下的结果。

还有,注意本函数与样条函数的区别。

带约束多项式曲线拟合一

1 问题
平面上有两个点:起始点 \(\mathbf{p}_1\)和结束点 \(\mathbf{p}_2\)。现在要在这两点之间构建一条曲线方程,方程要求如下:
① 曲线必须过 \(\mathbf{p}_1\)、 \(\mathbf{p}_2\)。
② 曲线在  \(\mathbf{p}_1\) 位置处的方向为  \(\mathbf{n}_1\)。(这里  \(\mathbf{n}_1\cdot (\mathbf{p}_1 – \mathbf{p}_2) \neq 0\))
③ 曲线在  \(\mathbf{p}_2\) 位置处的方向为  \(\mathbf{n}_2\)。(这里  \(\mathbf{n}_2\cdot (\mathbf{p}_1 – \mathbf{p}_2) \neq 0\))
④ 曲线在 \(\mathbf{p}_1\)和 \(\mathbf{p}_2\) 间尽量接近直线。
如下图,想找一条红色曲线,使得曲线过两端点,且在两端点处斜率保持一阶连续,且曲线尽量接近直线形态。


2 求解
2.1 坐标变换
这里以\(\mathbf{p}_1\)为原点,以\(\mathbf{p}_1\)指向\(\mathbf{p}_2\)方向为x正轴,建立局部右手坐标系。因此可以得到变换矩阵
(1)
$$
T=\begin{bmatrix}R&-R\mathbf{p}_1 \end{bmatrix}
$$
公式里\(R\)为\(\mathbf{p}_1\)、\(\mathbf{p}_2\)构建的SO2变换矩阵。

2.2 计算斜率
这里设\(\mathbf{n}_1\)、\(\mathbf{n}_2\)在局部坐标系下对应的斜率为\(k_1、k_2\),则可以按如下方式获得
(2)
$$
\begin{cases}
\bar{\mathbf{n}}_1&=R\mathbf{n}_1=\begin{bmatrix}q_x &q_y\end{bmatrix}
\\
\bar{\mathbf{n}}_2&=R\mathbf{n}_2=\begin{bmatrix}p_x &p_y\end{bmatrix}
\\
\\
k_1&=\dfrac{q_y}{q_x}
\\
\\
k_2&=\dfrac{p_y}{p_x}
\end{cases}
$$

2.3 计算位置
设\(\mathbf{p}_1、\mathbf{p}_2\)在新坐标系下的表示为 \(\bar{\mathbf{p}}_1、\bar{\mathbf{p}}_2\),则可以得到
(3)
$$
\begin{cases}
\bar{\mathbf{p}}_1&=R(\mathbf{p}_1-\mathbf{p}_1)=\begin{bmatrix}0&0\end{bmatrix}
\\
\bar{\mathbf{p}}_2&=R(\mathbf{p}_2-\mathbf{p}_1)=\begin{bmatrix}s_x&s_y\end{bmatrix}
\end{cases}
$$
设临时变量\(k_3\)
(4)
$$
k_3=\dfrac{s_y}{s_x}
$$

2.4 多项式模型
在局部坐标系下,这里假设曲线方程为如下的4次多项式
(5)
$$
y=k_1x+a_2x^2+a_3x^3+a_4x^4
$$
这里的目的就是获取曲线方程系数 \(a_2,a_3,a_4\)。

很明显,上面的曲线方程必过 \(\bar{\mathbf{p}}_1\)点,且在这点的斜率必为\(k_1\)。由于方程必须过 \(\bar{\mathbf{p}}_2\)点且在其斜率为\(k_2\),因此将这条件代入(5)可以得到
(6)
$$
\begin{cases}
k_1s_x+a_2s_x^2+a_3s_x^3+a_4s_x^4&=s_y
\\
k_1+2a_2s_x+3a_3s_x^2+4a_4s_x^3&=k_2
\end{cases}
$$
求解公式(6)可以得到
(7)
$$
\begin{cases}
a_2&=\dfrac{1}{s_x}(a_4s_x^3+3k_3-k_2-2k_1)
\\
\\
a_3&=\dfrac{1}{s_x^2}(k_1+k_2-2k_3-2a_4s_x^3)
\end{cases}
$$
问题中的强约束①②③已经使用,而④的约束还未使用,且还有未知数\(a_4\)待求解。由于约束④要求曲线方程在区间\((0,s_x)\)内尽量接近直线。一种很自然的思想是在这个区间均匀采样 \(n-1\)个点,然后使得这些点的趋近直线,因此可构建如下最小化问题
(8)
$$
\begin{aligned}
\mathbf{min}:e&=\sum_{i=1}^{n-1}(k_1(\dfrac{i}{n}s_x)+a_2(\dfrac{i}{n}s_x)^2+a_3(\dfrac{i}{n}s_x)^3+a_4(\dfrac{i}{n}s_x)^4-\dfrac{i}{n}s_y)^2
\\
&=\sum_{i=1}^{n-1}(k_1(\dfrac{i}{n}s_x)+\dfrac{1}{s_x}(a_4s_x^3+3k_3-k_2-2k_1)(\dfrac{i}{n}s_x)^2\\&+\dfrac{1}{s_x^2}(k_1+k_2-2k_3-2a_4s_x^3)(\dfrac{i}{n}s_x)^3+a_4(\dfrac{i}{n}s_x)^4-\dfrac{i}{n}s_y)^2
\\
&=\sum_{i=1}^n(a_4s_x^4((\dfrac{i}{n})^4-2(\dfrac{i}{n})^3+(\dfrac{i}{n})^2)+s_x((k_1-k_3)(\dfrac{i}{n})+(3k_3-k_2-2k_1)(\dfrac{i}{n})^2+(k_1+k_2-2k_3)(\dfrac{i}{n})^3))^2
\end{aligned}
$$
这里设置如下中间变量
(9)
$$
\begin{aligned}
b_i&=(\dfrac{i}{n})^4-2(\dfrac{i}{n})^3+(\dfrac{i}{n})^2
\\
c_i&=(k_1-k_3)(\dfrac{i}{n})+(3k_3-k_2-2k_1)(\dfrac{i}{n})^2+(k_1+k_2-2k_3)(\dfrac{i}{n})^3)
\\
\alpha&=\sum_{i=1}^{n-1}b_i^2=\dfrac{n^8+20n^2-21}{630n^7}
\\
\beta&=\sum_{i=1}^{n-1}b_ic_i=(k_1-k_3)\dfrac{n^4-1}{60n^3}+(3k_3-k_2-2k_1)\dfrac{2n^6-7n^2+5}{210n^5}+(k_1+k_2-2k_3)\dfrac{n^6-7n^2+6}{168n^5}
\end{aligned}
$$
将(9)代入(8)有
(10)
$$
\begin{aligned}
\mathbf{min}:e&=\sum_{i=1}^{n-1}(a_4b_is_x^4+c_is_x)^2
\\
&=a_4s_x^8\sum_{i=1}^{n-1}b_i^2+2a_4s_x^5\sum_{i=1}^{n-1}b_ic_i+s_x^2\sum_{i=1}^{n-1}c_i^2
\\
&=\alpha a_4^2s_x^8+2\beta a_4s_x^5+s_x^2\sum_{i=1}^{n-1}c_i^2
\\
&=\alpha s_x^8(a_4+\dfrac{\beta}{\alpha s_x^3})^2+s_x^2\sum_{i=1}^{n-1}c_i^2-\dfrac{\beta^2s_x^2}{\alpha}
\\
&\Downarrow
\\
a_4&=-\dfrac{\beta}{\alpha s_x^3}
\end{aligned}
$$
特别地,当 \(n\to \infty\)有
(11)
$$
\lim_{n\to \infty}a_4=\dfrac{9}{4s_x^3}(k_2-k_1)
$$
将(11)代入(7)可以得到
(12)
$$
\begin{cases}
a_2&=\dfrac{1}{4s_x}(12k_3+5k_2-17k_1)
\\
\\
a_3&=\dfrac{1}{2s_x^2}(11k_1-7k_2-4k_3)
\\
\\
a_4&=\dfrac{9}{4s_x^3}(k_2-k_1)
\end{cases}
$$
最终,通过(12)计算得到公式(5)曲线方程系数。

3 变种

上面(8)构建的目标是点的位置接近直线,这里考虑曲线中间线的斜率与直线斜率一致,因此可以构造如下最小二乘目标函数
(13)$$
\mathbf{min}:e=\sum_{i=1}^{n-1}(k_1+2a_2(\dfrac{i}{n}s_x)+3a_3(\dfrac{i}{n}s_x)^2+4a_4(\dfrac{i}{n}s_x)^3-k_3)^2
$$

按上面类似处理方式,可以最终得到如下结果
(14)
$$
\begin{cases}
a_2&=\dfrac{3}{4s_x}(4k_3+k_2-5k_1)
\\
\\
a_3&=\dfrac{1}{2s_x^2}(9k_1-5k_2-4k_3)
\\
\\
a_4&=\dfrac{7}{4s_x^3}(k_2-k_1)
\end{cases}
$$

4 后记
使用中,需要注意,模型是在局部坐标系下建立的方程。如果想整体位置更接近直线,可考虑使用(12)的系数,如果想整体斜率更接近直线,可考虑(14)系数。如果想计算一些信息,比如位置、方向,可以先通过曲线方程,获取局部坐标系下的表示方式,然后再回转回原坐标系。对于一些不变的信息,比如长度、曲率等,则可以直接使用局部坐标系下的结果。

还有,注意本函数与样条函数的区别。本函数除了要求要过对应点以及斜率连续外,还要求曲线内部尽量,也就说在满足约束外,让创建的曲线曲率尽量小。这在一些特殊场景里有所应用。

目前 MathSword 已经将本功能集成到函数DataSmoothLineIn2Point

核密度估计之最佳窗宽求解

1 核密度估计
对给定的一维各自独立的从小到大排列的样本\(x_1,x_2,…,x_n\),核密度估计函数定义如下    
(1-1)
$$
f(x)=\dfrac{1}{nh}\sum_{i=1}^nK(\dfrac{x-x_i}{h})
$$
公式里\(h>0\)为窗宽,\(K(x)\)为核函数。

为了方便表示,设第\(i\)个概率密度贡献函数为  
(1-2)
$$
f_i(x)=K(\dfrac{x-x_i}{h})
$$

根据累积分布函数定义,设第\(i\)个累积分布贡献函数为    
(1-3)
$$
c_i(x)=\int_{-\infty}^x f_i(t)dt
$$

因此最终累积分布函数可表示为  
(1-4)

$$c(x)=\int_{-\infty}^x f(t)dt=\dfrac{1}{nh}\sum_{i=1}^nc_i(x)$$

2 最佳窗宽
在实际数据处理中,选择合适的核函数以及窗宽,才能更好地还原真实的数据分布。


2.1 最小化目标函数
为了获取最佳窗宽,本质上需要假定某种误差模型(最小化目标函数),然后找到一个最佳\(h\)使得这个误差模型的值最小,选择核函数以及求窗宽本质是一个纯优化问题。

对于这类优化问题,比较常见的是建立如下的积分误差模型    
(2-1)
$$
\begin{cases}
\text{概率密度积分平方误差}:&e(h)=\int (f(x)-\bar{f}(x))^2dx
\\
\text{概率密度积分均方误差}:&e(h)=E[\int (f(x)-\bar{f}(x))^2dx]
\end{cases}
$$
公式里\(\bar{f}(x)\)为概率密度真值模型,很遗憾地是,我们本身就不知道这个模型长什么样,很难获得比较真的值,因此很多算法都在对\(\bar{f}(x)\)提出各种近似,进而最小化误差函数。

这里,我们需要理解,概率密度函数本质反应的是某个点累积概率变化程度,因此它本质反应的是累积概率的一阶导(从定义上就可以看出),这时可以先直接得到累积概率密度值,然后使用某种算法获得累积概率各个点的一阶导值,这样就可以得到近似的\(\bar{f}(x)\),不过往往得到的值噪声较大。

因此,这里不使用公式(2-1)里的任意一个误差模型。我们换一种思路构建最小化目标函数。由于公式(1-4)已经获得了假设模型的累积分布函数\(c(x)\),因此可以构建如下最小二乘误差    
(2-2)
$$
e(h)=\sum_{i=1}^n(c(x_i)-\bar{c}(x_i))^2
$$
公式里\(\bar{c}(x)\)为真值累积分布值,当样本足够多时,可用如下方式获取    
(2-3)
$$
\bar{c}(x_i)\approx \dfrac{i}{n}
$$
注意, 公式(2-3)要求样本从小到大排序且无重复,有重复需要稍微处理一下。

这里需要注意的是,之所以选择累积分布作为误差值,因为概率密度函数"真值"\(\bar{f}(x)\)往往是对累积分布值再加工后获取,既然是再加工,就可能存在真值损失,这时直接使用累积分布值作为直接度量,可以一定程度减少真值损失带来的误差!

因此,使用(2-2)最小化目标的重点就变成了对核函数进行积分。积分得到累计分布函数后,就可以使用(2-2)套用对应求解器优化出最佳窗宽。

注意,如果直接使用样本数据点作为每个核函数里的\(x_i\),直接使用(1-4)的累计概率函数去进行逼近时,可以发现,对于无重复的样本数据,最优解会出现在窗宽接近0的位置,这种不是预期内的,这时需要单独再特殊处理。因此实际可以选择部分点作为核函数点,再进行最优带宽求解。

2.2 核函数
这里列举常见的核函数。由于我们有采样数据,因此可以获得采样数据的均值\(\bar{\mu}\)、方差\(\bar{\sigma}^2\),如果我们采样数据足够多,理论上核密度估计模型的期望\(\mu\)与方差\(\sigma^2\)与采样数据的均值、方差越接近越好,因此在核函数列举过程中,会罗列出模型对应的期望、方差。

2.2.1 三角核函数
对于参数 \(a>0\), 这里定义如下三角形核函数  
(2-4)
$$
K(x)=\begin{cases}
0&,x<-a
\\
\\
\dfrac{1}{a}(1-\dfrac{1}{a}|x|)&,-a\leq x \leq a
\\
\\
0&,x>a
\end{cases}
$$
根据(1-3)定义,可以得到累积分布贡献函数  
(2-5)
$$
c_i(x)=\begin{cases}
0&,x<x_i-ah
\\
\\
\dfrac{1}{2a^2h}(x_i-ah-x)^2&,x_i-ah\leq x\leq x_i
\\
\\
\dfrac{1}{2}h+\dfrac{1}{2a^2h}(x-x_i)(2ah+x_i-x)&,x_i<x\leq x_i+ah
\\
\\
h&,x>x_i+ah
\end{cases}
$$
根据期望与方差定义,可以很容易得到模型期望\(\mu\)、方差\(\sigma^2\)与样本数据均值\(\bar{\mu}\)、方差\(\bar{\sigma}^2\)的关系  
(2-6)
$$
\begin{cases}
\mu&=\bar{\mu}
\\
\sigma^2&=\bar{\sigma}^2+\dfrac{a^2}{6}h^2
\end{cases}
$$

特别地,在Matlab里的三角函数核取\(a=\sqrt{6}\), 在维基百科上的三角核取\(a=1\)。

2.2.2 抛物线核函数
对于参数\(a>0\),这里定义如下抛物线核函数  
(2-7)
$$
K(x)=\begin{cases}
0&,x<-a
\\
\\
\dfrac{3}{4a}(1-\dfrac{x^2}{a^2})&,-a\leq x\leq a
\\
\\
0&,x>a
\end{cases}
$$
根据(1-3)定义,可以得到累积分布贡献函数  
(2-8)
$$
c_i(x)=\begin{cases}
0&,x<x_i-ah
\\
\\
\dfrac{1}{4a^3h^2}(ah+x-x_i)^2(2ah-x+x_i)&,x_i-ah\leq x \leq x_i+ah
\\
\\
h&,x>x_i+ah
\end{cases}
$$
根据期望与方差定义,可以很容易得到模型期望\(\mu\)、方差\(\sigma^2\)与样本数据均值\(\bar{\mu}\)、方差\(\bar{\sigma}^2\)的关系  
(2-9)
$$
\begin{cases}
\mu&=\bar{\mu}
\\
\\
\sigma^2&=\bar{\sigma}^2+\dfrac{a^2}{5}h^2
\end{cases}
$$
特别地,当\(a=1\)时,就得到了常见的Epanechnikov核。

2.2.3 高斯核函数
对于参数\(a>0\),这里定义如下高斯核函数  
(2-10)
$$
K(x)=\dfrac{1}{\sqrt{2\pi}a}\exp(-\dfrac{1}{2a^2}(x-b)^2)
$$
根据(1-3)定义,可以得到累积分布贡献函数   
(2-11)
$$
c_i(x)=\dfrac{h}{2}(1-\mathbf{erf}(\dfrac{bh+x_i-x}{\sqrt{2}ah}))
$$
根据期望定义,可以得到模型期望\(\mu\)与样本均值直接的关系  
(2-12)
$$
\mu=\bar{\mu}-hb
$$
很多时候,我们希望模型的期望逼近样本的均值,因此这时核函数设置\(b=0\),此时模型期望\(\mu\)、方差\(\sigma^2\)与样本数据均值\(\bar{\mu}\)、方差\(\bar{\sigma}^2\)有如下关系  
(2-13)
$$
\begin{cases}
\mu&=\bar{\mu}
\\
\sigma^2&=\bar{\sigma}^2+a^2h^2
\end{cases}
$$
特别地,当\(a=1,b=0\)时,就得到了常见的高斯核。

2.2.4 余弦核函数
对于参数\(a>0\),这里定义如下余弦核函数  
(2-14)
$$
K(x)=\begin{cases}
0&,x<-a
\\
\\
\dfrac{\pi}{4a}\cos(\dfrac{\pi}{2a}x)&,-a\leq x \leq a
\\
\\
0&,x>a
\end{cases}
$$
根据(1-3)定义,可以得到累积分布贡献函数  
(2-15)
$$
c_i(x)=\begin{cases}
0&,x<x_i-ah
\\
\\
\dfrac{h}{2}(1+\sin(\dfrac{\pi(x-x_i)}{2ah}))&,x_i-ah\leq x \leq x_i+ah
\\
\\
h&,x>x_i+ah
\end{cases}
$$
根据期望与方差定义,可以得到模型期望\(\mu\)、方差\(\sigma^2\)与样本数据均值\(\bar{\mu}\)、方差\(\bar{\sigma}^2\)的关系  
(2-16)
$$
\begin{cases}
\mu&=\bar{\mu}
\\
\\
\sigma^2&=\bar{\sigma}^2+(1-\dfrac{8}{\pi^2})a^2h^2
\end{cases}
$$
特别地,当\(a=1\)时,就得到常见的余弦核函数。

2.2.5 逻辑核函数
这里定义核函数  
(2-17)
$$
K(x)=\dfrac{1}{2+\exp(x)+\exp(-x)}
$$
根据(1-3)定义,可以得到累积分布贡献函数  
(2-18)
$$
c_i(x)=h-\dfrac{h}{1+\exp(\dfrac{x-x_i}{h})}
$$
根据期望与方差定义,可以得到模型期望\(\mu\)、方差\(\sigma^2\)与样本数据均值\(\bar{\mu}\)、方差\(\bar{\sigma}^2\)的关系  
(2-19)
$$
\begin{cases}
\mu&=\bar{\mu}
\\
\\
\sigma^2&=\bar{\sigma}^2+\dfrac{\pi^2}{3}h^2
\end{cases}
$$

3 经验窗宽
生活中,大部分模型逼近正态分布,因此如果不想麻烦地去优化窗宽的话,可以认为数据符合正态分布,这时根据Silverman提出的拇指准则(一种经验准则),可使用如下方式计算窗宽  
(3-1)
$$
\begin{cases}
\mu&=\dfrac{1}{n}\sum_{i=1}^nx_i
\\
\\
\sigma&=\sqrt{\dfrac{\sum_{i=1}^n(x_i-\mu)^2}{n-1}}
\\
\\
h&=(\dfrac{4}{3n})^{1/5}\sigma
\end{cases}
$$

4 后话
在核密度估计里,为了加速计算,往往会对求解域进行截断,具体可以参看三角核函数、抛物线核函数,在实际数据处理中需要充分利用这个优势。同样地,高斯核函数本质也可以截断,可以根据实际情况进行处理。

MathSword教程10.数据降噪与滤波器设计

1 背景
现实生活中的很多需求本质上就是对数据进行降噪处理,比如高精度地图的建立、信号识别特征提取。而一维数据降噪,又充斥着大量使用场景。降噪方法有滑窗均值、滑窗中值、Savitzky Golay滤波、归一化LMS滤波、卡尔曼滤波、Whittaker滤波、有限脉冲滤波(FIR)、无限脉冲滤波(IIR)…

在实际降噪处理过程中,一般会结合使用场景会设计特定的处理算法,而对于常见的数据,则可使用传统方法先进行降噪再进行处理。

2 FIR
FIR, 即有限脉冲滤波器,需要提前知道滤波系数 \(h_0,h_1,…,h_n\),其中\(n\)为滤波阶数, \(x_0,x_1,x_2,…\)为原始输入序列,\(y_0,y_1,y_2,…\)为滤波得到的序列。滤波公式为:
(1)
$$
y_k=\sum_{i=0}^nh_ix_{k-i}
$$

FIR中的滤波系数大都通过窗设计得到,比如:Hamming、Hanning、Kaiser、Blackmane等等窗函数。

3 IIR
IIR, 即无限脉冲滤波器, 需要提前知道滤波系数\(a_0,a_1,a_2,…,a_n,b_0,b_1,b_2,…,b_m\),其中\(m,n\)为滤波阶数。滤波公式为  
(2)
$$
y_k=\sum_{i=0}^na_ix_{k-i}+\sum_{i=0}^mb_iy_{k-i}
$$

IIR滤波器系数一般基于Bessel、Butterworth、Chebyshev I类、Chebyshev II类进行设计。

4 教程
针对一维数据,MathSword软件内置了单独的数据降噪窗口进行处理,提供了FIR、IIR、卡尔曼滤波、LMS滤波、Whittaker滤波、Savitzky Golay滤波、中值滤波、径向基函数滤波等等多种滤波方法。并且对于FIR、IIR提供滤波系数提取、且FIR、IIR本身提供多种函数模式。

MathSword教程9.分段多项式拟合

1 背景
对于二维函数问题,有时我们希望用分段多项式去逼近复杂的函数(三次样条插值就使用了这一思想),也就是说希望建立如下的数学模型去匹配测试数据  
(1)
$$
y=\begin{cases}
A_{0,0}+\sum_{i=1}^nA_{0,i}x^i&,x<b_0
\\
A_{1,0}+\sum_{i=1}^nA_{1,i}x^i&,b_0\leq x < b_1
\\
A_{2,0}+\sum_{i=1}^nA_{2,i}x^i&,b_1\leq x < b_12
\\

\\
A_{m,0}+\sum_{i=1}^nA_{m,i}x^i &,b_{m-1}\leq x < b_m
\end{cases}
$$
公式里\(n\)为多项式最高次数,\(m+1\)为分的段数, \(b_0,b_1,b_2,…,b_m\)为分段临界点。

如果严格要求(1)里的模型在定义域里\(p\)阶导连续(这里\(p\)为大于等于0的整数),则这时在分界点处必然满足如下关系  
(2)
$$
\begin{cases}
f(p-1,p)A_{0,p}+\sum_{i=p+1}^nf(p,i)b_0^{i-p}A_{0,i}&=f(p-1,p)A_{1,p}+\sum_{i=p+1}^nf(p,i)b_0^{i-p}A_{1,i}
\\
f(p-1,p)A_{1,p}+\sum_{i=p+1}^nf(p,i)b_1^{i-p}A_{1,i}&=f(p-1,p)A_{2,p}+\sum_{i=p+1}^nf(p,i)b_1^{i-p}A_{2,i}
\\
f(p-1,p)A_{2,p}+\sum_{i=p+1}^nf(p,i)b_2^{i-p}A_{2,i}&=f(p-1,p)A_{3,p}+\sum_{i=p+1}^nf(p,i)b_2^{i-p}A_{3,i}
\\

\\
f(p-1,p)A_{m-1,p}+\sum_{i=p+1}^nf(p,i)b_{m-1}^{i-p}A_{m-1,i}&=f(p-1,p)A_{m,p}+\sum_{i=p+1}^nf(p,i)b_{m-1}^{i-p}A_{m,i}
\end{cases}
$$
公式里\(f(p,i)\)函数定义如下  
(3)
$$
f(p,i)=\begin{cases}
1&,p=-1
\\
1&,p=0
\\
\prod_{k=1}^p(i+1-k)&,p>0
\end{cases}
$$
最终(2)可以变为  
(4)
$$
\begin{cases}
A_{1,p}&=A_{0,p}+\dfrac{1}{f(p-1,p)}\sum_{i=p+1}^nf(p,i)b_0^{i-p}(A_{0,i}-A_{1,i})
\\
A_{2,p}&=A_{1,p}+\dfrac{1}{f(p-1,p)}\sum_{i=p+1}^nf(p,i)b_1^{i-p}(A_{1,i}-A_{2,i})
\\
A_{3,p}&=A_{2,p}+\dfrac{1}{f(p-1,p)}\sum_{i=p+1}^nf(p,i)b_2^{i-p}(A_{2,i}-A_{3,i})
\\

\\
A_{m,p}&=A_{m-1,p}+\dfrac{1}{f(p-1,p)}\sum_{i=p+1}^nf(p,i)b_{m-1}^{i-p}(A_{m-1,i}-A_{m,i})
\end{cases}
$$
有时还需要模型通过类似公式(5)里的特定点,这时可根据(2)导出类似(4)的表达式,进而进行变量替换。 
(5)
$$
\begin{cases}
y|_{x=1.2}&=3.6
\\\\
\dfrac{dy}{dx}|_{x=2.5}&=-0.8
\\\\
\dfrac{d^2y}{dx^2}|_{x=-1.2}&=-0.36
\\\\

\end{cases}
$$

因此在实际处理分段多项式过程中,为了求解系数,可以通过(4)(5)将变量进行消除替代,然后再使用最小二乘求解拟合,最终求得的结果就严格满足第几阶导连续的要求。

PS:对于超过二维的多维数据,也可以尝试用分段多项式进行处理,这时构建的模型随着维度增加系数更多,在实际处理时如果也要求数据在分界点处具有几阶导连续,本质上也可如上面公式一般导出各个系数之间的关系。

2 教程

针对二维分段多项式,MathSword软件内置了单独的控制窗口进行处理,软件里支持几阶导连续约束,也支持通过特定点的约束,除了可以直接求解多项式分段系数外,还支持寻优最佳的分界点。

贷款利率计算

1 背景
在实际生活中,我们可能会遇到一些借贷问题。比如,车贷、房贷、民间借贷,或者银行存储利率问题。我们可能是借方,也可能是被借方,这些都涉及到利率的计算。因此,研究简单的借贷模型,获得对应利率,方便我们作参考。

2 理论
2.1 约定
这里在介绍利率之前,这里取一年为365天,约定日利\(r_d\)、月利\(r_m\)、年利\(r_y\)之间以复利的关系进行转换,即它们存在如下关系:  
(2.1-1)
$$
\begin{cases}
r_m&=(1+r_d)^{365/12}-1
\\
r_y&=(1+r_d)^{365}-1
\\
r_y&=(1+r_m)^{12}-1
\\
\\
r_m&=\exp(\dfrac{1}{12}\ln(1+r_y))-1
\\
\\
r_d&=\exp(\dfrac{1}{365}\ln(1+r_y))-1
\end{cases}
$$

注意,有些地方并没有使用复利进行转换。比如月息1%,不考虑复利时对应年息为12%, 而考虑复利时对应年息是12.682503013197%, 由于大部分场景考虑复利获利, 因此本文使用复利转换方式。

2.2 利率模型
借贷模型可以等价描述为: A向B借款\(s\)元, 借款月利为\(r\), 借款期限为\(n\)个月, 每个月还款依次为\(a_1、a_2、a_3……a_{n-1}、a_n\),直到还完。

对于上面这个数学模型,可以看成A向B借了\(n\)份钱,每一份钱在同利率\(r\)情况下,单独签订对应月份数进行还款。因此,这里可以设每份借的钱分别为\(b_i\),其中第\(i\)份钱只借\(i\)个月。因此可以建立如下数学模型:  
(2.2-1)
$$
\begin{cases}
s&=\sum_{i=1}^nb_i
\\
a_i&=b_i(1+r)^i
\end{cases}
$$
这里设\(x=1+r\),对(2.2-1)变形有  
(2.2-2)
$$
a_1x^{n-1}+a_2x^{n-2}+…+a_{n-1}x+a_n=sx^n
$$
很明显,(2.2-2)是一元\(n\)次多项式求解,这已经有成熟的算法,可以直接求得\(x\),进而求得利率 \(r=x-1\),以及第\(i\)份钱的本金\(b_i\),以及第\(i\)个月累计还的本金\(S_i\)和累计还的利息\(I_i\):

(2.2-3)
$$
\begin{cases}
b_i&=\dfrac{a_i}{x^i}
\\
S_i&=\sum_{j=1}^ib_j
\\
I_i&=\sum_{j=1}^i(a_j-b_j)
\end{cases}
$$

注意:①这里描述的借贷按月进行处理,对于日或者年借贷模型一致;②大部分借贷都适用上面的2.2的数学模型,实际使用中可以使用这个模型等效探知借贷利率,以及每个期间本金与利息情况;③在实际使用时,可考虑将服务费等一并额外费用算在借贷金额里。

2.3 等额本息
等额本息,是每个月还款固定的一种还款方式。如果每个月固定还款为\(a\)元,因此只需要在2.2的模型里设置 \(a_1=a_2=…=a_n=a\) 即可求解,代入(2.2-2)可以等效求解如下方程  
(2.3-1)
$$
a\dfrac{1-x^n}{1-x}=sx^n
$$

2.4 等额本金
等额本金是指在还款期内把贷款数总额等分,每月偿还同等数额的本金和剩余贷款在该月所产生的利息,因此只需要在2.2的模型里设置 \(a_i=\dfrac{s}{n}+\dfrac{s}{n}(n+1-i)r\) 即可求解,由于总额和每个月还款总数已知,这时(2.2-2)方程对任意值均成立,因此为了求解,使用如下方式求得利率  
(2.4-1)
$$
r=\dfrac{1}{n+1-i}(\dfrac{na_i}{s}-1)
$$

3 例子
3.1 借贷案例1
A向B借款10万元,借期为3年。A向B承诺, 每个月固定给1000元利息给B, 3年期间总共会给利息3.6万元, 到期后向B返还本金10万。请问, A向B借款实际利率为多少?

这个案例中,套入2.2的模型可以得到如下参数  
(3.1)
$$
\begin{cases}
s&=100000
\\
a_1&=1000
\\
a_2&=1000
\\

\\
a_{35}&=1000
\\
a_{36}&=100000+1000
\end{cases}
$$
将(3.1)代入(2.2)可以得到月息 \(r_m=1\%\), 年息为 \(r_y=12.682503013197\%\)。

3.2 借贷案例2
A向B借款10万元,借期为3年。A向B承诺, 按每个月1000元的利息计算, 利息在借款到期后一并结算, 3年期间总共产生利息3.6万元, 到期后向B返还本金10万以及支付3.6万利息。请问, A向B借款实际利率为多少?

这个案例中,套入2.2的模型可以得到如下参数  
(3.2)
$$
\begin{cases}
s&=100000
\\
a_1&=0
\\
a_2&=0
\\

\\
a_{35}&=0
\\
a_{36}&=100000+36000
\end{cases}
$$
将(3.2)代入(2.2)可以得到月息 \(r_m=0.85778221376\%\), 年息为 \(r_y=10.793165135089\%\)。

从3.2可以发现,相同借款金额,利息提前还与否实际利率有一定差异。

3.3 借贷案例3
A向B借款10000元,借期为6个月。因为一些原因, A实际到手金额为9600元, A后续6个月每个月实际还款金额分别为2000元、2000元、2000元、2000元、1000元、1000元。
请问, A向B借款实际利率为多少?
这个案例中,套入2.2的模型可以得到如下参数  
(3.3)
$$
\begin{cases}
s&=9600
\\
a_1&=2000
\\
a_2&=2000
\\
a_3&=2000
\\
a_4&=2000
\\
a_5&=1000
\\
a_6&=1000
\end{cases}
$$
将(3.3)代入(2.2)可以得到月息 \(r_m=1.332664497160 \%\), 年息为 \(r_y=17.217795276054 \%\)。

4 使用
对于上面的模型, 可以使用MathSword提供的LendingRate函数进行利率反算,也可以使用内置的贷款工具箱进行快速计算。

椭球与椭圆方程拟合

1 背景
有时,需要将一堆数据拟合成椭圆(椭球)方程,有时需要将一般椭圆(椭球)方程标准化。这时就需要使用专门的算法进行处理,本文介绍算法进行处理。

2 椭球
椭球是3D空间方程求解。
2.1 椭球拟合
对于椭球的一般方程,可表示为如下形式  
(2.1-1)
$$
s_1x^2+s_2y^2+s_3z^2+2s_4yz+2s_5xz+2s_6xy+2s_7x+2s_8y+2s_9z+s_{10}=0
$$
上面的方程要表示为椭球,必须满足如下条件 
(2.1-2)
$$
\begin{cases}
W&=\begin{bmatrix}s_1&s_6&s_5
\\
s_6&s_2&s_4
\\
s_5&s_4&s_3\end{bmatrix}
\\
\\
|W|(s_1+s_2+s_3)&>0\\\\s_1s_2+s_2s_3+s_3s_1&>s_4^2+s_5^2+s_6^2
\end{cases}
$$
现在已知有n组\((x,y,z)\)数据,为了拟合椭球,先设置如下中间变量  
(2.1-3)
$$
\begin{cases}
\mathbf{v}_1 &=\begin{bmatrix}s_1 &s_2&s_3&s_4&s_5&s_6\end{bmatrix}^T
\\
\mathbf{v}_2 &=\begin{bmatrix}s_7 &s_8&s_9&s_{10}\end{bmatrix}^T
\\
\\
\eta &=\dfrac{\alpha}{2}-1
\\
B_1 &=\dfrac{1}{3\eta^2+2\eta^3-1}\begin{bmatrix}
1-\eta^2 &\eta+\eta^2&\eta+\eta^2
\\
\eta+\eta^2 &1-\eta^2&\eta+\eta^2
\\
\eta+\eta^2&\eta+\eta^2&1-\eta^2
\end{bmatrix}
\\
\\
B_2&=-\dfrac{1}{\alpha}\begin{bmatrix}
1&0&0
\\
0&1&0
\\
0&0&1
\end{bmatrix}
\\
\\
B&=\begin{bmatrix}
B_1 &\mathbf{0}
\\
\mathbf{0} &B_2
\end{bmatrix}
\\
\\
D&=\begin{bmatrix}
x_1^2&y_1^2&z_1^2&2y_1z_1&2x_1z_1&2x_1y_1&2x_1&2y_1&2z_1&1
\\
x_2^2&y_2^2&z_2^2&2y_2z_2&2x_2z_2&2x_2y_2&2x_2&2y_2&2z_2&1
\\

\\
x_n^2&y_n^2&z_n^2&2y_nz_n&2x_nz_n&2x_ny_n&2x_n&2y_n&2z_n&1
\end{bmatrix}
\end{cases}
$$
然后根据文献[1],设置一个\(\alpha \geq 4\),然后如下算法求解\(\mathbf{v}_1,\mathbf{v}_2\).  
(2.1-4)
$$
\begin{cases}
D^TD &=\begin{bmatrix}
S_{11} & S_{12}
\\
S_{12}^T &S_{22}
\end{bmatrix}
\\
M&=-S_{22}^{-1}S_{12}^T
\\
P&=B(S_{11}+S_{12}M)
\\
\mathbf{v}_2&=M\mathbf{v}_1
\end{cases}
$$
上面公式里\(S_{11},S_{12},S_{22}\)的维度分别为\(6\times6,6\times4,4\times4\)。在实际使用时,取\(P\)的特征向量作为\(\mathbf{v}_1\),因为特征向量有多个,因此选择满足条件(2.1-2)的特征向量作为解。注意,(2.1-2)不能完全排除非椭球方程,从(2.2-7)可知道,椭球方程还与其它系数相关,因此严格判断结果是否为椭球,需要确定最终求解的系数能否通过椭球标准化,通过则为椭球系数。

注意,在实际使用过程中,需要设置\(\alpha\),一般地,设置为4即可,如果4不满足,则设置其它值。

2.2 椭球标准化
对于标准化椭球方程,可表示为如下形式  
(2.2-1)
$$
\dfrac{x'^2}{a^2}+\dfrac{y'^2}{b^2}+\dfrac{z'^2}{c^2}=1
$$
对于参数化标准方程有如下表示方式  
(2.2-2)
$$
\begin{cases}
x'&=a\sin(\theta)\cos(\phi)
\\
y'&=b\sin(\theta)\sin(\phi)
\\z'&=c\cos(\theta)\end{cases}\ \ \ ,0\leq \theta\leq\pi,0\leq\phi<2\pi
$$
现在考虑,(2.1-1)的椭球方程,当经过\([R,\mathbf{t}]\)的刚体变换后,可以在另一个坐标系下表示成(2.2-1)的标准椭球方程。则有如下表示  
(2.2-3)
$$
\begin{cases}
\mathbf{x}' &=R(\mathbf{x}+\mathbf{t})
\\
\mathbf{x} &=\begin{bmatrix}x&y&z\end{bmatrix}^T
\\
\mathbf{x}' &=\begin{bmatrix}x'&y'&z'\end{bmatrix}^T
\end{cases}
$$
因此,标准化过程需要求的参数为\(a,b,c,R,\mathbf{t}\)。 
这里设置中间矩阵  
(2.2-4)
$$
\begin{aligned}
S&=\begin{bmatrix}
\dfrac{1}{a^2} &0&0
\\
0&\dfrac{1}{b^2}&0
\\
0&0&\dfrac{1}{c^2}
\end{bmatrix}
\\
Q&=R^TSR
\end{aligned}
$$
因此,求得\(S\)矩阵,即可求得\(a,b,c\)。这里将(2.2-3)代入(2.2-1)有  
(2.2-5)
$$
\begin{aligned}
1 &=\dfrac{x'^2}{a^2}+\dfrac{y'^2}{b^2}+\dfrac{z'^2}{c^2}
\\
&=(R(\mathbf{x}+\mathbf{t}))^TS(R(\mathbf{x}+\mathbf{t}))
\\
&=(\mathbf{x}+\mathbf{t})^TR^TSR(\mathbf{x}+\mathbf{t})
\\
&=(\mathbf{x}+\mathbf{t})^TQ(\mathbf{x}+\mathbf{t})
\\
&=\mathbf{x}^TQ\mathbf{x}+\mathbf{t}^TQ\mathbf{t}+2\mathbf{t}^TQ\mathbf{x}
\end{aligned}
$$
由于(2.2-5)与(2.1-1)为同一个椭球,因此总存在一个非0系数\(k\)使得\(W=kQ\)情况下,下面算式\(x,y,z\)以及常数项系数与(2.1-1)对应  
(2.2-6)
$$
\mathbf{x}^TW\mathbf{x}+2\mathbf{t}^TW\mathbf{x}+\mathbf{t}^TW\mathbf{t}-k=0
$$
根据系数对应关系,可以得到  
(2.2-7)
$$
\begin{cases}
W&=R^T(kS)R
\\
\\
\mathbf{t} &=W^{-1}\begin{bmatrix}
s_7
\\
s_8
\\
s_9
\end{bmatrix}=R^T(kS)^{-1}R\begin{bmatrix}
s_7
\\
s_8
\\
s_9
\end{bmatrix}
\\
\\
k &=\mathbf{t}^TW\mathbf{t}-s_{10}
\end{cases}
$$
因此,在上面公式里先奇异值分解\(W\)获得\(R,kS\)(注意,这里按第4部分进行分解,只有第4部分对称矩阵分解提到的\(m=0\)或者\(m = n\)时,才有解,否则此参数不满足椭球方程。也可以通过特征分解来获得),然后计算\(\mathbf{t}\),最后计算\(k\),进而得到\(S\)(求解得到的\(S\)对角线元素必须都大于0,否则椭球方程无解)。需要注意的是,奇异值分解不唯一,可以想象,在标准椭球体\(x',y',z'\)坐标系下,坐标轴对调后的方程依然为标准椭球体方程,所以需要注意选择。

最终,在求得标准椭球方程\(a,b,c\)系数后,就可以求椭球体积,以及表面积。为了方便求椭球体积\(V\)与表面积\(A\),这里约定系数\(a\geq b \geq c >0\),且设置如下中间变量  
(2.2-8)
$$
\begin{cases}
e_1 &=\sqrt{\dfrac{a^2-c^2}{a^2}}
\\
\\
e_2&=\sqrt{\dfrac{b^2-c^2}{b^2}}
\\
\\
k &=\dfrac{e_2}{e_1}
\\
\\
\phi &=\arcsin(\sqrt{1-\dfrac{c^2}{a^2}})
\end{cases}
$$
最终,使用如下公式计算体积与面积[3]  
(2.2-9)
$$
\begin{cases}
V&=\dfrac{4\pi}{3}abc
\\
A&=2\pi(c^2+\dfrac{bc^2}{\sqrt{a^2-c^2}}\mathbf{EllipticF}(\phi,k)+b\sqrt{a^2-c^2}\ \mathbf{EllipticE}(\phi,k))
\end{cases}
$$
公式里 \(\mathbf{EllipticF}、\mathbf{EllipticE}\) 分别为第一类不完全椭圆积分函数,第二类不完全椭圆积分函数。

注意,如果椭球有两个轴相等,这里设\(a=b\),则表面积\(A\)存在如下精确解

(2.2-10)
$$
A=\begin{cases}
2\pi(a^2+c^2\dfrac{\mathbf{arctanh}(\sin(\phi))}{\sin(\phi)})&,\phi=\arccos(\dfrac{c}{a}),a>c
\\
2\pi(a^2+c^2\dfrac{\phi}{\tan(\phi)})&,\phi=\arccos(\dfrac{a}{c}),a\leq c
\end{cases}
$$

3 椭圆
椭圆是2D空间求解。
3.1 椭圆拟合
对于椭圆的一般方程,可表示为如下形式  
(3.1-1)
$$
s_1x^2+s_2y^2+2s_3xy+2s_4x+2s_5y+s_6=0
$$
上面的方程要表示为椭圆,要求如下条件成立  
(3.1-2)
$$
\begin{cases}
W&=\begin{bmatrix}s_1&s_3
\\
s_3&s_2\end{bmatrix}\\\\
G&=\begin{bmatrix}
s_1 &s_3&s_4
\\
s_3&s_2&s_5
\\
s_4&s_5&s_6
\end{bmatrix}\\\\
|W|&>0\\\\|G|(s_1+s_2)&<0
\end{cases}
$$
现在已知有n组\((x,y)\)数据,为了拟合椭圆,先设置如下中间变量  
(3.1-3)
$$
\begin{cases}
\mathbf{v}_1 &=\begin{bmatrix}s_1 &2s_3&s_2\end{bmatrix}^T
\\
\mathbf{v}_2 &=\begin{bmatrix}2s_4 &2s_5&s_6\end{bmatrix}^T
\\
\\
B&=\dfrac{1}{2}\begin{bmatrix}
0&0&1
\\
0&-2&0
\\
1&0&0
\end{bmatrix}
\\
\\
D_1&=\begin{bmatrix}
x_1^2&x_1y_1&y_1^2
\\
x_2^2&x_2y_2&y_2^2
\\

\\
x_n^2&x_ny_n&y_n^2
\end{bmatrix}
\\
\\
D_2&=\begin{bmatrix}
x_1&y_1&1
\\
x_2&y_2&1
\\

\\
x_n&y_n&1
\end{bmatrix}
\end{cases}
$$
然后根据文献[2],使用如下算法求解\(\mathbf{v}_1,\mathbf{v}_2\).  
(3.1-4)
$$
\begin{cases}
S_1 &=D_1^TD_1
\\
S_2 &=D_1^TD_2
\\
S_3&=D_2^TD_2
\\
M&=-S_3^{-1}S_2^T
\\
P&=B(S_1+S_2M)
\\
\mathbf{v}_2&=M\mathbf{v}_1
\end{cases}
$$
在实际使用时,取\(P\)的特征向量作为\(\mathbf{v}_1\),因为特征向量有多个,因此选择满足条件(3.1-2)的特征向量作为解。

3.2 椭圆标准化
对于标准化椭圆方程,可表示为如下形式  
(3.2-1)
$$
\dfrac{x'^2}{a^2}+\dfrac{y'^2}{b^2}=1
$$

而对于参数化标准椭圆可表示为如下方式

(3.2-2)
$$
\begin{cases}
x'&=a\cos \theta
\\
y'&=b\sin\theta
\end{cases}\ \ \ ,0\leq \theta<2\pi
$$
现在考虑,(3.1-1)的椭圆方程,当经过\([R,\mathbf{t}]\)的刚体变换后,可以在另一个坐标系下表示成(3.2-1)的标准椭圆方程。则有如下表示  
(3.2-3)
$$
\begin{cases}
\mathbf{x}' &=R(\mathbf{x}+\mathbf{t})
\\
\mathbf{x} &=\begin{bmatrix}x&y\end{bmatrix}^T
\\
\mathbf{x}' &=\begin{bmatrix}x'&y'\end{bmatrix}^T
\end{cases}
$$
因此,标准化过程需要求的参数为\(a,b,R,\mathbf{t}\)。 
这里设置中间矩阵  
(3.2-4)
$$
\begin{aligned}
S&=\begin{bmatrix}
\dfrac{1}{a^2} &0
\\
0&\dfrac{1}{b^2}
\end{bmatrix}
\\
Q&=R^TSR
\end{aligned}
$$
因此,求得\(S\)矩阵,即可求得\(a,b\)。这里将(3.2-3)代入(3.2-1)有  
(3.2-5)
$$
\begin{aligned}
1 &=\dfrac{x'^2}{a^2}+\dfrac{y'^2}{b^2}
\\
&=(R(\mathbf{x}+\mathbf{t}))^TS(R(\mathbf{x}+\mathbf{t}))
\\
&=(\mathbf{x}+\mathbf{t})^TR^TSR(\mathbf{x}+\mathbf{t})
\\
&=(\mathbf{x}+\mathbf{t})^TQ(\mathbf{x}+\mathbf{t})
\\
&=\mathbf{x}^TQ\mathbf{x}+\mathbf{t}^TQ\mathbf{t}+2\mathbf{t}^TQ\mathbf{x}
\end{aligned}
$$
由于(3.2-5)与(3.1-1)为同一个椭圆,因此总存在一个非0系数\(k\)使得\(W=kQ\)情况下,下面算式\(x,y\)以及常数项系数与(3.1-1)对应  
(3.2-6)
$$
\mathbf{x}^TW\mathbf{x}+2\mathbf{t}^TW\mathbf{x}+\mathbf{t}^TW\mathbf{t}-k=0
$$
根据系数对应关系,可以得到  
(3.2-7)
$$
\begin{cases}
W&=R^T(kS)R
\\
\\
\mathbf{t} &=W^{-1}\begin{bmatrix}
s_4
\\
s_5
\end{bmatrix}=R^T(kS)^{-1}R\begin{bmatrix}
s_4
\\
s_5
\end{bmatrix}
\\
\\
k &=\mathbf{t}^TW\mathbf{t}-s_6
\end{cases}
$$
因此,在上面公式里先奇异值分解\(W\)获得\(R,kS\)(注意,这里按第4部分进行分解,只有第4部分对称矩阵分解提到的\(m=0\)或者\(m = n\)时,才有解,否则此参数不满足椭圆方程。也可以通过特征分解来获得),然后计算\(\mathbf{t}\),最后计算\(k\),进而得到\(S\)(求解得到的\(S\)对角线元素必须都大于0,否则椭圆方程无解)。需要注意的是,奇异值分解不唯一,可以想象,在标准椭圆\(x',y'\)坐标系下,坐标轴对调后的方程依然为标准椭圆方程,所以需要注意选择。

有的情况下,只想快速确认椭圆长短半轴,这时可直接使用如下公式计算[4]  
(3.2-8)
$$
\begin{cases}
p_1&=\sqrt{(s_1-s_2)^2+4s_3^2}
\\
p_2&=(s_1+s_2)
\\
p_3&=s_3^2-s_1s_2
\\
p_4&=2(s_1s_5^2+s_2s_4^2+s_6s_3^2-2s_3s_4s_5-s_1s_2s_6)
\\
a&=\sqrt{\dfrac{p_4}{p_3(p_1-p_2)}}
\\
b&=\sqrt{\dfrac{p_4}{p_3(-p_1-p_2)}}
\end{cases}
$$

最终,在求得标准椭圆方程\(a,b\)系数后,就可以求椭圆面积,以及周长。为了方便求椭圆面积\(A\)与周长\(C\),这里约定系数\(a\geq b\),可使用如下公式计算面积与周长[4]  
(3.2-9)
$$
\begin{cases}
A &=\pi a b
\\
C &=4a\ \mathbf{EllipticE}(\sqrt{\dfrac{a^2-b^2}{a^2}}) &\approx \pi(a+b)(1+\dfrac{3\gamma^2}{10+\sqrt{4-3\gamma^2}}) \\ \gamma &=\dfrac{a-b}{a+b}
\end{cases}
$$

公式里 \(\mathbf{EllipticE}\) 为第二类完全椭圆积分函数,周长后面的近似公式来自拉马努金公式,这个公式精度较高。

4 对称矩阵分解
对于\(n\)阶对称矩阵\(A\),总可以表示为如下形式  
(4-1)
$$
A = UDWU^T
$$
其中\(U\)为正交矩阵,\(D\)为对角线上元素非负的对角矩阵,\(W\)为对角线元素只能为1或-1的对角矩阵。 
对矩阵\(A\)进行奇异值分解有  
(4-2)
$$
A = UDV^T=UDWU^T \Rightarrow V=UW
$$
这里设\(\mathbf{u}_i、\mathbf{v}_i\)分别为\(U、V\)的第\(i\)列,且\(W=\mathbf{Diag}(w_1,w_2,…)\)则可以得到  
(4-3)
$$
\mathbf{v}_i=w_i\mathbf{u}_i
\\
\Downarrow
\\
||\mathbf{v}_i-\mathbf{u}_i||^2=\begin{cases}
0 &,w_i=1
\\
||2\mathbf{v}_i||^2=4||\mathbf{v}_i||^2=4&,w_i=-1
\end{cases}
$$
因此有  
(4-4)
$$
m=\dfrac{1}{4}\sum_{i=1}^n||\mathbf{v}_i-\mathbf{u}_i||^2=\dfrac{1}{4}||U-V||^2
$$
从上面可以发现\(m\)反应了\(W\)对角线元素为-1的个数,并且可以发现,对称矩阵进行奇异值分解后得到的\(U、V\)每一列有对应关系,特别地\(m=0\)时,它们完全一致。

另一方面,如果对称矩阵\(A\)存在如下(4-5)分解(\(U\)为正交矩阵,\(S\)为对角矩阵,且对角线元素同号),则\(A\)的奇异值分解必须满足\(||U-V||^2=0\text{ or }||U+V||^2=0\)。

(4-5)
$$
A=USU^T
$$

参考
[1] Li Q , Griffiths J G .Least squares ellipsoid specific fitting[C]//Geometric Modeling & Processing.IEEE, 2004.DOI:10.1109/GMAP.2004.1290055.

[2] Radim H R .Numerically Stable Direct Least Squares Fitting Of Ellipses[J].  1999.DOI:doi:http://dx.doi.org/.

[3] 椭球函数

[4] 椭圆函数

基于GPS、IMU、轮速的ESKF

1 背景
在使用传感器采集到一些数据后,需要计算车辆位姿。在融合GPS位置、IMU角速度、轮速后,可以通过ESKF进行求解。ESKF本质还是一个EKF过程,只是这里面更新量换成了值较小的误差状态量。由于是EKF过程,只需要导出下面公式(10)里的\(F、F_i、H\)矩阵,就可以使用EKF过程进行递推。

2 原理
设真值状态变量 \(\mathbf{x}=[\mathbf{p},\theta,\mathbf{b}]\),其分别表示位置、朝向、车辆坐标系下角速度偏置,误差状态量为 \(\delta\mathbf{x}=[\delta\mathbf{p},\delta\theta,\delta\mathbf{b}]\),\(t\)时刻含有噪声状态量为 \(\mathbf{x}_t=[\mathbf{p}_t,\theta_t,\mathbf{b}_t]\)。状态变量之间使用下式进行关联  
(1)
$$
\begin{cases}
\mathbf{p}_t &=\mathbf{p}+\delta\mathbf{p}
\\
\theta_t&=\theta+\delta\theta&,R_t=\exp(\theta_t^\wedge) \approx \exp(\theta^\wedge)\exp(\delta\theta^\wedge)=R\exp(\delta\theta^\wedge)
\\
\mathbf{b}_t&=\mathbf{b}+\delta\mathbf{b}
\end{cases}
$$
以常见的四轮汽车模型为例,现在已知车辆坐标系下的后左右轮速\(v_l,v_r\)以及角速度\(\bar{\mathbf{w}}\),这里以后左右轮中心作为车辆坐标系原点,设\(\bar{\mathbf{v}}=[\dfrac{v_x+v_y}{2},0,0]\),速度与角速度噪声为\(\eta_v,\eta_w\),接下来需要找到满足如下方程的\(F,F_i\)  
(2)
$$
\delta\mathbf{x}=F\delta\mathbf{x}+F_i\begin{bmatrix}
\eta_v
\\
\eta_w
\end{bmatrix}
$$
根据物理模型有  
(3)
$$
\begin{aligned}
&\begin{cases}
\dot{\mathbf{p}}_t &=R_t(\bar{\mathbf{v}}+\eta_v)
\\
\dot{R}_t&=R_t(\bar{\mathbf{w}}-\mathbf{b}_t-\eta_w)^\wedge
\\
\dot{\mathbf{b}}_t&=\eta_w
\end{cases}
\\
&\begin{cases}
\dot{\mathbf{p}} &=R\bar{\mathbf{v}}
\\
\dot{R}&=R(\bar{\mathbf{w}}-\mathbf{b})^\wedge
\\
\dot{\mathbf{b}}&=\mathbf{0}
\end{cases}
\end{aligned}
$$
对于位置更新,结合(1)(3)可得  
(4)
$$
\begin{aligned}
\delta \dot{\mathbf{p}} &=\dot{\mathbf{p}}_t-\dot{\mathbf{p}}
\\
&=(R_t-R)\bar{\mathbf{v}}+R_t\eta_v
\\
&\approx (R\exp(\delta \theta^\wedge)-R)\bar{\mathbf{v}}+R\exp(\delta \theta^\wedge)\eta_v
\\
&\approx (R(I+\delta \theta^\wedge)-R)\bar{\mathbf{v}}+R(I+\delta \theta^\wedge)\eta_v
\\
&=R\delta\theta^\wedge\bar{\mathbf{v}}+R\delta\theta^\wedge\eta_v+R\eta_v
\\
&=-R(\bar{\mathbf{v}}+\eta_v)^\wedge\delta\theta+R\eta_v
\\
&\approx -R\bar{\mathbf{v}}^\wedge\delta\theta+R\eta_v
\end{aligned}
$$
对于旋转部分,结合(1)(3)可得  
(5)
$$
\begin{aligned}
\dot{R}_t&=\dot{R}\exp(\delta\theta^\wedge)+R\dot{\exp(\delta \theta^\wedge)}
\\&=\dot{R}\exp(\delta\theta^\wedge)+R\exp(\delta\theta^\wedge)(\mathbf{J}_r(\delta\theta)\delta\dot{\theta})^\wedge
\\&\Downarrow
\\
\dot{R}_t&\approx\dot{R}\exp(\delta\theta^\wedge)+R\exp(\delta\theta^\wedge)\delta\dot{\theta}^\wedge
\\&\Downarrow
\\
R_t(\bar{\mathbf{w}}-\mathbf{b}_t-\eta_w)^\wedge&=R(\bar{\mathbf{w}}-\mathbf{b})^\wedge\exp(\delta\theta^\wedge)+R\exp(\delta\theta^\wedge)\delta\dot{\theta}^\wedge
\\&\Downarrow
\\
R\exp(\delta\theta^\wedge)(\bar{\mathbf{w}}-\mathbf{b}-\delta\mathbf{b}-\eta_w)^\wedge&=R(\bar{\mathbf{w}}-\mathbf{b})^\wedge\exp(\delta\theta^\wedge)+R\exp(\delta\theta^\wedge)\delta\dot{\theta}^\wedge
\\&\Downarrow
\\
\exp(\delta\theta^\wedge)(\bar{\mathbf{w}}-\mathbf{b}-\delta\mathbf{b}-\eta_w)^\wedge&=(\bar{\mathbf{w}}-\mathbf{b})^\wedge\exp(\delta\theta^\wedge)+\exp(\delta\theta^\wedge)\delta\dot{\theta}^\wedge
\\&\Downarrow
\\
\delta\dot{\theta}^\wedge&=(\bar{\mathbf{w}}-\mathbf{b}-\delta\mathbf{b}-\eta_w)^\wedge-\exp(-\delta\theta^\wedge)(\bar{\mathbf{w}}-\mathbf{b})^\wedge\exp(\delta\theta^\wedge)
\\
&\approx(\bar{\mathbf{w}}-\mathbf{b}-\delta\mathbf{b}-\eta_w)^\wedge-(I-\delta\theta^\wedge)(\bar{\mathbf{w}}-\mathbf{b})^\wedge(I+\delta\theta^\wedge)
\\
&=(\bar{\mathbf{w}}-\mathbf{b}-\delta\mathbf{b}-\eta_w)^\wedge-(\bar{\mathbf{w}}-\mathbf{b})^\wedge-(\bar{\mathbf{w}}-\mathbf{b})^\wedge\delta\theta^\wedge+\delta\theta^\wedge(\bar{\mathbf{w}}-\mathbf{b})^\wedge+\delta\theta^\wedge(\bar{\mathbf{w}}-\mathbf{b})^\wedge\delta\theta^\wedge
\\
&=-(\delta\mathbf{b}+\eta_w)^\wedge-(\bar{\mathbf{w}}-\mathbf{b})^\wedge\delta\theta^\wedge+\delta\theta^\wedge(\bar{\mathbf{w}}-\mathbf{b})^\wedge+\delta\theta^\wedge(\bar{\mathbf{w}}-\mathbf{b})
\\
&\approx -(\delta\mathbf{b}+\eta_w)^\wedge-(\bar{\mathbf{w}}-\mathbf{b})^\wedge\delta\theta^\wedge+\delta\theta^\wedge(\bar{\mathbf{w}}-\mathbf{b})^\wedge
\\
&= -(\delta\mathbf{b}+\eta_w)^\wedge+(\delta\theta^\wedge(\bar{\mathbf{w}}-\mathbf{b}))^\wedge
\\
&=-(\delta\mathbf{b}+\eta_w)^\wedge-((\bar{\mathbf{w}}-\mathbf{b})^\wedge\delta\theta)^\wedge
\\&\Downarrow
\\
\delta\dot{\theta}&=-(\delta\mathbf{b}+\eta_w)-(\bar{\mathbf{w}}-\mathbf{b})^\wedge\delta\theta
\end{aligned}
$$
对于角速度偏置部分,结合(1)(3)可以得到  
(6)
$$
\delta\dot{\mathbf{b}}=\dot{\mathbf{b}}_t-\dot{\mathbf{b}} =\eta_w
$$
因此在一个小时间\(\triangle t\)内,综合(3)(4)(5)可以得到  
(7)
$$
\begin{aligned}
&\begin{cases}
\delta \mathbf{p}_{t+\triangle t}&=\delta \mathbf{p}_t+\triangle t\delta \dot{\mathbf{p}}=\delta \mathbf{p}_t-\triangle tR\bar{\mathbf{v}}^\wedge \delta \theta_t+\triangle tR\eta_v
\\
\delta \theta_{t+\triangle t}&=\delta \theta_t+\triangle t\delta\dot{\theta}=\delta \theta_t-\triangle t(\bar{\mathbf{w}}-\mathbf{b})^\wedge\delta\theta_t-\triangle t(\delta\mathbf{b}_t+\eta_w)
\\
\delta\mathbf{b}_{t+\triangle t}&=\delta\mathbf{b}_t+\triangle t\delta\dot{\mathbf{b}}=\delta\mathbf{b}_t+\triangle t\eta_w
\end{cases}
\\
&\Downarrow
\\
&F=\begin{bmatrix}
I &-\triangle tR\bar{\mathbf{v}}^\wedge &\mathbf{0}
\\
\mathbf{0} & I-\triangle t(\bar{\mathbf{w}}-\mathbf{b})^\wedge &-\triangle tI
\\
\mathbf{0}&\mathbf{0} & I
\end{bmatrix}
\approx \begin{bmatrix}
I &-\triangle tR\bar{\mathbf{v}}^\wedge &\mathbf{0}
\\
\mathbf{0} & \exp(-\triangle t(\bar{\mathbf{w}}-\mathbf{b})^\wedge) &-\triangle tI
\\
\mathbf{0}&\mathbf{0} & I
\end{bmatrix}
\\
&F_i=\triangle t\begin{bmatrix}
R &\mathbf{0}
\\
\mathbf{0} &-I
\\
\mathbf{0} & I
\end{bmatrix}
\end{aligned}
$$
接下来,以GPS位置 \(\bar{\mathbf{p}}\) 作为观测,因此建立观测函数  
(8)
$$
\begin{aligned}
\bar{\mathbf{p}} &=z(\mathbf{x},\delta \mathbf{x})
\\
&=\mathbf{p}_t+\triangle tR_t\bar{\mathbf{v}}
\\
&=\mathbf{p}+\delta\mathbf{p}+\triangle tR\exp(\delta\theta^\wedge)\bar{\mathbf{v}}
\\
&\Downarrow
\\
&\begin{cases}
\dfrac{\partial\bar{\mathbf{p}}}{\partial\delta \mathbf{p}}&=I
\\
\\
\dfrac{\partial\bar{\mathbf{p}}}{\partial\delta \theta}&=\triangle tR\dfrac{\partial(\exp(\delta\theta^\wedge)\bar{\mathbf{v}})}{\partial\delta \theta}\approx-\triangle tR(\exp(\delta\theta^\wedge)\bar{\mathbf{v}})^\wedge
\\
\\
\dfrac{\partial\bar{\mathbf{p}}}{\partial\delta \mathbf{b}}&=\mathbf{0}
\end{cases}
\\
&\Downarrow
\\
H&=\begin{bmatrix}
I & -\triangle tR(\exp(\delta\theta^\wedge)\bar{\mathbf{v}})^\wedge &\mathbf{0}
\end{bmatrix}\approx
\begin{bmatrix}
I & -\triangle tR\bar{v}^\wedge&\mathbf{0}
\end{bmatrix}
\end{aligned}
$$
注意,\(H\)计算中,忽略了二阶小量,这里\(\triangle t、\delta\theta\)均为小量。

EKF更新完成后,需要对协方差矩阵\(P\)进行重置。设 \(\delta \mathbf{x}'=[\delta \mathbf{p}’,\delta \theta’,\delta\mathbf{b}’]\)为\(\delta \mathbf{x}\)受到均值 \(\delta \bar{\mathbf{x}}=[\delta \bar{\mathbf{p}},\delta \bar{\theta},\delta\bar{\mathbf{b}}]\)的影响,因此按照逆重构形式(减法)找到一个满足\(\delta \mathbf{x}'=G\delta\mathbf{x}+…\)形式的重置矩阵\(G\):  
(9)
$$
\begin{aligned}
&\begin{cases}
\delta \mathbf{p}'&=\delta\mathbf{p}-\delta\bar{\mathbf{p}}
\\
\\
\delta \theta'&=\log(\exp(\delta\theta'^\wedge))^\vee
\\
&\approx \log(\exp(\delta\theta^\wedge)\exp(-\delta\bar{\theta})^\wedge)^\vee
\\
&\approx (I-\dfrac{1}{2}\delta\bar{\theta}^\wedge)\delta\theta-\delta\bar{\theta}
\\
\\
\delta\mathbf{b}'&=\delta\mathbf{b}-\delta\bar{\mathbf{b}}
\end{cases}
\\
&\Downarrow
\\
&G=\begin{bmatrix}
I &\mathbf{0} & \mathbf{0}
\\
\mathbf{0} &I-\dfrac{1}{2}\delta\bar{\theta}^\wedge&\mathbf{0}
\\
\mathbf{0} & \mathbf{0} & I
\end{bmatrix}
\end{aligned}
$$

3 算法过程
因此,最终的ESKF过程为  
(10)
$$
\begin{aligned}
\text{预测}:&\begin{cases}
\delta \mathbf{x}&=F\delta\mathbf{x}
\\
P&=FPF^T+F_iQF_i^T
\end{cases}
\\
\text{增益}:&\begin{cases}
K&=PH^T(HPH^T+V)^{-1}
\end{cases}
\\
\text{更新}:&\begin{cases}
\delta \mathbf{x}&=K(\bar{\mathbf{p}}-z(\mathbf{x},\delta\mathbf{x}))
\\
\mathbf{x}_{t+\triangle t}&=\mathbf{x}_t+\delta\mathbf{x}
\\
P&=(I-KH)P(I-KH)^T+KVK^T
\end{cases}
\\
\text{重置}:&\begin{cases}
P&=GPG^T
\end{cases}
\end{aligned}
$$
公式里\(V\)为\(3\times 3\)的GPS观察的协方差矩阵,而\(Q\)是噪声协方差矩阵,\(Q=\mathbf{Diag}(Cov(\eta_v),Cov(\eta_w))\),特别的,对于如下形式的\(Q\)可进行简化  
(11)
$$
\begin{aligned}
Q&=\begin{bmatrix}
\alpha I&\mathbf{0}
\\
\mathbf{0} &\beta I
\end{bmatrix}
\\
&\Downarrow
\\
F_iQF_i^T&=\triangle t^2\begin{bmatrix}
\alpha I &\mathbf{0} & \mathbf{0}
\\
\mathbf{0} &\beta I & \mathbf{0}
\\
\mathbf{0} & \mathbf{0} &\beta I
\end{bmatrix}
\end{aligned}
$$
注意:  
① 公式(10)当中\(P\)的表达式与参考[2]里的不一致,公式(10)里的表达式不局限于\(P\)是否为方阵,且其有更好的数值稳定性。  
② 由于 \(\delta \bar{\theta}\)为0附近一个小量,因此在大部分场景里,可以忽略不计,这时 \(G\)就等价于单位阵,因此不使用重置步骤。

③ \(Q、V\)由仪器提供,或者按经验设置。

④ 计算过程中,注意上面公式里的位置\(\mathbf{p}\)是全局坐标系,\(\bar{\mathbf{v}}、\mathbf{w}、\mathbf{b}\)为车辆局部坐标系,旋转矩阵\(R\)为局部坐标系到世界坐标系的表示方式。

参考
[1] Sola J. Quaternion kinematics for the error-state Kalman filter[J]. arXiv preprint arXiv:1711.02508, 2017.  
[2] 高翔. 简明ESKF推导. 2022

计算指定角度向量

1 背景
在一些算法设计中,可能需要算特定需求的向量。比如已知一个向量,现在想构建一个向量,使得构建向量与指定向量的夹角为指定角度。

2 原理
根据背景介绍,这里解决这么一类问题:已知向量 \(\mathbf{a},\mathbf{b},\mathbf{c},\mathbf{d}\),以及参数 \(\alpha,w_0,w_1\),且参数满足\(|\mathbf{a}|\neq 0,|\mathbf{b}|\neq 0,|\mathbf{c}|\neq 0,|\mathbf{d}|\neq 0,0 < \alpha < 1,0<w_0<w_1\)。现在求未知数\(x,y,z,w\)使得其结果满足如下约束
(1)

$$
\begin{cases}
\alpha &=\dfrac{(x\mathbf{a}+y\mathbf{b}+z\mathbf{c})\cdot \mathbf{d}}{|x\mathbf{a}+y\mathbf{b}+z\mathbf{c}||\mathbf{d}|}
\\
w&=|x\mathbf{a}+y\mathbf{b}+z\mathbf{c}|
\\
w_0&\leq w\leq w_1
\end{cases}
$$
为了求解(1)的问题,这里先记如下中间变量
(2)
$$
\begin{aligned}
v_1&=\alpha|\mathbf{d}|
\\
v_2&=\mathbf{a}\cdot\mathbf{d}
\\
v_3&=\mathbf{b}\cdot\mathbf{d}
\\
v_4&=\mathbf{c}\cdot\mathbf{d}
\\
v_5&=\alpha^2|\mathbf{d}|^2|\mathbf{a}|^2
\\
v_6&=\alpha^2|\mathbf{d}|^2|\mathbf{b}|^2
\\
v_7&=\alpha^2|\mathbf{d}|^2|\mathbf{c}|^2
\\
v_8&=\alpha^2|\mathbf{d}|^2\mathbf{a}\cdot\mathbf{b}
\\
v_9&=\alpha^2|\mathbf{d}|^2\mathbf{b}\cdot\mathbf{c}
\\
v_{10}&=\alpha^2|\mathbf{d}|^2\mathbf{c}\cdot\mathbf{a}
\\
v_{11}&=v_5-v_2^2
\\
v_{12}&=v_6-v_3^2
\\
v_{13}&=v_7-v_4^2
\\
v_{14}&=2(v_8-v_2v_3)
\\
v_{15}&=2(v_9-v_3v_4)
\\
v_{16}&=2(v_{10}-v_4v_2)
\\
v_{17}&=v_4v_{16}-v_2v_{13}
\\
v_{18}&=v_4v_{15}-v_3v_{13}
\\
v_{19}&=v_1v_{13}
\\
v_{20}&=v_{11}v_4^2-v_2v_{17}
\\
v_{21}&=v_{12}v_4^2-v_3v_{18}
\\
v_{22}&=v_{14}v_4^2-v_2v_{18}-v_3v_{17}
\\
v_{23}&=v_1v_{17}-v_2v_{19}
\\
v_{24}&=v_1v_{18}-v_3v_{19}
\\
v_{25}&=v_{22}^2-4v_{20}v_{21}
\\
v_{26}&=2v_{22}v_{23}-4v_{20}v_{24}
\\
v_{27}&=v_{23}^2-4v_{20}v_1v_{19}
\end{aligned}
$$

对(1)式的第1个表达式进行变形可以得到
(3)
$$
\begin{aligned}
&\dfrac{x\mathbf{a}\cdot\mathbf{d}+y\mathbf{b}\cdot\mathbf{d}+z\mathbf{c}\cdot\mathbf{d}}{\alpha|\mathbf{d}|}=|x\mathbf{a}+y\mathbf{b}+z\mathbf{c}|=w>0
\\
&\Downarrow
\\
&\dfrac{v_2x+v_3y+v_4z}{v_1}=w
\Rightarrow
z=\dfrac{v_1w-v_2x-v_3y}{v_4}
\end{aligned}
$$
对(3)式两边进行平方可以得到
(4)
$$
\begin{aligned}
&(\mathbf{a}\cdot\mathbf{d})^2x^2+(\mathbf{b}\cdot\mathbf{d})^2y^2+(\mathbf{c}\cdot\mathbf{d})^2z^2+2(\mathbf{a}\cdot\mathbf{d})(\mathbf{b}\cdot\mathbf{d})xy+2(\mathbf{b}\cdot\mathbf{d})(\mathbf{c}\cdot\mathbf{d})yz+2(\mathbf{c}\cdot\mathbf{d})(\mathbf{a}\cdot\mathbf{d})zx
\\
=&\alpha^2|\mathbf{d}|^2(|\mathbf{a}|^2x^2+|\mathbf{b}|^2y^2+|\mathbf{c}|^2z^2+2(\mathbf{a}\cdot\mathbf{b})xy+2(\mathbf{b}\cdot\mathbf{c})yz+2(\mathbf{c}\cdot\mathbf{a})zx)
\\
&\Downarrow
\\
&v_2^2x^2+v_3^2y^2+v_4^2z^2+2v_2v_3xy+2v_3v_4yz+2v_4v_2zx
\\
=&v_5x^2+v_6y^2+v_7z^2+2v_8xy+2v_9yz+2v_{10}zx
\\
&\Downarrow
\\
0=&(v_7-v_4^2)z^2+2((v_9-v_3v_4)y+(v_{10}-v_4v_2)x)z+(v_5-v_2^2)x^2+(v_6-v_3^2)y^2+2(v_8-v_2v_3)xy
\\
=&v_{13}z^2+(v_{15}y+v_{16}x)z+v_{11}x^2+v_{12}y^2+v_{14}xy
\\
=&\dfrac{v_1w-v_2x-v_3y}{v_4}(v_{13}\dfrac{v_1w-v_2x-v_3y}{v_4}+v_{15}y+v_{16}x)+v_{11}x^2+v_{12}y^2+v_{14}xy
\\
&\Downarrow
\\
0=&(v_1w-v_2x-v_3y)(v_{13}(v_1w-v_2x-v_3y)+v_4(v_{15}y+v_{16}x))+v_4^2(v_{11}x^2+v_{12}y^2+v_{14}xy)
\\
=&(v_1w-v_2x-v_3y)((v_4v_{16}-v_2v_{13})x+(v_4v_{15}-v_3v_{13})y+v_1v_{13}w)+v_4^2(v_{11}x^2+v_{12}y^2+v_{14}xy)
\\
=&(v_1w-v_2x-v_3y)(v_{17}x+v_{18}y+v_{19}w)+v_4^2(v_{11}x^2+v_{12}y^2+v_{14}xy)
\\
=&(v_{11}v_4^2-v_2v_{17})x^2+(v_{12}v_4^2-v_3v_{18})y^2+(v_{14}v_4^2-v_2v_{18}-v_3v_{17})xy+(v_1v_{17}-v_2v_{19})wx+(v_1v_{18}-v_3v_{19})wy+v_1v_{19}w
\\
=&v_{20}x^2+v_{21}y^2+v_{22}xy+v_{23}wx+v_{24}wy+v_1v_{19}w^2
\\
=&v_{20}x^2+(v_{22}y+v_{23}w)x+(v_{21}y^2+v_{24}wy+v_1v_{19}w^2)
\end{aligned}
$$
要对(4)进行求解,明显当\(v_{20}=0\)时,这时的解如下
(5)
$$
\begin{cases}
&\begin{cases}
0 \neq v_{22}y+v_{23}w
\\
x=-\dfrac{v_{21}y^2+v_{24}wy+v_1v_{19}w^2}{v_{22}y+v_{23}w}
\end{cases}&,\text{while } (v_{22}\neq 0 \text{ or } v_{23} \neq 0) \text { and } a_{20}=0
\\
&\begin{cases}
\mathbf{solve}:v_{21}y^2+v_{24}wy+v_1v_{19}w^2=0
\end{cases}&,\text{while } v_{22}= 0 \text{ and } v_{23} = 0 \text { and } a_{20}=0
\end{cases}
$$
这里考虑\(v_{20}\neq 0\)时,(4)的解必须满足如下求解条件
(6)
$$
\begin{aligned}
r&=(v_{22}y+v_{23}w)^2-4v_{20}(v_{21}y^2+v_{24}wy+v_1v_{19}w^2)
\\
&=v_{22}^2y^2+2v_{22}v_{23}wy+v_{23}^2w_2-4v_{20}(v_{21}y^2+v_{24}wy+v_1v_{19}w^2)
\\
&=(v_{22}^2y^2-4v_{20}v_{21})y^2+(2v_{22}v_{23}-4v_{20}v_{24})wy+(v_{23}^2-4v_{20}v_1v_{19})w^2
\\
&=v_{25}y^2+v_{26}wy+v_{27}w^2>0
\\
&\Downarrow
\\
r&=\begin{cases}
v_{26}wy+v_{27}w^2&,\text{while }v_{25}=0
\\
v_{25}(y+\dfrac{v_{26}}{v_{25}}w)^2+\dfrac{(4v_{25}v_{27}-v_{26}^2)}{4v_{25}}w^2&,\text{while }v_{25}\neq0
\end{cases}
\end{aligned}
$$
对于(6),当\(v_{25}= 0\)时,可得如下 \(y\) 解
(7)
$$
y:\begin{cases}
y>-\dfrac{v_{27}}{v_{26}}w &,\text{while }v_{26}\neq 0
\\
任意值 &,\text{while }v_{26}=0 \text{ and } v_{27} \geq 0
\\
无解,&,\text{while }v_{26}=0 \text{ and } v_{27} < 0
\end{cases}
$$
对于(6),当\(v_{25}\neq 0\)时,可得如下 \(y\) 解
(8)
$$
y:\begin{cases}
任意值&,\text{while }v_{25}>0 \text{ and } 4v_{25}v_{27} \geq v_{26}^2
\\
\\
y\geq \dfrac{\sqrt{v_{26}^2-4v_{25}v_{27}}-v_{26}}{2v_{25}}w&,\text{while }v_{25}>0 \text{ and } 4v_{25}v_{27} < v_{26}^2
\\
\\
y\leq -\dfrac{\sqrt{v_{26}^2-4v_{25}v_{27}}+v_{26}}{2v_{25}}w&,\text{while }v_{25}>0 \text{ and } 4v_{25}v_{27} < v_{26}^2
\\
\\
\dfrac{\sqrt{v_{26}^2-4v_{25}v_{27}}-v_{26}}{2v_{25}}w \leq y\leq -\dfrac{\sqrt{v_{26}^2-4v_{25}v_{27}}+v_{26}}{2v_{25}}w&,\text{while }v_{25}<0 \text{ and } 4v_{25}v_{27} \leq v_{26}^2
\\
\\
无解&,\text{while }v_{25}<0 \text{ and } 4v_{25}v_{27} > v_{26}^2
\end{cases}
$$
在(7)(8)中,\(y\)存在解时,其解可以表示为 \(y=s_yw\)形式,因此将求解结果代回(4)可以得到
(9)
$$
\begin{aligned}
0&=v_{20}x^2+(v_{22}y+v_{23}w)x+(v_{21}y^2+v_{24}wy+v_1v_{19}w^2)
\\
&=v_{20}x^2+(s_yv_{22}+v_{23})wx+(s_y^2v_{21}+s_yv_{24}+v_1v_{19})w^2
\\
&=v_{20}x^2-pwx+qw^2
\\
&\Downarrow
\\
x&=\begin{cases}
\dfrac{p+\sqrt{p^2-4v_{20}q}}{2v_{20}}w
\\
\\
\dfrac{p-\sqrt{p^2-4v_{20}q}}{2v_{20}}w
\end{cases},
\begin{cases}
p=-(s_yv_{22}+v_{23})
\\
q=s_y^2v_{21}+s_yv_{24}+v_1v_{19}
\end{cases}
\end{aligned}
$$
从(9)可以看出,\(x\)也可表示成 \(x =s_xw\)形式,最终将\(x,y\)代入(3)可以得到
(10)
$$
z=\dfrac{v_1-v_2s_x-v_3s_y}{v_4}w
$$
因此,在实际求解中,主要使用(5),(7),(8)获得可行解\(y\),然后再计算\(x,z\)。

3 后记
在使用2的原理进行向量构造时,会存在如下问题:
① 由于输入向量特殊性,在求解中,有较大概率会触发无解情况。在自己使用数亿随机测试例子中, 会有将近30%的概率触发无解,好的一面是将近70%的数据能正常求解。
② 在使用(5)(6)(7)求解 \(y\) 时,当 \(y\)在一个区间取值时,这时尽量选择区间中绝对值较小的 \(y\)值。这是因为在一些向量计算里,当\(y\)超过某些限值后,计算可能出现非常大的数,因为计算变量本身精度原因,可能造成计算结果存在差异,这点在公式(8)的第4个解里尤其要注意。
③ 从第2部分原理可以看出,有解时,最终的\(x,y,z\)均与\(w\)存在比例关系。因此在实际公式计算时,可以设\(w=1\),当计算出\(x,y,z\)后,可再对\(x,y,z\)乘以一个满足(1)约束的\(w\)即可。