标量卡尔曼滤波与 Joseph 协方差
题目
随机游走模型,每步先预测,再校正: 最后一个式子是标量 Joseph 协方差更新。
输入
,然后 个观测;,。
输出
每步后验 ,共 个实数。
示例
输入
10 0 1 0 0.2
0 0 0 0 0 0 0 0 0 0
期望输出
0.0 0.16666666666666669 0.8333333333333334 0.0 0.09090909090909091 0.4545454545454546 0.0 0.0625 0.3125 0.0 0.047619047619047616 0.23809523809523808 0.0 0.038461538461538464 0.1923076923076923 0.0 0.03225806451612904 0.16129032258064516 0.0 0.027777777777777787 0.1388888888888889 0.0 0.024390243902439032 0.12195121951219515 0.0 0.021739130434782615 0.10869565217391307 0.0 0.01960784313725491 0.09803921568627452
在线 C++17 练习
在浏览器编译运行,代码不上传;首次下载约 28 MB。
尚未运行
运行环境
Clang 22 / C++17 / WASI,支持本题所需标准库;不支持线程、C++ 异常或任意宿主系统访问。每例 2 秒、256 MiB 线性内存、64 KiB 输出;编译器另占浏览器内存,不适合低内存设备。初次加载最多等待 120 秒,可随时停止。
草稿保存在本浏览器。测试公开,属于本地自测而非防作弊竞赛判题;参考解答不参与运行。所有运行资产均由本站提供。
编译器来源与开源许可参考实现(完成后再展开)
对照自己的推导,检查状态更新顺序、边界条件与单位,而不只比较最终输出。
#include <iostream>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <vector>
#include <array>
#include <queue>
#include <tuple>
#include <limits>
using namespace std;
// Reference implementation: optional; solve the starter before opening.
int main() {
cout << setprecision(17);
int n;
double x,p,q,r;
cin>>n>>x>>p>>q>>r;
while(n--) {
double z;
cin>>z;
p+=q;
double k=p/(p+r);
x+=k*(z-x);
p=(1-k)*(1-k)*p+k*k*r;
cout<<x<<" "<<p<<" "<<k<<"\n";
}
}