You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2013/11/07 17:34:17 UTC
svn commit: r1539703 - in
/commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter:
./ ConstantVoltageExample.java
Author: tn
Date: Thu Nov 7 16:34:17 2013
New Revision: 1539703
URL: http://svn.apache.org/r1539703
Log:
Added constant voltage example for kalman filter.
Added:
commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter/
commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter/ConstantVoltageExample.java (with props)
Added: commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter/ConstantVoltageExample.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter/ConstantVoltageExample.java?rev=1539703&view=auto
==============================================================================
--- commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter/ConstantVoltageExample.java (added)
+++ commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter/ConstantVoltageExample.java Thu Nov 7 16:34:17 2013
@@ -0,0 +1,241 @@
+/*
+ * 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.
+ */
+
+package org.apache.commons.math3.userguide.filter;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+
+import org.apache.commons.math3.filter.DefaultMeasurementModel;
+import org.apache.commons.math3.filter.DefaultProcessModel;
+import org.apache.commons.math3.filter.KalmanFilter;
+import org.apache.commons.math3.filter.MeasurementModel;
+import org.apache.commons.math3.filter.ProcessModel;
+import org.apache.commons.math3.linear.Array2DRowRealMatrix;
+import org.apache.commons.math3.linear.ArrayRealVector;
+import org.apache.commons.math3.linear.RealMatrix;
+import org.apache.commons.math3.linear.RealVector;
+import org.apache.commons.math3.random.RandomGenerator;
+import org.apache.commons.math3.random.Well19937c;
+import org.apache.commons.math3.userguide.ExampleUtils;
+import org.apache.commons.math3.userguide.ExampleUtils.ExampleFrame;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.ChartBuilder;
+import com.xeiam.xchart.Series;
+import com.xeiam.xchart.SeriesLineStyle;
+import com.xeiam.xchart.SeriesMarker;
+import com.xeiam.xchart.XChartPanel;
+import com.xeiam.xchart.StyleManager.ChartType;
+import com.xeiam.xchart.StyleManager.LegendPosition;
+
+public class ConstantVoltageExample {
+
+ public static class VoltMeter {
+
+ private final double initialVoltage;
+ private final double processNoise;
+ private final double measurementNoise;
+ private final RandomGenerator rng;
+
+ private double voltage;
+
+ public VoltMeter(double voltage, double processNoise, double measurementNoise, int seed) {
+ this.initialVoltage = voltage;
+ this.voltage = voltage;
+ this.processNoise = processNoise;
+ this.measurementNoise = measurementNoise;
+ rng = new Well19937c(seed);
+ }
+
+ /**
+ * Returns the real voltage without any measurement noise.
+ *
+ * @return the real voltage
+ */
+ public double getVoltage() {
+ return voltage;
+ }
+
+ public double getMeasuredVoltage() {
+ return getVoltage() + rng.nextGaussian() * measurementNoise;
+ }
+
+ public void step() {
+ // we apply only the process noise
+ voltage = initialVoltage + rng.nextGaussian() * processNoise;
+ }
+ }
+
+ /** constant voltage test */
+ public static void constantVoltageTest(Chart chart1, Chart chart2) {
+
+ final double voltage = 1.25d;
+ final double measurementNoise = 0.1d; // measurement noise (V) - std dev
+ final double processNoise = 1e-5d;
+
+ final VoltMeter voltMeter = new VoltMeter(voltage, processNoise, measurementNoise, 2);
+
+ // the state transition matrix -> constant
+ final RealMatrix A = new Array2DRowRealMatrix(new double[] { 1d });
+
+ // the control matrix -> no control input
+ final RealMatrix B = new Array2DRowRealMatrix(new double[] { 0d });
+
+ // the measurement matrix -> we measure the voltage directly
+ final RealMatrix H = new Array2DRowRealMatrix(new double[] { 1d });
+
+ // the initial state vector -> slightly wrong
+ final RealVector x0 = new ArrayRealVector(new double[] { 1.45 });
+
+ // the process covariance matrix
+ final RealMatrix Q = new Array2DRowRealMatrix(new double[] { processNoise * processNoise });
+
+ // the initial error covariance -> assume a large error at the beginning
+ final RealMatrix P0 = new Array2DRowRealMatrix(new double[] { 1 });
+
+ // the measurement covariance matrix -> put the "real" variance
+ RealMatrix R = new Array2DRowRealMatrix(new double[] { measurementNoise * measurementNoise });
+
+ final ProcessModel pm = new DefaultProcessModel(A, B, Q, x0, P0);
+ final MeasurementModel mm = new DefaultMeasurementModel(H, R);
+ final KalmanFilter filter = new KalmanFilter(pm, mm);
+
+ final List<Number> xAxis = new ArrayList<Number>();
+ final List<Number> realVoltageSeries = new ArrayList<Number>();
+ final List<Number> measuredVoltageSeries = new ArrayList<Number>();
+ final List<Number> kalmanVoltageSeries = new ArrayList<Number>();
+
+ final List<Number> covSeries = new ArrayList<Number>();
+
+ for (int i = 0; i < 200; i++) {
+ xAxis.add(i);
+
+ voltMeter.step();
+
+ realVoltageSeries.add(voltMeter.getVoltage());
+
+ // get the measured voltage from the volt meter
+ final double measuredVoltage = voltMeter.getMeasuredVoltage();
+ measuredVoltageSeries.add(measuredVoltage);
+
+ filter.predict();
+ filter.correct(new double[] { measuredVoltage });
+
+ kalmanVoltageSeries.add(filter.getStateEstimation()[0]);
+
+ covSeries.add(filter.getErrorCovariance()[0][0]);
+ }
+
+ chart1.setYAxisTitle("Voltage");
+ chart1.setXAxisTitle("Iteration");
+
+ Series dataset = chart1.addSeries("real", xAxis, realVoltageSeries);
+ dataset.setMarker(SeriesMarker.NONE);
+
+ dataset = chart1.addSeries("measured", xAxis, measuredVoltageSeries);
+ dataset.setLineStyle(SeriesLineStyle.DOT_DOT);
+ dataset.setMarker(SeriesMarker.NONE);
+
+ dataset = chart1.addSeries("filtered", xAxis, kalmanVoltageSeries);
+ dataset.setLineColor(Color.red);
+ dataset.setLineStyle(SeriesLineStyle.DASH_DASH);
+ dataset.setMarker(SeriesMarker.NONE);
+
+ // Error covariance chart
+
+ chart2.setYAxisTitle("(Voltage)²");
+ chart2.setXAxisTitle("Iteration");
+
+ dataset = chart2.addSeries("cov", xAxis, covSeries);
+ dataset.setLineColor(Color.black);
+ dataset.setLineStyle(SeriesLineStyle.SOLID);
+ dataset.setMarker(SeriesMarker.NONE);
+
+ }
+
+ public static Chart createChart(String title, int width, int height,
+ LegendPosition position, boolean legendVisible) {
+ Chart chart = new ChartBuilder().width(width).height(height).build();
+
+ // Customize Chart
+ chart.setChartTitle(title);
+ chart.getStyleManager().setChartTitleVisible(true);
+ chart.getStyleManager().setChartTitleFont(new Font("Arial", Font.PLAIN, 10));
+ chart.getStyleManager().setLegendPosition(position);
+ chart.getStyleManager().setLegendVisible(legendVisible);
+ chart.getStyleManager().setLegendFont(new Font("Arial", Font.PLAIN, 10));
+ chart.getStyleManager().setLegendPadding(6);
+ chart.getStyleManager().setLegendSeriesLineLength(10);
+ chart.getStyleManager().setAxisTickLabelsFont(new Font("Arial", Font.PLAIN, 9));
+
+ chart.getStyleManager().setChartBackgroundColor(Color.white);
+ chart.getStyleManager().setChartPadding(4);
+
+ chart.getStyleManager().setChartType(ChartType.Line);
+ return chart;
+ }
+
+ public static JComponent createComponent() {
+ JComponent container = new JPanel();
+ container.setLayout(new BoxLayout(container, BoxLayout.LINE_AXIS));
+
+ Chart chart1 = createChart("Filter", 550, 450, LegendPosition.InsideNE, true);
+ Chart chart2 = createChart("Error Covariance", 450, 450, LegendPosition.InsideNE, false);
+
+ constantVoltageTest(chart1, chart2);
+
+ container.add(new XChartPanel(chart1));
+ container.add(new XChartPanel(chart2));
+
+ container.setBorder(BorderFactory.createLineBorder(Color.black, 1));
+ return container;
+ }
+
+ @SuppressWarnings("serial")
+ public static class Display extends ExampleFrame {
+
+ private JComponent container;
+
+ public Display() {
+ setTitle("Commons-Math: Kalman Filter example");
+ setSize(1100, 700);
+
+ container = new JPanel();
+
+ JComponent comp = createComponent();
+ container.add(comp);
+
+ add(container);
+ }
+
+ @Override
+ public Component getMainPanel() {
+ return container;
+ }
+ }
+
+ public static void main(String[] args) {
+ ExampleUtils.showExampleFrame(new Display());
+ }
+
+}
Propchange: commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter/ConstantVoltageExample.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter/ConstantVoltageExample.java
------------------------------------------------------------------------------
svn:keywords = Id Revision HeadURL
Propchange: commons/proper/math/trunk/src/userguide/java/org/apache/commons/math3/userguide/filter/ConstantVoltageExample.java
------------------------------------------------------------------------------
svn:mime-type = text/plain