You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2011/06/22 15:42:40 UTC

svn commit: r1138461 - in /commons/proper/math/trunk/src: main/java/org/apache/commons/math/filter/ test/java/org/apache/commons/math/filter/

Author: erans
Date: Wed Jun 22 13:42:39 2011
New Revision: 1138461

URL: http://svn.apache.org/viewvc?rev=1138461&view=rev
Log:
MATH-485
"KalmanFilter" and related classes updated by Thomas Neidhart according to
comments on JIRA.

Added:
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/package.html   (with props)
Modified:
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultMeasurementModel.java
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultProcessModel.java
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/KalmanFilter.java
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/MeasurementModel.java
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/ProcessModel.java
    commons/proper/math/trunk/src/test/java/org/apache/commons/math/filter/KalmanFilterTest.java

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultMeasurementModel.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultMeasurementModel.java?rev=1138461&r1=1138460&r2=1138461&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultMeasurementModel.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultMeasurementModel.java Wed Jun 22 13:42:39 2011
@@ -27,35 +27,45 @@ import org.apache.commons.math.linear.Re
  */
 public class DefaultMeasurementModel implements MeasurementModel {
 
+    /**
+     * The measurement matrix, used to associate the measurement vector to the
+     * internal state estimation vector.
+     */
     private RealMatrix measurementMatrix;
+
+    /**
+     * The measurement noise covariance matrix.
+     */
     private RealMatrix measurementNoise;
 
     /**
      * Create a new {@link MeasurementModel}, taking double arrays as input
      * parameters for the respective measurement matrix and noise.
      *
-     * @param measurementMatrix
+     * @param measMatrix
      *            the measurement matrix
-     * @param measurementNoise
+     * @param measNoise
      *            the measurement noise matrix
      */
-    public DefaultMeasurementModel(final double[][] measurementMatrix,
-            final double[][] measurementNoise) {
-        this(new Array2DRowRealMatrix(measurementMatrix),
-                new Array2DRowRealMatrix(measurementNoise));
+    public DefaultMeasurementModel(final double[][] measMatrix,
+            final double[][] measNoise) {
+        this(new Array2DRowRealMatrix(measMatrix),
+                new Array2DRowRealMatrix(measNoise));
     }
 
     /**
      * Create a new {@link MeasurementModel}, taking {@link RealMatrix} objects
      * as input parameters for the respective measurement matrix and noise.
      *
-     * @param measurementMatrix
-     * @param measurementNoise
+     * @param measMatrix
+     *            the measurement matrix
+     * @param measNoise
+     *            the measurement noise matrix
      */
-    public DefaultMeasurementModel(final RealMatrix measurementMatrix,
-            final RealMatrix measurementNoise) {
-        this.measurementMatrix = measurementMatrix;
-        this.measurementNoise = measurementNoise;
+    public DefaultMeasurementModel(final RealMatrix measMatrix,
+            final RealMatrix measNoise) {
+        this.measurementMatrix = measMatrix;
+        this.measurementNoise = measNoise;
     }
 
     /**

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultProcessModel.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultProcessModel.java?rev=1138461&r1=1138460&r2=1138461&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultProcessModel.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/DefaultProcessModel.java Wed Jun 22 13:42:39 2011
@@ -28,20 +28,40 @@ import org.apache.commons.math.linear.Re
  * @version $Id$
  */
 public class DefaultProcessModel implements ProcessModel {
-
+    /**
+     * The state transition matrix, used to advance the internal state
+     * estimation each time-step.
+     */
     private RealMatrix stateTransitionMatrix;
+
+    /**
+     * The control matrix, used to integrate a control input into the state
+     * estimation.
+     */
     private RealMatrix controlMatrix;
-    private RealMatrix processNoise;
-    private RealVector initialStateEstimate;
-    private RealMatrix initialErrorCovariance;
+
+    /**
+     * The process noise covariance matrix.
+     */
+    private RealMatrix processNoiseCovMatrix;
+
+    /**
+     * The initial state estimation of the observed process.
+     */
+    private RealVector initialStateEstimateVector;
+
+    /**
+     * The initial error covariance matrix of the observed process.
+     */
+    private RealMatrix initialErrorCovMatrix;
 
     /**
      * Create a new {@link ProcessModel}, taking double arrays as input
      * parameters.
      *
-     * @param stateTransitionMatrix
+     * @param stateTransition
      *            the state transition matrix
-     * @param controlMatrix
+     * @param control
      *            the control matrix
      * @param processNoise
      *            the process noise matrix
@@ -50,15 +70,15 @@ public class DefaultProcessModel impleme
      * @param initialErrorCovariance
      *            the initial error covariance matrix
      */
-    public DefaultProcessModel(final double[][] stateTransitionMatrix,
-            final double[][] controlMatrix, final double[][] processNoise,
+    public DefaultProcessModel(final double[][] stateTransition,
+            final double[][] control, final double[][] processNoise,
             final double[] initialStateEstimate,
             final double[][] initialErrorCovariance) {
-        this(new Array2DRowRealMatrix(stateTransitionMatrix),
-                new Array2DRowRealMatrix(controlMatrix),
-                new Array2DRowRealMatrix(processNoise), new ArrayRealVector(
-                        initialStateEstimate), new Array2DRowRealMatrix(
-                        initialErrorCovariance));
+        this(new Array2DRowRealMatrix(stateTransition),
+                new Array2DRowRealMatrix(control),
+                new Array2DRowRealMatrix(processNoise),
+                new ArrayRealVector(initialStateEstimate),
+                new Array2DRowRealMatrix(initialErrorCovariance));
     }
 
     /**
@@ -66,17 +86,17 @@ public class DefaultProcessModel impleme
      * parameters. The initial state estimate and error covariance are omitted
      * and will be initialized by the {@link KalmanFilter} to default values.
      *
-     * @param stateTransitionMatrix
+     * @param stateTransition
      *            the state transition matrix
-     * @param controlMatrix
+     * @param control
      *            the control matrix
      * @param processNoise
      *            the process noise matrix
      */
-    public DefaultProcessModel(final double[][] stateTransitionMatrix,
-            final double[][] controlMatrix, final double[][] processNoise) {
-        this(new Array2DRowRealMatrix(stateTransitionMatrix),
-                new Array2DRowRealMatrix(controlMatrix),
+    public DefaultProcessModel(final double[][] stateTransition,
+            final double[][] control, final double[][] processNoise) {
+        this(new Array2DRowRealMatrix(stateTransition),
+                new Array2DRowRealMatrix(control),
                 new Array2DRowRealMatrix(processNoise), null, null);
     }
 
@@ -84,9 +104,9 @@ public class DefaultProcessModel impleme
      * Create a new {@link ProcessModel}, taking double arrays as input
      * parameters.
      *
-     * @param stateTransitionMatrix
+     * @param stateTransition
      *            the state transition matrix
-     * @param controlMatrix
+     * @param control
      *            the control matrix
      * @param processNoise
      *            the process noise matrix
@@ -95,15 +115,15 @@ public class DefaultProcessModel impleme
      * @param initialErrorCovariance
      *            the initial error covariance matrix
      */
-    public DefaultProcessModel(final RealMatrix stateTransitionMatrix,
-            final RealMatrix controlMatrix, final RealMatrix processNoise,
+    public DefaultProcessModel(final RealMatrix stateTransition,
+            final RealMatrix control, final RealMatrix processNoise,
             final RealVector initialStateEstimate,
             final RealMatrix initialErrorCovariance) {
-        this.stateTransitionMatrix = stateTransitionMatrix;
-        this.controlMatrix = controlMatrix;
-        this.processNoise = processNoise;
-        this.initialStateEstimate = initialStateEstimate;
-        this.initialErrorCovariance = initialErrorCovariance;
+        this.stateTransitionMatrix = stateTransition;
+        this.controlMatrix = control;
+        this.processNoiseCovMatrix = processNoise;
+        this.initialStateEstimateVector = initialStateEstimate;
+        this.initialErrorCovMatrix = initialErrorCovariance;
     }
 
     /**
@@ -124,20 +144,20 @@ public class DefaultProcessModel impleme
      * {@inheritDoc}
      */
     public RealMatrix getProcessNoise() {
-        return processNoise;
+        return processNoiseCovMatrix;
     }
 
     /**
      * {@inheritDoc}
      */
     public RealVector getInitialStateEstimate() {
-        return initialStateEstimate;
+        return initialStateEstimateVector;
     }
 
     /**
      * {@inheritDoc}
      */
     public RealMatrix getInitialErrorCovariance() {
-        return initialErrorCovariance;
+        return initialErrorCovMatrix;
     }
 }

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/KalmanFilter.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/KalmanFilter.java?rev=1138461&r1=1138460&r2=1138461&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/KalmanFilter.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/KalmanFilter.java Wed Jun 22 13:42:39 2011
@@ -17,7 +17,6 @@
 package org.apache.commons.math.filter;
 
 import org.apache.commons.math.exception.DimensionMismatchException;
-import org.apache.commons.math.exception.NullArgumentException;
 import org.apache.commons.math.linear.Array2DRowRealMatrix;
 import org.apache.commons.math.linear.ArrayRealVector;
 import org.apache.commons.math.linear.CholeskyDecompositionImpl;
@@ -27,27 +26,26 @@ import org.apache.commons.math.linear.Ma
 import org.apache.commons.math.linear.NonSquareMatrixException;
 import org.apache.commons.math.linear.RealMatrix;
 import org.apache.commons.math.linear.RealVector;
-import org.apache.commons.math.linear.SingularMatrixException;
 import org.apache.commons.math.util.MathUtils;
 
 /**
- * Implementation of a Kalman filter to estimate the state <i>x<sub>k</sub> of a
- * discrete-time controlled process that is governed by the linear stochastic
- * difference equation:
+ * Implementation of a Kalman filter to estimate the state <i>x<sub>k</sub></i>
+ * of a discrete-time controlled process that is governed by the linear
+ * stochastic difference equation:
  *
  * <pre>
- * <i>x<sub>k</sub> = <b>A</b><i>x<sub>k-1</sub> + <b>B</b><i>u<sub>k-1</sub> + <i>w<sub>k-1</sub>
+ * <i>x<sub>k</sub></i> = <b>A</b><i>x<sub>k-1</sub></i> + <b>B</b><i>u<sub>k-1</sub></i> + <i>w<sub>k-1</sub></i>
  * </pre>
  *
- * with a measurement <i>x<sub>k</sub> that is
+ * with a measurement <i>x<sub>k</sub></i> that is
  *
  * <pre>
- * <i>z<sub>k</sub> = <b>H</b><i>x<sub>k</sub> + <i>v<sub>k</sub>.
+ * <i>z<sub>k</sub></i> = <b>H</b><i>x<sub>k</sub></i> + <i>v<sub>k</sub></i>.
  * </pre>
  *
- * The random variables <i>w<sub>k</sub> and <i>v<sub>k</sub> represent the
- * process and measurement noise and are assumed to be independent of each other
- * and distributed with normal probability (white noise).
+ * The random variables <i>w<sub>k</sub></i> and <i>v<sub>k</sub></i> represent
+ * the process and measurement noise and are assumed to be independent of each
+ * other and distributed with normal probability (white noise).
  * <p>
  * The Kalman filter cycle involves the following steps:
  * <ol>
@@ -55,48 +53,64 @@ import org.apache.commons.math.util.Math
  * <li>correct: adjust the projected estimate by an actual measurement</li>
  * </ol>
  * </p>
+ * <br/>
+ * <p>
+ * The Kalman filter is initialized with a {@link ProcessModel} and a
+ * {@link MeasurementModel}, which contain the corresponding transformation and
+ * noise covariance matrices. The parameter names used in the respective models
+ * correspond to the following names commonly used in the mathematical
+ * literature:
+ * <ul>
+ * <li>A - state transition matrix</li>
+ * <li>B - control input matrix</li>
+ * <li>H - measurement matrix</li>
+ * <li>Q - process noise covariance matrix</li>
+ * <li>R - measurement noise covariance matrix</li>
+ * <li>P - error covariance matrix</li>
+ * </ul>
+ * </p>
  *
  * @see <a href="http://www.cs.unc.edu/~welch/kalman/">Kalman filter
  *      resources</a>
  * @see <a href="http://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf">An
  *      introduction to the Kalman filter by Greg Welch and Gary Bishop</a>
- * @see <a
- *      href="http://academic.csuohio.edu/simond/courses/eec644/kalman.pdf">Kalman
- *      filter example by Dan Simon</a>
- *
+ * @see <a href="http://academic.csuohio.edu/simond/courses/eec644/kalman.pdf">
+ *      Kalman filter example by Dan Simon</a>
+ * @see ProcessModel
+ * @see MeasurementModel
  * @version $Id$
  */
 public class KalmanFilter {
     /** Serializable version identifier. */
     private static final long serialVersionUID = 4878026651422612760L;
-    /** The transition matrix, equivalent to A */
-    private transient RealMatrix transitionMatrix;
-    /** The transposed transition matrix */
-    private transient RealMatrix transitionMatrixT;
-    /** The control matrix, equivalent to B */
-    private transient RealMatrix controlMatrix;
-    /** The measurement matrix, equivalent to H */
-    private transient RealMatrix measurementMatrix;
-    /** The transposed measurement matrix */
-    private transient RealMatrix measurementMatrixT;
-    /** The internal state estimation vector, equivalent to x hat */
-    private transient RealVector stateEstimation;
-    /** The process noise covariance matrix, equivalent to Q */
-    private transient RealMatrix processNoise;
-    /** The measurement noise covariance matrix, equivalent to R */
-    private transient RealMatrix measurementNoise;
-    /** The error covariance matrix, equivalent to P */
-    private transient RealMatrix errorCovariance;
+    /** The process model used by this filter instance. */
+    private final ProcessModel processModel;
+    /** The measurement model used by this filter instance. */
+    private final MeasurementModel measurementModel;
+    /** The transition matrix, equivalent to A. */
+    private RealMatrix transitionMatrix;
+    /** The transposed transition matrix. */
+    private RealMatrix transitionMatrixT;
+    /** The control matrix, equivalent to B. */
+    private RealMatrix controlMatrix;
+    /** The measurement matrix, equivalent to H. */
+    private RealMatrix measurementMatrix;
+    /** The transposed measurement matrix. */
+    private RealMatrix measurementMatrixT;
+    /** The internal state estimation vector, equivalent to x hat. */
+    private RealVector stateEstimation;
+    /** The error covariance matrix, equivalent to P. */
+    private RealMatrix errorCovariance;
 
     /**
      * Creates a new Kalman filter with the given process and measurement
      * models.
      *
-     * @param processModel
+     * @param process
      *            the model defining the underlying process dynamics
-     * @param measurementModel
+     * @param measurement
      *            the model defining the given measurement characteristics
-     * @throws NullArgumentException
+     * @throws org.apache.commons.math.exception.NullArgumentException
      *             if any of the given inputs is null (except for the control
      *             matrix)
      * @throws NonSquareMatrixException
@@ -104,39 +118,46 @@ public class KalmanFilter {
      * @throws MatrixDimensionMismatchException
      *             if the matrix dimensions do not fit together
      */
-    public KalmanFilter(final ProcessModel processModel,
-            final MeasurementModel measurementModel)
-            throws NullArgumentException, NonSquareMatrixException,
-            MatrixDimensionMismatchException {
+    public KalmanFilter(final ProcessModel process,
+                        final MeasurementModel measurement) {
+
+        MathUtils.checkNotNull(process);
+        MathUtils.checkNotNull(measurement);
 
-        MathUtils.checkNotNull(processModel);
-        MathUtils.checkNotNull(measurementModel);
+        this.processModel = process;
+        this.measurementModel = measurement;
 
         transitionMatrix = processModel.getStateTransitionMatrix();
         MathUtils.checkNotNull(transitionMatrix);
         transitionMatrixT = transitionMatrix.transpose();
 
         // create an empty matrix if no control matrix was given
-        controlMatrix = (processModel.getControlMatrix() == null) ?
-            new Array2DRowRealMatrix() :
-            processModel.getControlMatrix();
+        if (processModel.getControlMatrix() == null) {
+            controlMatrix = new Array2DRowRealMatrix();
+        } else {
+            controlMatrix = processModel.getControlMatrix();
+        }
 
         measurementMatrix = measurementModel.getMeasurementMatrix();
         MathUtils.checkNotNull(measurementMatrix);
         measurementMatrixT = measurementMatrix.transpose();
 
-        processNoise = processModel.getProcessNoise();
+        // check that the process and measurement noise matrices are not null
+        // they will be directly accessed from the model as they may change
+        // over time
+        RealMatrix processNoise = processModel.getProcessNoise();
         MathUtils.checkNotNull(processNoise);
-
-        measurementNoise = measurementModel.getMeasurementNoise();
-        MathUtils.checkNotNull(measurementNoise);
+        RealMatrix measNoise = measurementModel.getMeasurementNoise();
+        MathUtils.checkNotNull(measNoise);
 
         // set the initial state estimate to a zero vector if it is not
-        // available
-        stateEstimation = (processModel.getInitialStateEstimate() == null) ?
-            new ArrayRealVector(transitionMatrix.getColumnDimension()) :
-            processModel.getInitialStateEstimate();
-        MathUtils.checkNotNull(stateEstimation);
+        // available from the process model
+        if (processModel.getInitialStateEstimate() == null) {
+            stateEstimation =
+                new ArrayRealVector(transitionMatrix.getColumnDimension());
+        } else {
+            stateEstimation = processModel.getInitialStateEstimate();
+        }
 
         if (transitionMatrix.getColumnDimension() != stateEstimation.getDimension()) {
             throw new DimensionMismatchException(transitionMatrix.getColumnDimension(),
@@ -144,10 +165,12 @@ public class KalmanFilter {
         }
 
         // initialize the error covariance to the process noise if it is not
-        // available
-        errorCovariance = (processModel.getInitialErrorCovariance() == null) ? processNoise
-                .copy() : processModel.getInitialErrorCovariance();
-        MathUtils.checkNotNull(errorCovariance);
+        // available from the process model
+        if (processModel.getInitialErrorCovariance() == null) {
+            errorCovariance = processNoise.copy();
+        } else {
+            errorCovariance = processModel.getInitialErrorCovariance();
+        }
 
         // sanity checks, the control matrix B may be null
 
@@ -181,10 +204,10 @@ public class KalmanFilter {
         }
 
         // row dimension of R must be equal to row dimension of H
-        if (measurementNoise.getRowDimension() != measurementMatrix.getRowDimension() ||
-            measurementNoise.getColumnDimension() != 1) {
-            throw new MatrixDimensionMismatchException(measurementNoise.getRowDimension(),
-                                                       measurementNoise.getColumnDimension(),
+        if (measNoise.getRowDimension() != measurementMatrix.getRowDimension() ||
+            measNoise.getColumnDimension() != 1) {
+            throw new MatrixDimensionMismatchException(measNoise.getRowDimension(),
+                                                       measNoise.getColumnDimension(),
                                                        measurementMatrix.getRowDimension(), 1);
         }
     }
@@ -258,7 +281,7 @@ public class KalmanFilter {
      * @throws DimensionMismatchException
      *             if the dimension of the control vector does not fit
      */
-    public void predict(final double[] u) throws DimensionMismatchException {
+    public void predict(final double[] u) {
         predict(new ArrayRealVector(u));
     }
 
@@ -270,7 +293,7 @@ public class KalmanFilter {
      * @throws DimensionMismatchException
      *             if the dimension of the control vector does not fit
      */
-    public void predict(final RealVector u) throws DimensionMismatchException {
+    public void predict(final RealVector u) {
         // sanity checks
         if (u != null &&
             u.getDimension() != controlMatrix.getColumnDimension()) {
@@ -290,7 +313,8 @@ public class KalmanFilter {
         // project the error covariance ahead
         // P(k)- = A * P(k-1) * A' + Q
         errorCovariance = transitionMatrix.multiply(errorCovariance)
-                .multiply(transitionMatrixT).add(processNoise);
+                .multiply(transitionMatrixT)
+                .add(processModel.getProcessNoise());
     }
 
     /**
@@ -300,11 +324,10 @@ public class KalmanFilter {
      *            the measurement vector
      * @throws DimensionMismatchException
      *             if the dimension of the measurement vector does not fit
-     * @throws SingularMatrixException
+     * @throws org.apache.commons.math.linear.SingularMatrixException
      *             if the covariance matrix could not be inverted
      */
-    public void correct(final double[] z) throws DimensionMismatchException,
-                                                 SingularMatrixException {
+    public void correct(final double[] z) {
         correct(new ArrayRealVector(z));
     }
 
@@ -315,11 +338,10 @@ public class KalmanFilter {
      *            the measurement vector
      * @throws DimensionMismatchException
      *             if the dimension of the measurement vector does not fit
-     * @throws SingularMatrixException
+     * @throws org.apache.commons.math.linear.SingularMatrixException
      *             if the covariance matrix could not be inverted
      */
-    public void correct(final RealVector z) throws DimensionMismatchException,
-                                                   SingularMatrixException {
+    public void correct(final RealVector z) {
         // sanity checks
         if (z != null &&
             z.getDimension() != measurementMatrix.getRowDimension()) {
@@ -328,13 +350,14 @@ public class KalmanFilter {
         }
 
         // S = H * P(k) - * H' + R
-        RealMatrix S = measurementMatrix.multiply(errorCovariance)
-            .multiply(measurementMatrixT).add(measurementNoise);
+        RealMatrix s = measurementMatrix.multiply(errorCovariance)
+            .multiply(measurementMatrixT)
+            .add(measurementModel.getMeasurementNoise());
 
         // invert S
         // as the error covariance matrix is a symmetric positive
         // semi-definite matrix, we can use the cholesky decomposition
-        DecompositionSolver solver = new CholeskyDecompositionImpl(S).getSolver();
+        DecompositionSolver solver = new CholeskyDecompositionImpl(s).getSolver();
         RealMatrix invertedS = solver.getInverse();
 
         // Inn = z(k) - H * xHat(k)-
@@ -351,7 +374,7 @@ public class KalmanFilter {
 
         // update covariance of prediction error
         // P(k) = (I - K * H) * P(k)-
-        RealMatrix Identity = MatrixUtils.createRealIdentityMatrix(kalmanGain.getRowDimension());
-        errorCovariance = Identity.subtract(kalmanGain.multiply(measurementMatrix)).multiply(errorCovariance);
+        RealMatrix identity = MatrixUtils.createRealIdentityMatrix(kalmanGain.getRowDimension());
+        errorCovariance = identity.subtract(kalmanGain.multiply(measurementMatrix)).multiply(errorCovariance);
     }
 }

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/MeasurementModel.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/MeasurementModel.java?rev=1138461&r1=1138460&r2=1138461&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/MeasurementModel.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/MeasurementModel.java Wed Jun 22 13:42:39 2011
@@ -32,9 +32,14 @@ public interface MeasurementModel {
     RealMatrix getMeasurementMatrix();
 
     /**
-     * Returns the measurement noise matrix.
+     * Returns the measurement noise matrix. This method is called by the
+     * {@link KalmanFilter} every correct step, so implementations of this
+     * interface may return a modified measurement noise depending on current
+     * iteration step.
      *
      * @return the measurement noise matrix
+     * @see KalmanFilter#correct(double[])
+     * @see KalmanFilter#correct(org.apache.commons.math.linear.RealVector)
      */
     RealMatrix getMeasurementNoise();
 }

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/ProcessModel.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/ProcessModel.java?rev=1138461&r1=1138460&r2=1138461&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/ProcessModel.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/ProcessModel.java Wed Jun 22 13:42:39 2011
@@ -40,9 +40,15 @@ public interface ProcessModel {
     RealMatrix getControlMatrix();
 
     /**
-     * Returns the process noise matrix.
+     * Returns the process noise matrix. This method is called by the
+     * {@link KalmanFilter} every predict step, so implementations of this
+     * interface may return a modified process noise depending on current
+     * iteration step.
      *
      * @return the process noise matrix
+     * @see KalmanFilter#predict()
+     * @see KalmanFilter#predict(double[])
+     * @see KalmanFilter#predict(RealVector)
      */
     RealMatrix getProcessNoise();
 

Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/package.html
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/package.html?rev=1138461&view=auto
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/package.html (added)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/package.html Wed Jun 22 13:42:39 2011
@@ -0,0 +1,19 @@
+<html>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+  -->
+    <body>Implementations of common discrete-time linear filters.</body>
+</html>

Propchange: commons/proper/math/trunk/src/main/java/org/apache/commons/math/filter/package.html
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/filter/KalmanFilterTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/filter/KalmanFilterTest.java?rev=1138461&r1=1138460&r2=1138461&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/filter/KalmanFilterTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/filter/KalmanFilterTest.java Wed Jun 22 13:42:39 2011
@@ -1,19 +1,17 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
+ * or agreed to in writing, software distributed under the License is
+ * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
  */
+
 package org.apache.commons.math.filter;
 
 import org.apache.commons.math.linear.Array2DRowRealMatrix;
@@ -26,6 +24,11 @@ import org.apache.commons.math.util.Math
 import org.junit.Assert;
 import org.junit.Test;
 
+/**
+ * Test for {@link KalmanFilter}.
+ *
+ * @version $Id$
+ */
 public class KalmanFilterTest {
     @Test
     public void testConstant() {