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


    一、操作过程       

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

    分为两步,第一步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)的随机数,如下图黄色线条。 预测值为蓝色线条。

       

    1. void testKF()
    2. {
    3. double[] xhat = new double[50]; //x 滤波估计值
    4. double[] P = new double[50]; //滤波估计值协方差矩阵
    5. double[] xhatminus = new double[50]; //x 估计值
    6. double[] Pminus = new double[50]; //估计协方差矩阵
    7. double[] K = new double[50]; //卡尔曼增益
    8. double R = 0.1; //测量噪音协方差 R一般可以观测得到,是滤波器的已知条件
    9. double Q = 0.01; //过程激励噪声协方差(系统过程的协方差)。
    10. //该参数被用来表示状态转换矩阵与实际过程之间的误差。
    11. //因为我们无法直接观测到过程信号, 所以 Q 的取值是很难确定的。
    12. //是卡尔曼滤波器用于估计离散时间过程的状态变量,也叫预测模型本身带来的噪声,状态转移协方差矩阵
    13. double[] x = new double[50]; //真实值加噪音
    14. Random r1 = new Random();
    15. for (int i = 0; i < 50; i++)
    16. {
    17. x[i] = i*i + r1.NextDouble()*100;
    18. }
    19. P[0] = 1.0;
    20. xhat[0] = 0.0;
    21. double A=1,H=1;
    22. for(int i = 1;i < 50;i++)
    23. {
    24. //预测
    25. xhatminus[i] = A*xhat[i - 1];
    26. Pminus[i] = A*P[i - 1] + Q;
    27. //更新
    28. K[i] = Pminus[i]*H / (H*Pminus[i]*H + R);
    29. xhat[i] = xhatminus[i] + K[i] * (x[i] - H*xhatminus[i]);
    30. P[i] = (1 - K[i]*H) * Pminus[i];
    31. }
    32. chart1.Series[0].Points.Clear();
    33. chart1.Series[0].Name = "预测值";
    34. for (int i = 1; i < xhatminus.Length; i++)
    35. {
    36. chart1.Series[0].Points.AddXY(i, xhatminus[i]);
    37. }
    38. Series series = new Series();
    39. series.ChartType = SeriesChartType.Spline;
    40. series.Name = "实际值";
    41. for (int i = 1; i < xhatminus.Length; i++)
    42. {
    43. series.Points.AddXY(i, x[i]);
    44. }
    45. chart1.Series.Add(series);
    46. }

    OK,晚点再细看下原理

     

  • 相关阅读:
    3、Pinpoint-Agent端注册服务到Server端
    Java之异常处理
    Ubuntu下载odbc驱动
    新火种AI|微软扶持下一个OpenAI?Mistral AI新模型对标GPT-4,上线即挤爆
    docker安装MongoDB数据库,并且进行密码配置
    vue-cli创建项目的步骤
    TRT部署ONNX
    FormatterRegistry配置应用的格式转换功能
    队列和栈两种数据结构的区别和Python实现
    AIGC(生成式AI)试用 6 -- 从简单到复杂
  • 原文地址:https://blog.csdn.net/Isaac320/article/details/133084017