{
  "id": "ekf",
  "title": "EKF localization (range-only, two beacons)",
  "blurb": "A nonlinear Extended Kalman Filter \u2014 range-only trilateration to two beacons; the gain K = P\u00b7H\u1d40\u00b7(H\u00b7P\u00b7H\u1d40+R)\u207b\u00b9 exercises the matrix-inverse operator.",
  "emit_targets": 100,
  "proofs": [
    {
      "theorem": "ekf_range_nonneg",
      "claim": "the range measurement \u221a((lx-x)\u00b2+(ly-y)\u00b2) is \u2265 0",
      "clean": true,
      "trail": "ekf_range_nonneg.axioms.txt"
    },
    {
      "theorem": "kalman2d_innovation_cov_psd",
      "claim": "the innovation covariance H\u00b7P\u00b7H\u1d40+R stays positive-semidefinite",
      "clean": true,
      "trail": "kalman2d_innovation_cov_psd.axioms.txt"
    },
    {
      "theorem": "kalman2d_matrix_joseph_psd",
      "claim": "the Joseph covariance update A\u00b7P\u00b7A\u1d40+W preserves PSD for any gain",
      "clean": true,
      "trail": "kalman2d_matrix_joseph_psd.axioms.txt"
    }
  ],
  "checks": [
    {
      "quantity": "EKF position RMSE vs dead-reckoning",
      "value": "0.479 / 2.993",
      "relation": "ratio",
      "bound": "0.16 < 0.6",
      "holds": true
    },
    {
      "quantity": "max |EKF \u2212 NumPy-EKF|",
      "value": "4.2e-15",
      "relation": "<",
      "bound": "1e-9",
      "holds": true
    }
  ],
  "silicon": [
    "complementary_filter.fuse",
    "weighted_fusion.fuse3",
    "kalman2d_update_matrix.update_cov"
  ]
}