[TOC]
蒙特卡洛仿真的基本原理是通过生成大量的随机样本,以近似地估计实际事件的概率和预测结果。 它是以蒙特卡洛赌场命名的,因为它使用随机数和概率统计的方法来模拟现实世界中的各种情况和结果,就像在赌场中抛骰子或发牌一样。
缺点:收敛精度
$\varepsilon \propto \frac{1}{\sqrt{n}}$ , 收敛速度慢!优点:和问题的维数无关,只要边界可以描述,就都可以求。
我们都知道, 单位圆围成的面积为
Matlab仿真:
n = 1000000; % 十万个点
p = unifrnd(0,1,2,n); % 在 0~1 区间均匀随机分布,生成二维点
PI = 4*sum(sum(p.^2)<1)/n % 求出在四分之一圆内的比例,再乘 4
结果:PI = 3.141092
,前三个数字是准确的。计算机仿真,可以实现均匀分布,如果是现实仿真,保证不了均匀分布,效果会更差。
在单位球体内偏离中心 0.25 的位置挖去一个半径为 0.25 的柱体 (参见图), 试求该球体剩余部分的体积。
用一个立方体,包住这个球,生成均匀分布的随机点,
Matlab仿真:
n = 100000;
p = unifrnd(-1,1,3,n);
V = 2^3*sum(sum(p.^2)<1&(p(1,:).^2 + (p(2,:)-0.25).^2)>0.25^2)/n
结果:V = 3.812905
。
已知
现在有如下的函数,输入
用5个红点也能变换过去,也能统计均值和方差,画出误差椭圆是叉线,与500个绿点得到的十字线几乎重合。
假设随机向量的线性变换关系
$\boldsymbol{P}{x}=\boldsymbol{A} \boldsymbol{A}^{\mathrm{T}} \quad$ 记 $\sqrt{\boldsymbol{P}{x}}=\boldsymbol{A} \quad\left[\begin{array}{cc}1 & 2 \ 2 & 13\end{array}\right]=\left[\begin{array}{lll}1 & 0 \ 2 & 3\end{array}\right]$
如此,P 就可以写成:$\boldsymbol{P}{x}=\sqrt{\boldsymbol{P}{x}}{\sqrt{\boldsymbol{P}{x}}}^{\mathrm{T}}=\sum{i=1}^{n}\left(\sqrt{\boldsymbol{P}{x}}\right){i}\left(\sqrt{\boldsymbol{P}{x}}\right){i}^{\mathrm{T}}$ ,向量累加和的形式。
如 $\begin{array}{l}{\left[\begin{array}{cc}1 & 2 \ 2 & 13\end{array}\right]=\left[\begin{array}{cc}1 & 0 \ 2 & 3\end{array}\right]\left[\begin{array}{ll}1 & 2 \ 0 & 3\end{array}\right]} =\left[\begin{array}{l}1 \ 2\end{array}\right]\left[\begin{array}{ll}1 & 2\end{array}\right]+\left[\begin{array}{l}0 \ 3\end{array}\right]\left[\begin{array}{ll}0 & 3\end{array}\right]\end{array}$
向量就是图上的点,$p$ 如果是高维的,$\sqrt{\boldsymbol{P}}$ 里的每一列就代表其中一个点。
$$ \left{\begin{array}{l} \overline{\boldsymbol{x}}=\lim \limits_{k \rightarrow \infty} \frac{1}{k} \sum_{i=1}^{k} \chi_{i} \approx \frac{1}{n} \sum_{i=1}^{n} \chi_{i} \ \boldsymbol{P}{x}=\lim \limits{k \rightarrow \infty} \frac{1}{k} \sum_{i=1}^{k}\left(\chi_{i}-\bar{x}\right)\left(\chi_{i}-\overline{\boldsymbol{x}}\right)^{\mathrm{T}} \approx \frac{1}{n} \sum_{i=1}^{n}\left(\chi_{i}-\overline{\boldsymbol{x}}\right)\left(\chi_{i}-\overline{\boldsymbol{x}}\right)^{\mathrm{T}} \end{array}\right. $$
式中的
输入取上一步求得的sigma点,带入线性函数中,得: $$ \left{\begin{array}{l} \overline{\boldsymbol{x}}=\frac{1}{2 n} \sum_{i=1}^{2 n} \chi_{i} \ \boldsymbol{P}{x}=\frac{1}{2 n} \sum{i=1}^{2 n}\left(\chi_{i}-\overline{\boldsymbol{x}}\right)\left(\chi_{i}-\overline{\boldsymbol{x}}\right)^{\mathrm{T}} \end{array}\right. $$ 记Sigma点组成的输入矩阵:$\chi=\left[[\overline{\boldsymbol{x}}]{n}+\sqrt{n \boldsymbol{P}{x}}\quad[\overline{\boldsymbol{x}}]{n}-\sqrt{n \boldsymbol{P}{x}}\right]$ ,n*2n矩阵
得Sigma点组成的输出矩阵:$\boldsymbol{\eta}=\left[[\boldsymbol{F} \overline{\boldsymbol{x}}]{n}+\boldsymbol{F} \sqrt{n \boldsymbol{P}{x}} \quad[\boldsymbol{F}\overline{\boldsymbol{x}}]{n}-\boldsymbol{F} \sqrt{n \boldsymbol{P}{x}}\right]$
$$ \left{\begin{array}{l} \overline{\boldsymbol{y}}=\frac{1}{2 n} \sum_{i=1}^{2 n} \boldsymbol{\eta}{i}=\frac{1}{2 n} \sum{i=1}^{2 n} \boldsymbol{F} \overline{\boldsymbol{x}}=\boldsymbol{F} \overline{\boldsymbol{x}} \ \boldsymbol{P}{y}=\frac{1}{2 n} \sum{i=1}^{2 n}\left(\boldsymbol{\eta}{i}-\overline{\boldsymbol{y}}\right)\left(\boldsymbol{\eta}{i}-\overline{\boldsymbol{y}}\right)^{\mathrm{T}}=\frac{1}{2 n} \sum_{i=1}^{2 n}\left(\boldsymbol{F} \sqrt{n \boldsymbol{P}{x}}\right)\left(\boldsymbol{F} \sqrt{n \boldsymbol{P}{x}}\right)^{\mathrm{T}}=\boldsymbol{F}{x} \boldsymbol{F}^{\mathrm{T}} \ \boldsymbol{P}{x y}=\frac{1}{2 n} \sum_{i=1}^{2 n}\left(\boldsymbol{x}{i}-\overline{\boldsymbol{x}}\right)\left(\boldsymbol{\eta}{i}-\overline{\boldsymbol{y}}\right)^{\mathrm{T}}=\frac{1}{2 n} \sum_{i=1}^{2 n}\left(\sqrt{n \boldsymbol{P}{x}}\right)\left(\boldsymbol{F} \sqrt{n \boldsymbol{P}{x}}\right)^{\mathrm{T}}=\boldsymbol{P}_{x} \boldsymbol{F}^{\mathrm{T}} \end{array}\right. $$
与理论结果一致,精确地捕获了输出的一、二阶矩。
将这种操作放到非线性函数
其中:
非线性如果比较严重,$\alpha$ 就应该取的比较小,使展开的点集中上次均值的附近。
EKF需要泰勒级数展开;UKF不需要,只要表达式能知道能运算就行了,点总可以运算得到结果,总可以进行统计
系统模型 $$ \left{\begin{array}{l}\boldsymbol{x}{k}=\boldsymbol{f}\left(\boldsymbol{x}{k-1}\right)+\boldsymbol{B}{k-1} \boldsymbol{w}{k-1} \ \boldsymbol{y}{k}=\boldsymbol{h}\left(\boldsymbol{x}{k}\right)+\boldsymbol{v}{k}\end{array}\right. $$ 滤波框架 $$ \left{\begin{array}{l}\boldsymbol{K}{k}=\boldsymbol{P}{x y, k / k-1} \boldsymbol{P}{y, k / k-1}^{-1} \ \hat{\boldsymbol{x}}{k}=\hat{\boldsymbol{x}}{k / k-1}+\boldsymbol{K}{k}\left(\boldsymbol{y}{k}-\hat{\boldsymbol{y}}{k / k-1}\right) \ \boldsymbol{P}{x, k}=\boldsymbol{P}{x, k / k-1}-\boldsymbol{K}{k} \boldsymbol{P}{y, k / k-1} \boldsymbol{K}{k}^{\mathrm{T}}\end{array}\right. $$ 状态预测UT变换 $$ \left{\begin{array}{l}\boldsymbol{\chi}{k-1}=\left[\begin{array}{lll}\hat{\boldsymbol{x}}{k-1} & {\left[\hat{\boldsymbol{x}}{k-1}\right]{n}+\gamma \sqrt{\boldsymbol{P}{x, k-1}}} & {\left[\hat{\boldsymbol{x}}{k-1}\right]{n}-\gamma \sqrt{\boldsymbol{P}{x, k-1}}}\end{array}\right] \ \chi_{i, k / k-1}^{}=\boldsymbol{f}\left(\boldsymbol{\chi}{i, k-1}\right) \ \hat{\boldsymbol{x}}{k / k-1}=\sum_{i=0}^{2 n} W_{i}^{m} \chi_{i, k / k-1}^{} \ \boldsymbol{P}{x, k / k-1}=\sum{i=0}^{2 n} W_{i}^{c}\left(\chi_{i, k / k-1}^{}-\hat{\boldsymbol{x}}{k / k-1}\right)\left(\chi{i, k / k-1}^{}-\hat{\boldsymbol{x}}{k / k-1}\right)^{\mathrm{T}}+\boldsymbol{B}{k-1} \boldsymbol{Q}{k-1} \boldsymbol{B}{k-1}^{\mathrm{T}}\end{array}\right. $$ 量测预测UT变换 $$ \left{\begin{array}{l}\boldsymbol{\chi}{k / k-1}=\left[\begin{array}{lll}\hat{\boldsymbol{x}}{k / k-1} & {\left[\hat{\boldsymbol{x}}{k / k-1}\right]{n}+\gamma \sqrt{\boldsymbol{P}{x, k / k-1}}} & {\left[\hat{\boldsymbol{x}}{k / k-1}\right]{n}-\gamma \sqrt{\boldsymbol{P}{x, k / k-1}}}\end{array}\right] \ \boldsymbol{\eta}{i, k / k-1}=\boldsymbol{h}\left(\chi{i, k / k-1}\right) \ \hat{\boldsymbol{y}}{k / k-1}=\sum{i=0}^{2 n} W_{i}^{m} \boldsymbol{\eta}{i, k / k-1} \ \boldsymbol{P}{y, k / k-1}=\sum_{i=0}^{2 n} W_{i}^{c}\left(\boldsymbol{\eta}{i, k / k-1}-\hat{\boldsymbol{y}}{k / k-1}\right)\left(\boldsymbol{\eta}{i, k / k-1}-\hat{\boldsymbol{y}}{k / k-1}\right)^{\mathrm{T}}+\boldsymbol{R}{k} \ \boldsymbol{P}{x y, k / k-1}=\sum_{i=0}^{2 n} W_{i}^{c}\left(\boldsymbol{\chi}{i, k / k-1}-\hat{\boldsymbol{x}}{k / k-1}\right)\left(\boldsymbol{\eta}{i, k / k-1}-\hat{\boldsymbol{y}}{k / k-1}\right)^{\mathrm{T}}\end{array}\right. $$ 每个都实现,带到框架里,完成UKF时间更新、量测更新
仿真结果:滤波效果与初值的选择关系密切
近似非线性概率传播 比近似非线性函数(泰勒展开线性化)更简单,此时UKF滤波比EKF滤波更具优势。
比如惯导大失准角误差模型 $$ \left{\begin{array}{l}\dot{\boldsymbol{\alpha}}=\boldsymbol{C}{\omega}^{-1}\left[\left(\boldsymbol{I}-\boldsymbol{C}{n}^{n^{\prime}}\right) \boldsymbol{\omega}{i n}^{n}-\boldsymbol{\varepsilon}^{n^{\prime}}\right] \ \delta \dot{\boldsymbol{v}}^{n}=\left[\boldsymbol{I}-\left(\boldsymbol{C}{n}^{n^{\prime}}\right)^{\mathrm{T}}\right] \tilde{\boldsymbol{f}}{s f}^{n^{\prime}}+\left(\boldsymbol{C}{n}^{n^{\prime}}\right)^{\mathrm{T}} \nabla^{n^{\prime}}\end{array}\right. $$ 其中: $$ \boldsymbol{C}{\omega}^{-1}=\frac{1}{c \alpha{x}}\left[\begin{array}{ccc}c \alpha_{y} c \alpha_{x} & 0 & s \alpha_{y} c \alpha_{x} \ s \alpha_{y} s \alpha_{x} & c \alpha_{x} & -c \alpha_{y} s \alpha_{x} \ -s \alpha_{y} & 0 & c \alpha_{y}\end{array}\right] $$
$$ \boldsymbol{C}{n}^{n^{\prime}}=\left[\begin{array}{ccc}c \alpha{y} c \alpha_{z}-s \alpha_{y} s \alpha_{x} s \alpha_{z} & c \alpha_{y} s \alpha_{z}+s \alpha_{y} s \alpha_{x} c \alpha_{z} & -s \alpha_{y} c \alpha_{x} \ -c \alpha_{x} s \alpha_{z} & c \alpha_{x} c \alpha_{z} & s \alpha_{x} \ s \alpha_{y} c \alpha_{z}+c \alpha_{y} s \alpha_{x} s \alpha_{z} & s \alpha_{y} s \alpha_{z}-c \alpha_{y} s \alpha_{x} c \alpha_{z} & c \alpha_{y} c \alpha_{x}\end{array}\right] $$
方程如此复杂,想进行泰勒级数展开很困难,可以用UKF。