Top Description Inners Fields Constructors Methods
org.apache.commons.math3.ode.nonstiff

public Class AdamsMoultonFieldIntegrator<T extends RealFieldElement<T>>

extends AdamsFieldIntegrator<T extends RealFieldElement<T>>
Class Inheritance
Type Parameters
<T>
the type of the field elements
Imports
java.util.Arrays, org.apache.commons.math3.Field, .RealFieldElement, org.apache.commons.math3.exception.DimensionMismatchException, .MaxCountExceededException, .NoBracketingException, .NumberIsTooSmallException, org.apache.commons.math3.linear.Array2DRowFieldMatrix, .FieldMatrixPreservingVisitor, org.apache.commons.math3.ode.FieldExpandableODE, .FieldODEState, .FieldODEStateAndDerivative, org.apache.commons.math3.util.MathArrays, .MathUtils

This class implements implicit Adams-Moulton integrators for Ordinary Differential Equations.

Adams-Moulton methods (in fact due to Adams alone) are implicit multistep ODE solvers. This implementation is a variation of the classical one: it uses adaptive stepsize to implement error control, whereas classical implementations are fixed step size. The value of state vector at step n+1 is a simple combination of the value at step n and of the derivatives at steps n+1, n, n-1 ... Since y'n+1 is needed to compute yn+1, another method must be used to compute a first estimate of yn+1, then compute y'n+1, then compute a final estimate of yn+1 using the following formulas. Depending on the number k of previous steps one wants to use for computing the next value, different formulas are available for the final estimate:

A k-steps Adams-Moulton method is of order k+1.

Implementation details

We define scaled derivatives si(n) at step n as:

s1(n) = h y'n for first derivative
s2(n) = h2/2 y''n for second derivative
s3(n) = h3/6 y'''n for third derivative
...
sk(n) = hk/k! y(k)n for kth derivative

The definitions above use the classical representation with several previous first derivatives. Lets define

  qn = [ s1(n-1) s1(n-2) ... s1(n-(k-1)) ]T
(we omit the k index in the notation for clarity). With these definitions, Adams-Moulton methods can be written:

Instead of using the classical representation with first derivatives only (yn, s1(n+1) and qn+1), our implementation uses the Nordsieck vector with higher degrees scaled derivatives all taken at the same step (yn, s1(n) and rn) where rn is defined as:

rn = [ s2(n), s3(n) ... sk(n) ]T
(here again we omit the k index in the notation for clarity)

Taylor series formulas show that for any index offset i, s1(n-i) can be computed from s1(n), s2(n) ... sk(n), the formula being exact for degree k polynomials.

s1(n-i) = s1(n) + ∑j>0 (j+1) (-i)j sj+1(n)
The previous formula can be used with several values for i to compute the transform between classical representation and Nordsieck vector. The transform between rn and qn resulting from the Taylor series formulas above is:
qn = s1(n) u + P rn
where u is the [ 1 1 ... 1 ]T vector and P is the (k-1)×(k-1) matrix built with the (j+1) (-i)j terms with i being the row number starting from 1 and j being the column number starting from 1:
       [  -2   3   -4    5  ... ]
       [  -4  12  -32   80  ... ]
  P =  [  -6  27 -108  405  ... ]
       [  -8  48 -256 1280  ... ]
       [          ...           ]

Using the Nordsieck vector has several advantages:

The predicted Nordsieck vector at step n+1 is computed from the Nordsieck vector at step n as follows:

where A is a rows shifting matrix (the lower left part is an identity matrix):
       [ 0 0   ...  0 0 | 0 ]
       [ ---------------+---]
       [ 1 0   ...  0 0 | 0 ]
   A = [ 0 1   ...  0 0 | 0 ]
       [       ...      | 0 ]
       [ 0 0   ...  1 0 | 0 ]
       [ 0 0   ...  0 1 | 0 ]
From this predicted vector, the corrected vector is computed as follows: where the upper case Yn+1, S1(n+1) and Rn+1 represent the predicted states whereas the lower case yn+1, sn+1 and rn+1 represent the corrected states.

The P-1u vector and the P-1 A P matrix do not depend on the state, they only depend on k and therefore are precomputed once for all.

Since
3.6

Nested and Inner Type Summary

Modifier and TypeClass and Description
private class
AdamsMoultonFieldIntegrator.Corrector

Corrector for current state in Adams-Moulton method.

Field Summary

Modifier and TypeField and Description
private static final String
METHOD_NAME

Integrator method name.

Constructor Summary

AccessConstructor and Description
public
AdamsMoultonFieldIntegrator(final Field<T>
field to which the time and state vector elements belong
field
,
final int
number of steps of the method excluding the one being computed
nSteps
,
final double
minimal step (sign is irrelevant, regardless of integration direction, forward or backward), the last step can be smaller than this
minStep
,
final double
maximal step (sign is irrelevant, regardless of integration direction, forward or backward), the last step can be smaller than this
maxStep
,
final double
allowed absolute error
scalAbsoluteTolerance
,
final double
allowed relative error
scalRelativeTolerance
)

Build an Adams-Moulton integrator with the given order and error control parameters.

public
AdamsMoultonFieldIntegrator(final Field<T>
field to which the time and state vector elements belong
field
,
final int
number of steps of the method excluding the one being computed
nSteps
,
final double
minimal step (sign is irrelevant, regardless of integration direction, forward or backward), the last step can be smaller than this
minStep
,
final double
maximal step (sign is irrelevant, regardless of integration direction, forward or backward), the last step can be smaller than this
maxStep
,
final double[]
allowed absolute error
vecAbsoluteTolerance
,
final double[]
allowed relative error
vecRelativeTolerance
)

Build an Adams-Moulton integrator with the given order and error control parameters.

Method Summary

Modifier and TypeMethod and Description
public FieldODEStateAndDerivative<T>
integrate(final FieldExpandableODE<T>
differential equations to integrate
equations
,
final FieldODEState<T>
initial state (time, primary and secondary state vectors)
initialState
,
final T
target time for the integration (can be set to a value smaller than t0 for backward integration)
finalTime
)

Implements abstract org.apache.commons.math3.ode.nonstiff.AdamsFieldIntegrator.integrate.

Implements org.apache.commons.math3.ode.FirstOrderFieldIntegrator.integrate.

Integrate the differential equations up to the given time.

Inherited from org.apache.commons.math3.ode.nonstiff.AdamsFieldIntegrator:
initializeHighOrderDerivativesupdateHighOrderDerivativesPhase1updateHighOrderDerivativesPhase2

Field Detail

METHOD_NAMEback to summary
private static final String METHOD_NAME

Integrator method name.

Constructor Detail

AdamsMoultonFieldIntegratorback to summary
public AdamsMoultonFieldIntegrator(final Field<T> field, final int nSteps, final double minStep, final double maxStep, final double scalAbsoluteTolerance, final double scalRelativeTolerance) throws NumberIsTooSmallException

Build an Adams-Moulton integrator with the given order and error control parameters.

Parameters
field:Field<T>

field to which the time and state vector elements belong

nSteps:int

number of steps of the method excluding the one being computed

minStep:double

minimal step (sign is irrelevant, regardless of integration direction, forward or backward), the last step can be smaller than this

maxStep:double

maximal step (sign is irrelevant, regardless of integration direction, forward or backward), the last step can be smaller than this

scalAbsoluteTolerance:double

allowed absolute error

scalRelativeTolerance:double

allowed relative error

Exceptions
NumberIsTooSmallException:
if order is 1 or less
AdamsMoultonFieldIntegratorback to summary
public AdamsMoultonFieldIntegrator(final Field<T> field, final int nSteps, final double minStep, final double maxStep, final double[] vecAbsoluteTolerance, final double[] vecRelativeTolerance) throws IllegalArgumentException

Build an Adams-Moulton integrator with the given order and error control parameters.

Parameters
field:Field<T>

field to which the time and state vector elements belong

nSteps:int

number of steps of the method excluding the one being computed

minStep:double

minimal step (sign is irrelevant, regardless of integration direction, forward or backward), the last step can be smaller than this

maxStep:double

maximal step (sign is irrelevant, regardless of integration direction, forward or backward), the last step can be smaller than this

vecAbsoluteTolerance:double[]

allowed absolute error

vecRelativeTolerance:double[]

allowed relative error

Exceptions
IllegalArgumentException:
if order is 1 or less

Method Detail

integrateback to summary
public FieldODEStateAndDerivative<T> integrate(final FieldExpandableODE<T> equations, final FieldODEState<T> initialState, final T finalTime) throws NumberIsTooSmallException, DimensionMismatchException, MaxCountExceededException, NoBracketingException

Implements abstract org.apache.commons.math3.ode.nonstiff.AdamsFieldIntegrator.integrate.

Implements org.apache.commons.math3.ode.FirstOrderFieldIntegrator.integrate.

Doc from org.apache.commons.math3.ode.nonstiff.AdamsFieldIntegrator.integrate.

Integrate the differential equations up to the given time.

This method solves an Initial Value Problem (IVP).

Since this method stores some internal state variables made available in its public interface during integration (getCurrentSignedStepsize()), it is not thread-safe.

Parameters
equations:FieldExpandableODE<T>

Doc from org.apache.commons.math3.ode.FirstOrderFieldIntegrator.integrate.

differential equations to integrate

initialState:FieldODEState<T>

Doc from org.apache.commons.math3.ode.FirstOrderFieldIntegrator.integrate.

initial state (time, primary and secondary state vectors)

finalTime:T

Doc from org.apache.commons.math3.ode.FirstOrderFieldIntegrator.integrate.

target time for the integration (can be set to a value smaller than t0 for backward integration)

Returns:FieldODEStateAndDerivative<T>

Doc from org.apache.commons.math3.ode.FirstOrderFieldIntegrator.integrate.

final state, its time will be the same as finalTime if integration reached its target, but may be different if some org.apache.commons.math3.ode.events.FieldEventHandler stops it at some point.

Annotations
@Override
Exceptions
NumberIsTooSmallException:

Doc from org.apache.commons.math3.ode.FirstOrderFieldIntegrator.integrate.

if integration step is too small

MaxCountExceededException:

Doc from org.apache.commons.math3.ode.FirstOrderFieldIntegrator.integrate.

if the number of functions evaluations is exceeded

NoBracketingException:

Doc from org.apache.commons.math3.ode.FirstOrderFieldIntegrator.integrate.

if the location of an event cannot be bracketed

org.apache.commons.math3.ode.nonstiff back to summary

private Class AdamsMoultonFieldIntegrator.Corrector

extends Object
implements FieldMatrixPreservingVisitor<T extends RealFieldElement<T>>
Class Inheritance
  • java.lang.Object
  • org.apache.commons.math3.ode.nonstiff.AdamsMoultonFieldIntegrator.Corrector
All Implemented Interfaces
org.apache.commons.math3.linear.FieldMatrixPreservingVisitor

Corrector for current state in Adams-Moulton method.

This visitor implements the Taylor series formula:

Yn+1 = yn + s1(n+1) + [ -1 +1 -1 +1 ... ±1 ] rn+1

Field Summary

Modifier and TypeField and Description
private final T[]
after

Current state after correction.

private final T[]
before

Current state before correction.

private final T[]
previous

Previous state.

private final T[]
scaled

Current scaled first derivative.

Constructor Summary

AccessConstructor and Description
pack-priv
Corrector(final T[]
previous state
previous
,
final T[]
current scaled first derivative
scaled
,
final T[]
state to correct (will be overwritten after visit)
state
)

Simple constructor.

Method Summary

Modifier and TypeMethod and Description
public T

Returns:

the normalized correction, if greater than 1, the step must be rejected
end
()

Implements org.apache.commons.math3.linear.FieldMatrixPreservingVisitor.end.

End visiting the Nordsieck vector.

public void
start(int
number of rows of the matrix
rows
,
int
number of columns of the matrix
columns
,
int
Initial row index
startRow
,
int
Final row index (inclusive)
endRow
,
int
Initial column index
startColumn
,
int
Final column index (inclusive)
endColumn
)

Implements org.apache.commons.math3.linear.FieldMatrixPreservingVisitor.start.

Start visiting a matrix.

public void
visit(int
row index of the entry
row
,
int
column index of the entry
column
,
T
current value of the entry
value
)

Implements org.apache.commons.math3.linear.FieldMatrixPreservingVisitor.visit.

Visit one matrix entry.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

afterback to summary
private final T[] after

Current state after correction.

beforeback to summary
private final T[] before

Current state before correction.

previousback to summary
private final T[] previous

Previous state.

scaledback to summary
private final T[] scaled

Current scaled first derivative.

Constructor Detail

Correctorback to summary
pack-priv Corrector(final T[] previous, final T[] scaled, final T[] state)

Simple constructor.

Parameters
previous:T[]

previous state

scaled:T[]

current scaled first derivative

state:T[]

state to correct (will be overwritten after visit)

Method Detail

endback to summary
public T end()

Implements org.apache.commons.math3.linear.FieldMatrixPreservingVisitor.end.

End visiting the Nordsieck vector.

The correction is used to control stepsize. So its amplitude is considered to be an error, which must be normalized according to error control settings. If the normalized value is greater than 1, the correction was too large and the step must be rejected.

Returns:T

the normalized correction, if greater than 1, the step must be rejected

startback to summary
public void start(int rows, int columns, int startRow, int endRow, int startColumn, int endColumn)

Implements org.apache.commons.math3.linear.FieldMatrixPreservingVisitor.start.

Doc from org.apache.commons.math3.linear.FieldMatrixPreservingVisitor.start.

Start visiting a matrix.

This method is called once before any entry of the matrix is visited.

Parameters
rows:int

number of rows of the matrix

columns:int

number of columns of the matrix

startRow:int

Initial row index

endRow:int

Final row index (inclusive)

startColumn:int

Initial column index

endColumn:int

Final column index (inclusive)

visitback to summary
public void visit(int row, int column, T value)

Implements org.apache.commons.math3.linear.FieldMatrixPreservingVisitor.visit.

Doc from org.apache.commons.math3.linear.FieldMatrixPreservingVisitor.visit.

Visit one matrix entry.

Parameters
row:int

row index of the entry

column:int

column index of the entry

value:T

current value of the entry