关键词不能为空

当前您在: 主页 > 高中公式大全 >

外汇盈亏计算公式卡尔曼滤波算法

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2020-10-05 20:24
tags:卡尔曼滤波公式

have和has的用法口诀-最温暖的陪伴

2020年10月5日发(作者:满涛)
卡尔曼滤波器的介绍
为了可以更加容易的理解卡尔曼滤波器,这里会应用形象的描
述 方法来讲解,而不是像大多数参考书那样罗列一大堆的数学公式
和数学符号。但是,他的5条公式是其核 心内容。结合现代的计算机,其
实卡尔曼的程序相当的简单,只要你理解了他的那5条公式。
在介绍他的5条公式之前,先让我们来根据下面的例子一步一步
的探索。
假设我们要 研究的对象是一个房间的温度。根据你的经验判断,这个
房间的温度是恒定的,也就是下
一分钟的温度等于现在这一分钟的温度(假设我们用一分
钟来做时间单位)
。假设你 对你的经验不是100%的相信,可能会有
上下偏差几度。我们把这些偏差看成
是高斯白噪声, 也就是这些偏差跟前后时间是没有关系的而
且符合高斯分配。另外,我们在房间里放一个温度计,但是这 个温
度计也不准确的,测量值会比实际值偏差。我们也把这些偏差看成
是高斯白噪声。
好了,现在对于某一分钟我们有两个有关于该房间的温度值:你
根据经验的预测值(系统的预测值)和 温度计的值(测量值)。
下面我们要用这两个值结合他们各自的噪声来估算出房间的
实际温度值 。
假如我们要估算k时刻的是实际温度值。首先你要根据k-1时刻
的温度值,来预测k时刻 的温度。因为你相信温度是恒定的,所
以你会得到k时刻的温度预测值是跟k-1时刻一样的,假设是2 3
度,同时该值的高斯噪声的偏差是5度(5是这样得到的:如果
k-1时刻估算出的最优温度 值的偏差是3,你对自己预测的不确定
度是4度,他们平方相加再开方,就是5)。然后,你从温度计那
里得到了k时刻的温度值,假设是25
度,同时该值的偏差是4度。
由于我们用于 估算k时刻的实际温度有两个温度值,分别是23
度和25度。究竟实际温度是多少呢?相信自己还是相
信温度计呢?究竟相信谁多一点,我们可
以用他们的covariance来判断。因为
Kg^2=5^2(5^2+4^2)所以Kg=0.78,我们可以估算出k时刻的实
际温度值是: 23+0.78*(25-23)=24.56度。可以看出,因为温度
计的covariance比较 小(比较相信温度计),所以估算出的最优
温度值偏向温度计的值。
现在我们已经得到k时刻 的最优温度值了,下一步就是要进入
k+1时刻,进行新的最优估算。到现
在为止,好像还没 看到什么自回归的东西出现。对了,在进入
k+1时刻之前,我们还要算出k时刻那个最优值(24.5 6度)的
偏差。算法如下:((1-Kg)*5^2)^0.5=2.35。这里的5就是上面的
k时刻你预测的那个23度温度值的偏差,得出的2.35就是进入
k+1时刻以后k时刻估算出的最 优温度值的偏差(对应于上面的
3)。
就是这样,卡尔曼滤波器就不断的把covarian ce递归,从而估
算出最优的温度值。他运行的很快,而且它只保留了上一时刻
的covari ance。上面的Kg,就是卡尔曼增益(Kalman Gain)。他可以随
不同的时刻而改变他自 己的值,是不是很神奇!下面就要言归正
传,讨论真正工程系统上的卡尔曼。
卡尔曼滤波器算法
在这一部分,我们就来描述源于Dr Kalman的卡尔曼滤波器。下面 的
描述,会涉及一些基本的概念知识,包括概率随即变
量高斯或正态分配还有State- space Model等等。
但对于卡尔曼滤波器的详细证明,这里不能一一描述。
首先, 我们先要引入一个离散控制过程的










一个线






LinearStochastic Difference
equation)来描述:
X(k)=A X(k-1)+B U(k)+W(k)
再加上系统的测量值:
Z(k)=H X(k)+V(k)
上两式子中,X(k) 是k时刻的系统状态,U(k)是k时刻对系统的
控制量。A和B是系统参数,对于
多模型系 统,他们为矩阵。Z(k)是k时刻的测量值,H是测量系
统的参数,对于多测量系统,H
为 矩阵。W(k)和V(k)分




噪声
别表示过程和测
。他们被假设成高斯白
(WhiteGaussianNoise),他们的covarian ce分别是Q,
R(这里我们假设他们不随系统状态变化而变化)。
对于满足上面的条件(线 性随机微分系统,过程和测量都是高斯白
噪声),卡尔曼滤波器是最优的信息处理器。下面我们来用他们 结
合他们的covariances来估算系统的最优化输出(类似上一节那
个温度的例子)。
首先我们要利用系统的过程模型,来预测下一状态的系统。假设
现在的系统状态是k,根据系统 的模
型,可以基于系统的上一状态而预测出现在状态:
X(k|k-1)=A X(k-1|k-1)+B U(k) ……….. (1)
式(1)中,X(k|k-1)是利用上 一状态预测的结果,X(k-1|k-1)是上
一状态最优的结果,U(k)为现在状态的控制量,如果 没有控制量,
它可以为0。
到现在为止,我们的系统结果已经更新了,可是,对应于X(k| k-1)
的covariance还没更新。我们用P表示covariance:
P(k|k-1)=A P(k-1|k-1) A’+Q ……… (2)
式(2)中,P (k|k-1)是X(k|k-1)对应的covariance,P(k-1|k-1)
是X(k-1 |k-1)对应的covariance,A’表示A
的转置矩阵,Q是系统过程的covarian ce。式子1,2就是卡尔曼
滤波器5个公式当中的前两个,也就是对系统的预测。
现在我们 有了现在状态的预测结果,然后我们再收集现在状态的测量
值。结合预测值和测量值,我们
可以得到现在状态(k)的最优化估算值X(k|k):
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) ……… (3)
其中Kg为卡尔曼增益(Kalman Gain):
Kg(k)= P(k|k-1) H’ (H P(k|k-1) H’ + R) ……… (4)
到现在为止,我们已经得到了k 状态下最优的估算值X(k|k)。
但是为了要另卡尔曼滤波器不断的运行下去直到系统过程结
束,我们还要更新k状态下X(k|k)的covariance:
P(k|k)=(I-Kg(k) H)P(k|k-1) ……… (5)
其中I为1的矩阵,对于单模型单测量,I=1。当系统进入 k+1
状态时,P(k|k)就是式子(2)的P(k-1|k-1)。这样,算法就可以自
回 归的运算下去。
使用C语言编程实现(核心算法)。
程序1
x_mid=x_last;x_last=x(k-1|k-1),x_mid=x(k|k-1)
p_mid=p_last+Q;p_mid=p(k|k-1),p_last=p(k-1|k-1 ),Q=噪声
kg=p_mid(p_mid+R); kg为kalman filter,R为噪声
z_measure=z_real+frand()*0.03;测量值
x_now=x_mid+kg*(z_measure-x_mid);估计出的最优值
p_now=(1-kg)*p_mid;最优值对应的covariance
p_last = p_now;更新covariance值
x_last = x_now;
更新系统状态值
#include
#include
#include
double frand()
{ return 2*((rand()(double)RAND_MAX) - 0.5); 随机噪声}
void main()
{
float x_last=0;
float p_last=0.02;
float Q=0.018;
float R=0.542;
float kg;
float x_mid;
float x_now;
float p_mid;
float p_now;
float z_real=0.56;0.56
float z_measure;
float sumerror_kalman=0;
float sumerror_measure=0;
int i;
x_last=z_real+frand()*0.03;
x_mid=x_last;
for(i=0;i<20;i++)
{
x_mid=x_last; x_last=x(k-1|k-1),x_mid=x(k|k-1)
p_mid=p_last+Q; p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪

kg=p_mid(p_mid+R); kg为kalman filter,R为噪声
z_measure=z_real+frand()*0.03;测量值
x_now=x_mid+kg*(z_measure-x_mid);估计出的最优值
p_now=(1-kg)*p_mid;最优值对应的covariance
printf(显示真值
printf(
[diff:%.3f]n
显示测量值以及真值与测量值之间的误差
printf(position: %6.3f
[diff:%.3f]n显示
kalman估计值以及真值和卡尔曼估计值的误差
sumerror_kalman += fabs(z_real - x_now); kalman估计值
的累积误差
sumerror_measure += fabs(z_real-z_measure); 真值与测量
值的累积误差
p_last = p_now; 更新covariance值
x_last = x_now; 更新系统状态值
}
printf(总体测量误差: %fn输出测
量累积误差
printf(总体卡尔曼滤波误差: %fn
输出kalman累积误差
printf(卡尔曼误差所占比例: %d%%
n
}
其实作为应用我们 只需知道卡尔曼输入的两个量,一个是测量
值,一个是预测值,程序都是成型的,重点还是在参数的调试 上。
整个算法中影响输出的就是Kg的值,可以简单的理解为一种加
权行为,相信谁更多一点而 已。
代码如下:说明:简化版卡尔曼滤波
程序2

volatile float QingJiao = 0; 最终准确角度输出变量定义

volatile float Gyro_Data = 0; 陀螺仪

float Q =1,R =3900; 调整卡尔曼的滞后 3900

static float RealData = 0,RealData_P =10000;

float NowData = 0,NowData_P =0

float Kg = 0,gyroscope_rate = 0,gyroscope_rat = 0,accelerometer_angle;

volatile float gyroscope_angle=0 用卡
尔曼滤波时不用此变量

int Gyro1_zero=0;

void kalman_update(void)

{

if(zeroflag>1000) 与开机自检有关,没用到的可
以删去



{ zeroflag=1001; 确保zeroflag不会溢出

—————————————————————————— ————————
————————-

Acc_z = Acc_z – 28850; 加速度计采集的AD值减去直立时的输出




Gyro1_zero=zerosub1000; 陀螺仪开机自检累加1000次后取均值
得到陀螺仪零偏值

Gyro1 = Gyro1 – Gyro1_zero; 陀螺仪AD采集值
减去陀螺仪零偏值

Gyro_Data = Gyro1;

accelerometer_angle= Acc_z*180(47915.71-12843.7); 加速度计计算出的
角度 归一化到-90 到+90

gyroscope_rate = Gyro1*0.0235*0.005; 0.0235 是转换角度的比例值 0.005
是控制周期

gyroscope_rat =gyroscope_rat -Gyro1*0.0235*0.005; 积分角速度得到角


卡尔曼五个公式的算法实


NowData = RealData -gyroscope_rate;

NowData_P = Q+RealData_P;

Kg = NowData_P(NowData_P+R);

RealData = NowData + Kg*(accelerometer_angle – NowData);

RealData_P = (1-Kg)*NowData_P;

QingJiao = RealData; 将准确角度结果给QingJiao

}

}


程序3

float gyro_m:陀螺仪测得的量(角速度)
float incAngle:加计测得的角度值
#define dt 0.02卡尔曼滤波采样频率
#define R_angle 0.5 测量噪声的协方差(即是测量偏差)
#define Q_angle 0.0001过程噪声的协方差
#define Q_gyro 0.0003 过程噪声的协方差 过程噪声协方差为一个
一行两列矩阵
float kalmanUpdate(const float gyro_m,constfloat incAngle)
{
float K_0;含有卡尔曼增益的另外一个函数,用于计算最优估计值
float K_1;含有卡尔曼增益的函数,用于计算最优估计值的偏差
float Y_0;
float Y_1;

float Rate;去除偏差后的角速度
float Pdot[4];过程协方差矩阵的微分矩阵
float angle_err;角度偏量
float E;计算的过程量
static float angle = 0; 下时刻最优估计值角度
static float q_bias = 0; 陀螺仪的偏差
static float P[2][2] = {{ 1, 0 }, { 0, 1 }};过程协方差矩阵 |1 0|
|0 1|
计算过程协方差矩阵的微分矩阵
Pdot[0] = Q_angle - P[0][1] - P[1][0];?????? | 0.0001
- 1 |
Pdot[1] = - P[1][1]; |- 1
0.0003 |
Pdot[2] = - P[1][1];
Pdot[3] = Q_gyro;??????
angle += Rate * dt; 角速度积分得出角度
P[0][0] += Pdot[0] * dt; 计算协方差矩阵 | 1.00002
-0.02 |
P[0][1] += Pdot[1] * dt; |- 0.02
1.00006 |
P[1][0] += Pdot[2] * dt;
P[1][1] += Pdot[3] * dt;
Rate = gyro_m - q_bias; 去除偏差后的角速度
angle_err = incAngle - angle; 计算角度偏差
E = R_angle + P[0][0];
K_0 = P[0][0] E; 计算卡尔曼增益
K_1 = P[1][0] E;
Y_0 = P[0][0];
Y_1 = P[0][1];
P[0][0] -= K_0 * Y_0; 跟新协方差矩阵
P[0][1] -= K_0 * Y_1;
P[1][0] -= K_1 * Y_0;
P[1][1] -= K_1 * Y_1;
angle += K_0 * angle_err; 给出最优估计值
q_bias += K_1 * angle_err;跟新最优估计值偏差
return angle;
}

our什么意思-心理咨询认证考试


技校学费一般多少-勤学励志的名言警句


如何教孩子数学-吃什么菜可以减肥


现在学什么专业最好-中专学历能做什么工作


数学辅导一对一-什么是野鸡大学


近视眼的形成-石椁


给老师留言的暖心句子-夸女人有才华


孙膑赛马-elderly



本文更新与2020-10-05 20:24,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/409937.html

卡尔曼滤波算法的相关文章

  • 爱心与尊严的高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊严高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊重的作文题库

    1.作文关爱与尊重议论文 如果说没有爱就没有教育的话,那么离开了尊重同样也谈不上教育。 因为每一位孩子都渴望得到他人的尊重,尤其是教师的尊重。可是在现实生活中,不时会有

    小学作文
  • 爱心责任100字作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任心的作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文