基于 MLE 的自适应卡尔曼滤波器中 Q 和 R 发散

问题描述 投票:0回答:1

我正在使用最大似然估计 (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,使它们保持正值并收敛到合理的值,从而使自适应卡尔曼滤波器能够准确跟踪系统状态。

signals kalman-filter mle
1个回答
0
投票

经过进一步反思,我意识到基于最大似然估计(MLE)的自适应卡尔曼滤波器性能不佳,根本上有两个关键原因:

窗口长度问题:

1.如果窗口长度太小,就无法准确估计协方差矩阵。

2.即使窗口长度很大,算法也容易出现发散。

3.早期,当数据不足时,算法一旦开始发散,后期即使窗口长度很大,也将无法恢复。

观测数据波动:

观测数据的固有波动会显着影响噪声协方差矩阵的估计,导致不稳定。

建议的解决方案 更好的方法是:

1.设置较大的窗口长度,提高协方差估计的准确性。

2.前期数据有限时,根据经验知识将噪声协方差矩阵设置为常数。

3.然而,这种方案增加了计算开销。

这是我对之前遇到的问题的理解和建议的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.