Author: luc
Date: Wed Mar 3 21:28:16 2010
New Revision: 918702
URL: http://svn.apache.org/viewvc?rev=918702&view=rev
Log:
Simplified names of ODE with Jacobians integration classes
Added step handling for this feature
Added:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobians.java
- copied, changed from r917667,
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegrator.java
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODE.java
- copied, changed from r917667,
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquations.java
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODEWithJacobians.java
- copied, changed from r917667,
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquationsWithPartials.java
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepHandlerWithJacobians.java
(with props)
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepInterpolatorWithJacobians.java
(with props)
commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/jacobians/
commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobiansTest.java
- copied, changed from r917667,
commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegratorTest.java
Removed:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegrator.java
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquations.java
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquationsWithPartials.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegratorTest.java
Copied:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobians.java
(from r917667,
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegrator.java)
URL:
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobians.java?p2=commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobians.java&p1=commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegrator.java&r1=917667&r2=918702&rev=918702&view=diff
==============================================================================
---
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegrator.java
(original)
+++
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobians.java
Wed Mar 3 21:28:16 2010
@@ -15,11 +15,22 @@
* limitations under the License.
*/
-package org.apache.commons.math.ode;
+package org.apache.commons.math.ode.jacobians;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
import org.apache.commons.math.MathRuntimeException;
+import org.apache.commons.math.ode.DerivativeException;
+import org.apache.commons.math.ode.FirstOrderDifferentialEquations;
+import org.apache.commons.math.ode.FirstOrderIntegrator;
+import org.apache.commons.math.ode.IntegratorException;
+import org.apache.commons.math.ode.sampling.StepHandler;
+import org.apache.commons.math.ode.sampling.StepInterpolator;
/** This class enhances a first order integrator for differential equations to
* compute also partial derivatives of the solution with respect to initial
state
@@ -29,35 +40,35 @@
* added to form a new compound problem of higher dimension. If the original
ODE
* problem has dimension n and there are p parameters, the compound problem
will
* have dimension n × (1 + n + k).</p>
- * @see ParameterizedFirstOrderDifferentialEquations
- * @see ParameterizedFirstOrderDifferentialEquationsWithPartials
+ * @see ParameterizedODE
+ * @see ParameterizedODEWithJacobians
* @version $Revision$ $Date$
* @since 2.1
*/
-public class EnhancedFirstOrderIntegrator {
+public class FirstOrderIntegratorWithJacobians {
/** Underlying integrator for compound problem. */
private final FirstOrderIntegrator integrator;
/** Raw equations to integrate. */
- private final ParameterizedFirstOrderDifferentialEquationsWithPartials ode;
+ private final ParameterizedODEWithJacobians ode;
/** Build an enhanced integrator using internal differentiation to compute
jacobians.
* @param integrator underlying integrator to solve the compound problem
* @param ode original problem (f in the equation y' = f(t, y))
* @param p parameters array (may be null if {...@link
- * ParameterizedFirstOrderDifferentialEquations#getParametersDimension()
+ * ParameterizedODE#getParametersDimension()
* getParametersDimension()} from original problem is zero)
* @param hY step sizes to use for computing the jacobian df/dy, must have
the
* same dimension as the original problem
* @param hP step sizes to use for computing the jacobian df/dp, must have
the
* same dimension as the original problem parameters dimension
* @see #EnhancedFirstOrderIntegrator(FirstOrderIntegrator,
- * ParameterizedFirstOrderDifferentialEquationsWithPartials)
+ * ParameterizedODEWithJacobians)
*/
- public EnhancedFirstOrderIntegrator(final FirstOrderIntegrator integrator,
- final
ParameterizedFirstOrderDifferentialEquations ode,
- final double[] p, final double[] hY,
final double[] hP) {
+ public FirstOrderIntegratorWithJacobians(final FirstOrderIntegrator
integrator,
+ final ParameterizedODE ode,
+ final double[] p, final double[]
hY, final double[] hP) {
checkDimension(ode.getDimension(), hY);
checkDimension(ode.getParametersDimension(), p);
checkDimension(ode.getParametersDimension(), hP);
@@ -69,14 +80,65 @@
* @param integrator underlying integrator to solve the compound problem
* @param ode original problem, which can compute the jacobians by itself
* @see #EnhancedFirstOrderIntegrator(FirstOrderIntegrator,
- * ParameterizedFirstOrderDifferentialEquations, double[], double[],
double[])
+ * ParameterizedODE, double[], double[], double[])
*/
- public EnhancedFirstOrderIntegrator(final FirstOrderIntegrator integrator,
- final
ParameterizedFirstOrderDifferentialEquationsWithPartials ode) {
+ public FirstOrderIntegratorWithJacobians(final FirstOrderIntegrator
integrator,
+ final
ParameterizedODEWithJacobians ode) {
this.integrator = integrator;
this.ode = ode;
}
+ /** Add a step handler to this integrator.
+ * <p>The handler will be called by the integrator for each accepted
+ * step.</p>
+ * @param handler handler for the accepted steps
+ * @see #getStepHandlers()
+ * @see #clearStepHandlers()
+ */
+ public void addStepHandler(StepHandlerWithJacobians handler) {
+ integrator.addStepHandler(new StepHandlerWrapper(handler));
+ }
+
+ /** Get all the step handlers that have been added to the integrator.
+ * @return an unmodifiable collection of the added events handlers
+ * @see #addStepHandler(StepHandlerWithJacobians)
+ * @see #clearStepHandlers()
+ */
+ public Collection<StepHandlerWithJacobians> getStepHandlers() {
+ final Collection<StepHandlerWithJacobians> handlers =
+ new ArrayList<StepHandlerWithJacobians>();
+ for (final StepHandler handler : integrator.getStepHandlers()) {
+ if (handler instanceof StepHandlerWrapper) {
+ handlers.add(((StepHandlerWrapper) handler).getHandler());
+ }
+ }
+ return handlers;
+ }
+
+ /** Remove all the step handlers that have been added to the integrator.
+ * @see #addStepHandler(StepHandlerWithJacobians)
+ * @see #getStepHandlers()
+ */
+ public void clearStepHandlers() {
+
+ // preserve the handlers we did not add ourselves
+ final Collection<StepHandler> otherHandlers = new
ArrayList<StepHandler>();
+ for (final StepHandler handler : integrator.getStepHandlers()) {
+ if (!(handler instanceof StepHandlerWrapper)) {
+ otherHandlers.add(handler);
+ }
+ }
+
+ // clear all handlers
+ integrator.clearStepHandlers();
+
+ // put back the preserved handlers
+ for (final StepHandler handler : otherHandlers) {
+ integrator.addStepHandler(handler);
+ }
+
+ }
+
/** Integrate the differential equations and the variational equations up
to the given time.
* <p>This method solves an Initial Value Problem (IVP) and also computes
the derivatives
* of the solution with respect to initial state and parameters. This can
be used as
@@ -237,10 +299,10 @@
/** Wrapper class to compute jacobians by finite differences for ODE which
do not compute them themselves. */
private static class FiniteDifferencesWrapper
- implements ParameterizedFirstOrderDifferentialEquationsWithPartials {
+ implements ParameterizedODEWithJacobians {
/** Raw ODE without jacobians computation. */
- private final ParameterizedFirstOrderDifferentialEquations ode;
+ private final ParameterizedODE ode;
/** Parameters array (may be null if parameters dimension from
original problem is zero) */
private final double[] p;
@@ -260,7 +322,7 @@
* @param hY step sizes to use for computing the jacobian df/dy
* @param hP step sizes to use for computing the jacobian df/dp
*/
- public FiniteDifferencesWrapper(final
ParameterizedFirstOrderDifferentialEquations ode,
+ public FiniteDifferencesWrapper(final ParameterizedODE ode,
final double[] p, final double[] hY,
final double[] hP) {
this.ode = ode;
this.p = p.clone();
@@ -322,4 +384,225 @@
}
+ /** Wrapper for step handlers. */
+ private class StepHandlerWrapper implements StepHandler {
+
+ /** Underlying step handler with jacobians. */
+ private final StepHandlerWithJacobians handler;
+
+ /** Simple constructor.
+ * @param handler underlying step handler with jacobians
+ */
+ public StepHandlerWrapper(final StepHandlerWithJacobians handler) {
+ this.handler = handler;
+ }
+
+ /** Get the underlying step handler with jacobians.
+ * @return underlying step handler with jacobians
+ */
+ public StepHandlerWithJacobians getHandler() {
+ return handler;
+ }
+
+ /** {...@inheritdoc} */
+ public void handleStep(StepInterpolator interpolator, boolean isLast)
+ throws DerivativeException {
+ handler.handleStep(new StepInterpolatorWrapper(interpolator,
+ ode.getDimension(),
+
ode.getParametersDimension()),
+ isLast);
+ }
+
+ /** {...@inheritdoc} */
+ public boolean requiresDenseOutput() {
+ return handler.requiresDenseOutput();
+ }
+
+ /** {...@inheritdoc} */
+ public void reset() {
+ handler.reset();
+ }
+
+ }
+
+ /** Wrapper for step interpolators. */
+ private static class StepInterpolatorWrapper
+ implements StepInterpolatorWithJacobians {
+
+ /** Wrapped interpolator. */
+ private StepInterpolator interpolator;
+
+ /** State array. */
+ private double[] y;
+
+ /** State derivative array. */
+ private double[] yDot;
+
+ /** Jacobian with respect to initial state dy/dy0. */
+ private double[][] dydy0;
+
+ /** Jacobian with respect to parameters dy/dp. */
+ private double[][] dydp;
+
+ /** Simple constructor.
+ * @param interpolator wrapped interpolator
+ * @param n dimension of the original ODE
+ * @param k number of parameters
+ */
+ public StepInterpolatorWrapper(final StepInterpolator interpolator,
+ final int n, final int k) {
+ this.interpolator = interpolator;
+ y = new double[n];
+ yDot = new double[n];
+ dydy0 = new double[n][n];
+ dydp = new double[n][k];
+ }
+
+ /** {...@inheritdoc} */
+ public void setInterpolatedTime(double time) {
+ interpolator.setInterpolatedTime(time);
+ }
+
+ /** {...@inheritdoc} */
+ public boolean isForward() {
+ return interpolator.isForward();
+ }
+
+ /** {...@inheritdoc} */
+ public double getPreviousTime() {
+ return interpolator.getPreviousTime();
+ }
+
+ /** {...@inheritdoc} */
+ public double getInterpolatedTime() {
+ return interpolator.getInterpolatedTime();
+ }
+
+ /** {...@inheritdoc} */
+ public double[] getInterpolatedY() throws DerivativeException {
+ double[] extendedState = interpolator.getInterpolatedState();
+ System.arraycopy(extendedState, 0, y, 0, y.length);
+ return y;
+ }
+
+ /** {...@inheritdoc} */
+ public double[][] getInterpolatedDyDy0() throws DerivativeException {
+ double[] extendedState = interpolator.getInterpolatedState();
+ final int n = y.length;
+ int start = n;
+ for (int i = 0; i < n; ++i) {
+ System.arraycopy(extendedState, start, dydy0[i], 0, n);
+ start += n;
+ }
+ return dydy0;
+ }
+
+ /** {...@inheritdoc} */
+ public double[][] getInterpolatedDyDp() throws DerivativeException {
+ double[] extendedState = interpolator.getInterpolatedState();
+ final int n = y.length;
+ final int k = dydp[0].length;
+ int start = n * (n + 1);
+ for (int i = 0; i < n; ++i) {
+ System.arraycopy(extendedState, start, dydp[i], 0, k);
+ start += k;
+ }
+ return dydp;
+ }
+
+ /** {...@inheritdoc} */
+ public double[] getInterpolatedYDot() throws DerivativeException {
+ double[] extendedDerivatives =
interpolator.getInterpolatedDerivatives();
+ System.arraycopy(extendedDerivatives, 0, yDot, 0, yDot.length);
+ return yDot;
+ }
+
+ /** {...@inheritdoc} */
+ public double[][] getInterpolatedDyDy0Dot() throws DerivativeException
{
+ double[] extendedDerivatives =
interpolator.getInterpolatedDerivatives();
+ final int n = y.length;
+ int start = n;
+ for (int i = 0; i < n; ++i) {
+ System.arraycopy(extendedDerivatives, start, dydy0[i], 0, n);
+ start += n;
+ }
+ return dydy0;
+ }
+
+ /** {...@inheritdoc} */
+ public double[][] getInterpolatedDyDpDot() throws DerivativeException {
+ double[] extendedDerivatives =
interpolator.getInterpolatedDerivatives();
+ final int n = y.length;
+ final int k = dydp[0].length;
+ int start = n * (n + 1);
+ for (int i = 0; i < n; ++i) {
+ System.arraycopy(extendedDerivatives, start, dydp[i], 0, k);
+ start += k;
+ }
+ return dydp;
+ }
+
+ /** {...@inheritdoc} */
+ public double getCurrentTime() {
+ return interpolator.getCurrentTime();
+ }
+
+ /** {...@inheritdoc} */
+ public StepInterpolatorWithJacobians copy() throws DerivativeException
{
+ return new StepInterpolatorWrapper(interpolator.copy(),
+ y.length, dydy0[0].length);
+ }
+
+ /** {...@inheritdoc} */
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(interpolator);
+ final int n = y.length;
+ final int k = dydp[0].length;
+ out.writeInt(n);
+ out.writeInt(k);
+ for (int i = 0; i < n; ++i) {
+ out.writeDouble(y[i]);
+ }
+ for (int i = 0; i < n; ++i) {
+ out.writeDouble(yDot[i]);
+ }
+ for (int i = 0; i < n; ++i) {
+ for (int j = 0; j < n; ++j) {
+ out.writeDouble(dydy0[i][j]);
+ }
+ }
+ for (int i = 0; i < n; ++i) {
+ for (int j = 0; j < k; ++j) {
+ out.writeDouble(dydp[i][j]);
+ }
+ }
+ }
+
+ /** {...@inheritdoc} */
+ public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
+ interpolator = (StepInterpolator) in.readObject();
+ final int n = in.readInt();
+ final int k = in.readInt();
+ y = new double[n];
+ dydy0 = new double[n][n];
+ dydp = new double[n][k];
+ for (int i = 0; i < n; ++i) {
+ y[i] = in.readDouble();
+ }
+ for (int i = 0; i < n; ++i) {
+ yDot[i] = in.readDouble();
+ }
+ for (int i = 0; i < n; ++i) {
+ for (int j = 0; j < n; ++j) {
+ dydy0[i][j] = in.readDouble();
+ }
+ }
+ for (int i = 0; i < n; ++i) {
+ for (int j = 0; j < k; ++j) {
+ dydp[i][j] = in.readDouble();
+ }
+ }
+ }
+
+ }
}
Copied:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODE.java
(from r917667,
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquations.java)
URL:
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODE.java?p2=commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODE.java&p1=commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquations.java&r1=917667&r2=918702&rev=918702&view=diff
==============================================================================
---
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquations.java
(original)
+++
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODE.java
Wed Mar 3 21:28:16 2010
@@ -15,19 +15,21 @@
* limitations under the License.
*/
-package org.apache.commons.math.ode;
+package org.apache.commons.math.ode.jacobians;
+
+import org.apache.commons.math.ode.FirstOrderDifferentialEquations;
/** This interface represents {...@link FirstOrderDifferentialEquations
* first order differential equations} with parameters.
*
- * @see EnhancedFirstOrderIntegrator
+ * @see FirstOrderIntegratorWithJacobians
*
* @version $Revision$ $Date$
* @since 2.1
*/
-public interface ParameterizedFirstOrderDifferentialEquations
+public interface ParameterizedODE
extends FirstOrderDifferentialEquations {
/** Get the number of parameters.
Copied:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODEWithJacobians.java
(from r917667,
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquationsWithPartials.java)
URL:
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODEWithJacobians.java?p2=commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODEWithJacobians.java&p1=commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquationsWithPartials.java&r1=917667&r2=918702&rev=918702&view=diff
==============================================================================
---
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/ParameterizedFirstOrderDifferentialEquationsWithPartials.java
(original)
+++
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/ParameterizedODEWithJacobians.java
Wed Mar 3 21:28:16 2010
@@ -15,20 +15,22 @@
* limitations under the License.
*/
-package org.apache.commons.math.ode;
+package org.apache.commons.math.ode.jacobians;
+import org.apache.commons.math.ode.DerivativeException;
-/** This interface represents {...@link
ParameterizedFirstOrderDifferentialEquations
+
+/** This interface represents {...@link ParameterizedODE
* first order differential equations} with parameters and partial derivatives.
*
- * @see EnhancedFirstOrderIntegrator
+ * @see FirstOrderIntegratorWithJacobians
*
* @version $Revision$ $Date$
* @since 2.1
*/
-public interface ParameterizedFirstOrderDifferentialEquationsWithPartials
- extends ParameterizedFirstOrderDifferentialEquations {
+public interface ParameterizedODEWithJacobians
+ extends ParameterizedODE {
/** Compute the partial derivatives of ODE with respect to state.
* @param t current value of the independent <I>time</I> variable
Added:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepHandlerWithJacobians.java
URL:
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepHandlerWithJacobians.java?rev=918702&view=auto
==============================================================================
---
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepHandlerWithJacobians.java
(added)
+++
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepHandlerWithJacobians.java
Wed Mar 3 21:28:16 2010
@@ -0,0 +1,77 @@
+/*
+ * 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.math.ode.jacobians;
+
+import org.apache.commons.math.ode.DerivativeException;
+
+/**
+ * This interface represents a handler that should be called after
+ * each successful step.
+ *
+ * <p>The ODE integrators compute the evolution of the state vector at
+ * some grid points that depend on their own internal algorithm. Once
+ * they have found a new grid point (possibly after having computed
+ * several evaluation of the derivative at intermediate points), they
+ * provide it to objects implementing this interface. These objects
+ * typically either ignore the intermediate steps and wait for the
+ * last one, store the points in an ephemeris, or forward them to
+ * specialized processing or output methods.</p>
+ *
+ * @see FirstOrderIntegratorWithJacobians
+ * @see StepInterpolatorWithJacobians
+ * @version $Revision$ $Date$
+ * @since 2.1
+ */
+
+public interface StepHandlerWithJacobians {
+
+ /** Determines whether this handler needs dense output.
+ * <p>This method allows the integrator to avoid performing extra
+ * computation if the handler does not need dense output. If this
+ * method returns false, the integrator will call the {...@link
+ * #handleStep} method with a {...@link DummyStepInterpolator} rather
+ * than a custom interpolator.</p>
+ * @return true if the handler needs dense output
+ */
+ boolean requiresDenseOutput();
+
+ /** Reset the step handler.
+ * Initialize the internal data as required before the first step is
+ * handled.
+ */
+ void reset();
+
+ /**
+ * Handle the last accepted step
+ * @param interpolator interpolator for the last accepted step. For
+ * efficiency purposes, the various integrators reuse the same
+ * object on each call, so if the instance wants to keep it across
+ * all calls (for example to provide at the end of the integration a
+ * continuous model valid throughout the integration range, as the
+ * {...@link org.apache.commons.math.ode.ContinuousOutputModel
+ * ContinuousOutputModel} class does), it should build a local copy
+ * using the clone method of the interpolator and store this copy.
+ * Keeping only a reference to the interpolator and reusing it will
+ * result in unpredictable behavior (potentially crashing the application).
+ * @param isLast true if the step is the last one
+ * @throws DerivativeException this exception is propagated to the
+ * caller if the underlying user function triggers one
+ */
+ void handleStep(StepInterpolatorWithJacobians interpolator, boolean isLast)
throws DerivativeException;
+
+}
Propchange:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepHandlerWithJacobians.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepHandlerWithJacobians.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepInterpolatorWithJacobians.java
URL:
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepInterpolatorWithJacobians.java?rev=918702&view=auto
==============================================================================
---
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepInterpolatorWithJacobians.java
(added)
+++
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepInterpolatorWithJacobians.java
Wed Mar 3 21:28:16 2010
@@ -0,0 +1,186 @@
+/*
+ * 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.math.ode.jacobians;
+
+import java.io.Externalizable;
+
+import org.apache.commons.math.ode.DerivativeException;
+
+/** This interface represents an interpolator over the last step
+ * during an ODE integration.
+ *
+ * <p>The various ODE integrators provide objects implementing this
+ * interface to the step handlers. These objects are often custom
+ * objects tightly bound to the integrator internal algorithms. The
+ * handlers can use these objects to retrieve the state vector at
+ * intermediate times between the previous and the current grid points
+ * (this feature is often called dense output).</p>
+ * <p>One important thing to note is that the step handlers may be so
+ * tightly bound to the integrators that they often share some internal
+ * state arrays. This imply that one should <em>never</em> use a direct
+ * reference to a step interpolator outside of the step handler, either
+ * for future use or for use in another thread. If such a need arise, the
+ * step interpolator <em>must</em> be copied using the dedicated
+ * {...@link #copy()} method.
+ * </p>
+ *
+ * @see FirstOrderIntegratorWithJacobians
+ * @see StepHandlerWithJacobians
+ * @version $Revision$ $Date$
+ * @since 2.1
+ */
+
+public interface StepInterpolatorWithJacobians extends Externalizable {
+
+ /**
+ * Get the previous grid point time.
+ * @return previous grid point time
+ */
+ double getPreviousTime();
+
+ /**
+ * Get the current grid point time.
+ * @return current grid point time
+ */
+ double getCurrentTime();
+
+ /**
+ * Get the time of the interpolated point.
+ * If {...@link #setInterpolatedTime} has not been called, it returns
+ * the current grid point time.
+ * @return interpolation point time
+ */
+ double getInterpolatedTime();
+
+ /**
+ * Set the time of the interpolated point.
+ * <p>Setting the time outside of the current step is now allowed, but
+ * should be used with care since the accuracy of the interpolator will
+ * probably be very poor far from this step. This allowance has been
+ * added to simplify implementation of search algorithms near the
+ * step endpoints.</p>
+ * <p>Setting the time changes the instance internal state. If a
+ * specific state must be preserved, a copy of the instance must be
+ * created using {...@link #copy()}.</p>
+ * @param time time of the interpolated point
+ */
+ void setInterpolatedTime(double time);
+
+ /**
+ * Get the state vector of the interpolated point.
+ * <p>The returned vector is a reference to a reused array, so
+ * it should not be modified and it should be copied if it needs
+ * to be preserved across several calls.</p>
+ * @return state vector at time {...@link #getInterpolatedTime}
+ * @see #getInterpolatedYDot()
+ * @throws DerivativeException if this call induces an automatic
+ * step finalization that throws one
+ */
+ double[] getInterpolatedY() throws DerivativeException;
+
+ /**
+ * Get the partial derivatives of the state vector with respect to
+ * the initial state of the interpolated point.
+ * <p>The returned vector is a reference to a reused array, so
+ * it should not be modified and it should be copied if it needs
+ * to be preserved across several calls.</p>
+ * @return partial derivatives of the state vector with respect to
+ * the initial state at time {...@link #getInterpolatedTime}
+ * @see #getInterpolatedY()
+ * @throws DerivativeException if this call induces an automatic
+ * step finalization that throws one
+ */
+ double[][] getInterpolatedDyDy0() throws DerivativeException;
+
+ /**
+ * Get the partial derivatives of the state vector with respect to
+ * the ODE parameters of the interpolated point.
+ * <p>The returned vector is a reference to a reused array, so
+ * it should not be modified and it should be copied if it needs
+ * to be preserved across several calls.</p>
+ * @return partial derivatives of the state vector with respect to
+ * the ODE parameters at time {...@link #getInterpolatedTime}
+ * @see #getInterpolatedY()
+ * @throws DerivativeException if this call induces an automatic
+ * step finalization that throws one
+ */
+ double[][] getInterpolatedDyDp() throws DerivativeException;
+
+ /**
+ * Get the time derivatives of the state vector of the interpolated point.
+ * <p>The returned vector is a reference to a reused array, so
+ * it should not be modified and it should be copied if it needs
+ * to be preserved across several calls.</p>
+ * @return derivatives of the state vector at time {...@link
#getInterpolatedTime}
+ * @see #getInterpolatedY()
+ * @throws DerivativeException if this call induces an automatic
+ * step finalization that throws one
+ */
+ double[] getInterpolatedYDot() throws DerivativeException;
+
+ /**
+ * Get the time derivatives of the jacobian of the state vector
+ * with respect to the initial state of the interpolated point.
+ * <p>The returned vector is a reference to a reused array, so
+ * it should not be modified and it should be copied if it needs
+ * to be preserved across several calls.</p>
+ * @return time derivatives of the jacobian of the state vector
+ * with respect to the initial state at time {...@link #getInterpolatedTime}
+ * @see #getInterpolatedY()
+ * @throws DerivativeException if this call induces an automatic
+ * step finalization that throws one
+ */
+ double[][] getInterpolatedDyDy0Dot() throws DerivativeException;
+
+ /**
+ * Get the time derivatives of the jacobian of the state vector
+ * with respect to the ODE parameters of the interpolated point.
+ * <p>The returned vector is a reference to a reused array, so
+ * it should not be modified and it should be copied if it needs
+ * to be preserved across several calls.</p>
+ * @return time derivatives of the jacobian of the state vector
+ * with respect to the ODE parameters at time {...@link #getInterpolatedTime}
+ * @see #getInterpolatedY()
+ * @throws DerivativeException if this call induces an automatic
+ * step finalization that throws one
+ */
+ double[][] getInterpolatedDyDpDot() throws DerivativeException;
+
+ /** Check if the natural integration direction is forward.
+ * <p>This method provides the integration direction as specified by
+ * the integrator itself, it avoid some nasty problems in
+ * degenerated cases like null steps due to cancellation at step
+ * initialization, step control or discrete events
+ * triggering.</p>
+ * @return true if the integration variable (time) increases during
+ * integration
+ */
+ boolean isForward();
+
+ /** Copy the instance.
+ * <p>The copied instance is guaranteed to be independent from the
+ * original one. Both can be used with different settings for
+ * interpolated time without any side effect.</p>
+ * @return a deep copy of the instance, which can be used independently.
+ * @throws DerivativeException if this call induces an automatic
+ * step finalization that throws one
+ * @see #setInterpolatedTime(double)
+ */
+ StepInterpolatorWithJacobians copy() throws DerivativeException;
+
+}
Propchange:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepInterpolatorWithJacobians.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/ode/jacobians/StepInterpolatorWithJacobians.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Copied:
commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobiansTest.java
(from r917667,
commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegratorTest.java)
URL:
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobiansTest.java?p2=commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobiansTest.java&p1=commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegratorTest.java&r1=917667&r2=918702&rev=918702&view=diff
==============================================================================
---
commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/EnhancedFirstOrderIntegratorTest.java
(original)
+++
commons/proper/math/trunk/src/test/java/org/apache/commons/math/ode/jacobians/FirstOrderIntegratorWithJacobiansTest.java
Wed Mar 3 21:28:16 2010
@@ -15,14 +15,19 @@
* limitations under the License.
*/
-package org.apache.commons.math.ode;
+package org.apache.commons.math.ode.jacobians;
+import org.apache.commons.math.ode.DerivativeException;
+import org.apache.commons.math.ode.FirstOrderIntegrator;
+import org.apache.commons.math.ode.IntegratorException;
+import org.apache.commons.math.ode.jacobians.FirstOrderIntegratorWithJacobians;
+import org.apache.commons.math.ode.jacobians.ParameterizedODEWithJacobians;
import org.apache.commons.math.ode.nonstiff.DormandPrince54Integrator;
import org.apache.commons.math.stat.descriptive.SummaryStatistics;
import org.junit.Assert;
import org.junit.Test;
-public class EnhancedFirstOrderIntegratorTest {
+public class FirstOrderIntegratorWithJacobiansTest {
@Test
public void testLowAccuracyExternalDifferentiation()
@@ -91,8 +96,8 @@
double[][] dZdZ0 = new double[2][2];
double[][] dZdP = new double[2][1];
double hY = 1.0e-12;
- EnhancedFirstOrderIntegrator extInt =
- new EnhancedFirstOrderIntegrator(integ, brusselator, new
double[] { b },
+ FirstOrderIntegratorWithJacobians extInt =
+ new FirstOrderIntegratorWithJacobians(integ, brusselator, new
double[] { b },
new double[] { hY, hY }, new
double[] { hP });
extInt.integrate(0, z, new double[][] { { 0.0 }, { 1.0 } }, 20.0,
z, dZdZ0, dZdP);
residuals0.addValue(dZdP[0][0] - brusselator.dYdP0());
@@ -117,8 +122,8 @@
double[] z = { 1.3, b };
double[][] dZdZ0 = new double[2][2];
double[][] dZdP = new double[2][1];
- EnhancedFirstOrderIntegrator extInt =
- new EnhancedFirstOrderIntegrator(integ, brusselator);
+ FirstOrderIntegratorWithJacobians extInt =
+ new FirstOrderIntegratorWithJacobians(integ, brusselator);
extInt.integrate(0, z, new double[][] { { 0.0 }, { 1.0 } }, 20.0,
z, dZdZ0, dZdP);
residuals0.addValue(dZdP[0][0] - brusselator.dYdP0());
residuals1.addValue(dZdP[1][0] - brusselator.dYdP1());
@@ -129,7 +134,7 @@
Assert.assertTrue(residuals1.getStandardDeviation() < 0.001);
}
- private static class Brusselator implements
ParameterizedFirstOrderDifferentialEquationsWithPartials {
+ private static class Brusselator implements ParameterizedODEWithJacobians {
private double b;