卡尔曼滤波算法
这里就不详细讲解该算法,我觉得比较好的讲解,可以参考文章:
【工程师学算法】工程常用算法(二)—— 卡尔曼滤波(Kalman Filter)
随机数的产生
均匀分布随机数的产生
均匀分布的概率密度函数为:
f ( x ) = { 1 b − a , a ≤ x ≤ b 0 , 其 他 f(x)=\begin{cases} \frac{1}{b-a} ,&a\le x \le b \\ 0,&其他 \\ \end{cases} f(x)={
b−a1,0,a≤x≤b其他
通常用 U ( a , b ) U(a,b) U(a,b)表示。均匀分布的均值为 ( a + b ) / 2 (a+b)/2 (a+b)/2,方差为 ( a − b ) 2 / 12 (a-b)^2/12 (a−b)2/12。产生均匀分布随机数的方法如下:
- 由给定的初值 x 0 x_0 x0,用混合同余法: { x i = ( a x i − 1 + c ) m o d M y i = x i / M \begin{cases}x_i =(ax_{i-1}+c) mod M \\y_i={x_i}/{M} \end{cases} { xi=(axi−1+c)modMyi=xi/M
- 通过变换 z i = a + ( b − a ) y i z_i=a+(b-a)y_i zi=a+(b−a)yi产生 ( a , b ) (a,b) (a,b)区间上的随机数 z i z_i zi。
C语言代码如下:
typedef float DistriType;
DistriType Uniform(DistriType a,DistriType b,long int *seed)
{
DistriType t;
*seed = 2045 * (*seed) + 1;
*seed = *seed - (*seed / 1048576) * 1048576;
t = (*seed) / 1048576.0;
t = a + (b - a) * t;
return t;
}
正态分布的随机数
正态分布的概率密度函数为
f ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}} f(x)=2πσ1e−2σ2(x−μ)2
通常用 N ( μ , σ 2 ) N(\mu,\sigma^2) N(μ,σ2)表示。式中 μ \mu μ为均值, σ 2 \sigma^2 σ2为方差。正态分布也称高斯分布。
设 r 1 , r 2 , . . . , r n r_1,r_2,...,r_n r