卡尔曼滤波(Kalman Filter)C#测试

news/2024/7/7 20:05:55

一、操作过程       

刚学了一下卡尔曼滤波,具体原理还没细看,大致过程如下

分为两步,第一步Predict,以下两个公式

第二步Correct,以下三个公式

公式看起来很复杂,其中z_{_{t}}是我们要处理的数据, \hat{x}_{t}是滤波之后的值,其他一些有些是需要给定的,有些是中间值。

        从t=1时刻开始,通过第一步,计算得到的值,给到第二步Correct里,第二步的第二个公式得到t=1时刻的 \hat{x}_{t},即为滤波后的值,t=2时刻,再把第二步在t=1时刻的Correct的那些值,代入到第一步Predict里在计算,再Correct,以此往复,得到所有t时刻的值。

二、代码实现

        试着用C#编写代码实现了下,实际值用了50个数,大致分布是x的平方加一个(0-100)的随机数,如下图黄色线条。 预测值为蓝色线条。

   

void testKF()
{
    double[] xhat = new double[50];   //x 滤波估计值
    double[] P = new double[50];      //滤波估计值协方差矩阵
    double[] xhatminus = new double[50];   //x 估计值
    double[] Pminus = new double[50];    //估计协方差矩阵
    double[] K = new double[50];    //卡尔曼增益

    double R = 0.1;  //测量噪音协方差 R一般可以观测得到,是滤波器的已知条件

    double Q = 0.01;  //过程激励噪声协方差(系统过程的协方差)。
                         //该参数被用来表示状态转换矩阵与实际过程之间的误差。
                         //因为我们无法直接观测到过程信号, 所以 Q 的取值是很难确定的。
                         //是卡尔曼滤波器用于估计离散时间过程的状态变量,也叫预测模型本身带来的噪声,状态转移协方差矩阵


    double[] x = new double[50];  //真实值加噪音
    Random r1 = new Random();           
    for (int i = 0; i < 50; i++)
    {
        x[i] = i*i + r1.NextDouble()*100;
    }

    P[0] = 1.0;
    xhat[0] = 0.0;

    double A=1,H=1;

    for(int i = 1;i < 50;i++)
    {
        //预测
        xhatminus[i] = A*xhat[i - 1];
        Pminus[i] = A*P[i - 1] + Q;

        //更新
        K[i] = Pminus[i]*H / (H*Pminus[i]*H + R);
        xhat[i] = xhatminus[i] + K[i] * (x[i] - H*xhatminus[i]);
        P[i] = (1 - K[i]*H) * Pminus[i];
    }


    chart1.Series[0].Points.Clear();
    chart1.Series[0].Name = "预测值";
    

    for (int i = 1; i < xhatminus.Length; i++)
    {
        chart1.Series[0].Points.AddXY(i, xhatminus[i]);

    }

    Series series = new Series();
    series.ChartType = SeriesChartType.Spline;
    series.Name = "实际值";
    for (int i = 1; i < xhatminus.Length; i++)
    {
        series.Points.AddXY(i, x[i]);

    }

    chart1.Series.Add(series);

}

OK,晚点再细看下原理

 


http://lihuaxi.xjx100.cn/news/1559430.html

相关文章

正则表达式新解

文章目录 是什么&#xff1f;正则用法匹配单个字符匹配一组字符其他元字符核心函数 贪婪匹配和非贪婪匹配正则练习 是什么&#xff1f; 正则表达式(Regular Expression)是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊…

离散数学之 一阶逻辑等值演算与推理

一阶逻辑等值式与置换规则 基本等值式 这里用到了量词辖域的收缩 未完待续

从电大搜题到上海开放大学,广播电视大学引领学习新风尚

近年来&#xff0c;随着信息技术的飞速发展&#xff0c;互联网的普及和应用成为了我们生活中不可或缺的一部分。而在大学学习领域&#xff0c;电大搜题微信公众号应运而生&#xff0c;为广大学子提供了便捷的学习资源和交流平台。在这个信息高速发展的时代&#xff0c;上海开放…

滚雪球学Java(19):Java中的内存机制

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

OpenCV实现图像去水印功能(inpaint)

水印定位 需要根据图像特征获取水印的位置。 如图所示&#xff0c;图像左下角、右下角有水印。第一步&#xff0c;我们首先得定位水印所在位置。 Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);//图像二值化&#xff0c;筛选出白色区域部分Mat thresh;threshold(gray, thres…

IEEE模板中没有.bib相关内容怎么添加?

为了加深个人对该问题的记忆&#xff0c;特在此进行记录。 下图是IEEE某期刊提供的期刊模板&#xff0c;该模板来自于IEEE-Template Selector 从图中并没有看到bib文件&#xff0c;而在main.tex中也并没有相关引导&#xff0c;只是提到&#xff1a; 那如何添加呢&#xff1f;…

Vue中的路由介绍以及Node.js的使用

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

Python 搭建编程环境

一、搭建编程环境 1、下载python 官网&#xff1a;https://www.python.org 2、开始安装 下载安装版本&#xff0c;双击下载的安装包&#xff0c;如下&#xff1a; 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 安装完成后执行下面的操作&#xff0c;判断是否…