请用c++写一个扩展卡尔曼滤波算法的示例
时间: 2023-11-15 17:04:31 浏览: 78
好的,以下是一个简单的 C++ 扩展卡尔曼滤波算法的示例:
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 状态变量的维度
const int STATE_DIM = 2;
// 观测变量的维度
const int OBSERVATION_DIM = 1;
// 状态转移矩阵
vector<vector<double>> A = {{1, 1}, {0, 1}};
// 状态噪声协方差矩阵
vector<vector<double>> Q = {{0.1, 0}, {0, 0.1}};
// 观测矩阵
vector<vector<double>> H = {{1, 0}};
// 观测噪声协方差矩阵
vector<vector<double>> R = {{0.01}};
// 扩展卡尔曼滤波算法
void extendedKalmanFilter(vector<vector<double>>& X, vector<vector<double>>& P, vector<vector<double>>& Z)
{
// 预测
vector<vector<double>> X_ = {{X[0][0] + X[1][0]}, {X[1][0]}};
vector<vector<double>> P_ = {{P[0][0] + Q[0][0], P[0][1] + Q[0][1]}, {P[1][0] + Q[1][0], P[1][1] + Q[1][1]}};
// 更新
vector<vector<double>> K = {{P_[0][0] * H[0][0] / (H[0][0] * P_[0][0] + R[0][0])}, {P_[1][0] * H[0][0] / (H[0][0] * P_[0][0] + R[0][0])}};
vector<vector<double>> X__ = {{X_[0][0] + K[0][0] * (Z[0][0] - H[0][0] * X_[0][0])}, {X_[1][0] + K[1][0] * (Z[0][0] - H[0][0] * X_[0][0])}};
vector<vector<double>> P__ = {{(1 - K[0][0] * H[0][0]) * P_[0][0], (1 - K[0][0] * H[0][0]) * P_[0][1]}, {(1 - K[1][0] * H[0][0]) * P_[1][0], (1 - K[1][0] * H[0][0]) * P_[1][1]}};
// 更新状态变量和协方差矩阵
X = X__;
P = P__;
}
int main()
{
// 初始化状态变量和协方差矩阵
vector<vector<double>> X = {{0}, {0}};
vector<vector<double>> P = {{1, 0}, {0, 1}};
// 模拟观测数据
vector<vector<double>> Z = {{sin(0.1)}, {sin(0.2)}, {sin(0.3)}, {sin(0.4)}, {sin(0.5)}, {sin(0.6)}, {sin(0.7)}, {sin(0.8)}, {sin(0.9)}, {sin(1.0)}};
// 执行扩展卡尔曼滤波算法
for (int i = 0; i < Z.size(); i++)
{
extendedKalmanFilter(X, P, Z[i]);
// 输出结果
cout << "X: " << X[0][0] << ", " << X[1][0] << endl;
cout << "P: " << P[0][0] << ", " << P[0][1] << endl;
cout << " " << P[1][0] << ", " << P[1][1] << endl;
}
return 0;
}
```
在这个示例中,我们使用了一个简单的状态方程和观测方程,并且假设了状态噪声和观测噪声都是高斯噪声。在实际应用中,需要根据具体问题设定方程和噪声模型。
阅读全文