{ 0, 0, 0, 1e-3 }
});
final ProcessModel pm = new DefaultProcessModel(A, B, Q, initialState, initialErrorCovariance);
final MeasurementModel mm = new DefaultMeasurementModel(H, R);
final KalmanFilter filter = new KalmanFilter(pm, mm);
final List<Number> realX = new ArrayList<Number>();
final List<Number> realY = new ArrayList<Number>();
final List<Number> measuredX = new ArrayList<Number>();
final List<Number> measuredY = new ArrayList<Number>();
final List<Number> kalmanX = new ArrayList<Number>();
final List<Number> kalmanY = new ArrayList<Number>();
for (int i = 0; i < iterations; i++) {
// get real location
realX.add(cannonball.getX());
realY.add(cannonball.getY());
// get measured location
final double mx = cannonball.getMeasuredX();
final double my = cannonball.getMeasuredY();
measuredX.add(mx);
measuredY.add(my);
// iterate the cannon simulation to the next timeslice.
cannonball.step();
final double[] state = filter.getStateEstimation();
kalmanX.add(state[0]);
kalmanY.add(state[2]);
// update the kalman filter with the measurements
filter.predict(controlVector);
filter.correct(new double[] { mx, 0, my, 0 } );
}
chart.setXAxisTitle("Distance (m)");
chart.setYAxisTitle("Height (m)");