我正在使用最大似然估计 (MLE) 实现自适应卡尔曼滤波器来更新过程噪声协方差矩阵 Q 和测量噪声协方差矩阵 R。更新 Q 和 R 的公式如图所示(在此处输入图像描述 ) .
代码: 这是我实现的关键部分:
function \[x_updated, P_updated, Q_next, R_next, memory\] = adaptive_kalman_filter(x_prev, P_prev, Q_prev, R_prev, z, memory, Phi, H, N)
% Prediction step
x_predicted = Phi \* x_prev;
P_predicted = Phi \* P_prev \* Phi' + Q_prev;
% Update step
K = P_predicted * H' / (H * P_predicted * H' + R_prev);
x_updated = x_predicted + K * (z - H * x_predicted);
P_updated = (eye(size(P_predicted)) - K * H) * P_predicted;
% Calculate residual and state correction
m_k = z - H * x_predicted;
delta_x_k = x_updated - x_predicted;
% Update memory
memory.m = [memory.m, m_k];
memory.delta_x = [memory.delta_x, delta_x_k];
% Keep the latest N data points
if size(memory.m, 2) > N
memory.m = memory.m(:, end-N+1:end);
memory.delta_x = memory.delta_x(:, end-N+1:end);
end
% Update Q and R
current_N = size(memory.m, 2);
if current_N > 0
R_next = cov(memory.m') - H * P_predicted * H';
Q_next = cov(memory.delta_x') + P_updated - Phi * P_prev * Phi';
else
R_next = R_prev;
Q_next = Q_prev;
end
end
我尝试过的:
我调整了Q和R的初始值,但问题仍然存在。
我使用滑动窗口来限制 MLE 更新中使用的残差和状态校正的数量,但这没有帮助。
预期结果: 我想稳定 Q 和 R,使它们保持正值并收敛到合理的值,从而使自适应卡尔曼滤波器能够准确跟踪系统状态。
经过进一步反思,我意识到基于最大似然估计(MLE)的自适应卡尔曼滤波器性能不佳,根本上有两个关键原因:
窗口长度问题:
1.如果窗口长度太小,就无法准确估计协方差矩阵。
2.即使窗口长度很大,算法也容易出现发散。
3.早期,当数据不足时,算法一旦开始发散,后期即使窗口长度很大,也将无法恢复。
观测数据波动:
观测数据的固有波动会显着影响噪声协方差矩阵的估计,导致不稳定。
建议的解决方案 更好的方法是:
1.设置较大的窗口长度,提高协方差估计的准确性。
2.前期数据有限时,根据经验知识将噪声协方差矩阵设置为常数。
3.然而,这种方案增加了计算开销。
这是我对之前遇到的问题的理解和建议的解决方案。