GillIntegrator.java

  1. /*
  2.  * Licensed to the Hipparchus project under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * The Hipparchus project licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *      https://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. package org.hipparchus.ode.nonstiff;

  18. import org.hipparchus.ode.EquationsMapper;
  19. import org.hipparchus.ode.ODEStateAndDerivative;
  20. import org.hipparchus.ode.nonstiff.interpolators.GillStateInterpolator;
  21. import org.hipparchus.util.FastMath;


  22. /**
  23.  * This class implements the Gill fourth order Runge-Kutta
  24.  * integrator for Ordinary Differential Equations .

  25.  * <p>This method is an explicit Runge-Kutta method, its Butcher-array
  26.  * is the following one :</p>
  27.  * <pre>
  28.  *    0  |    0        0       0      0
  29.  *   1/2 |   1/2       0       0      0
  30.  *   1/2 | (q-1)/2  (2-q)/2    0      0
  31.  *    1  |    0       -q/2  (2+q)/2   0
  32.  *       |-------------------------------
  33.  *       |   1/6    (2-q)/6 (2+q)/6  1/6
  34.  * </pre>
  35.  * <p>where q = sqrt(2)</p>
  36.  *
  37.  * @see EulerIntegrator
  38.  * @see ClassicalRungeKuttaIntegrator
  39.  * @see MidpointIntegrator
  40.  * @see ThreeEighthesIntegrator
  41.  * @see LutherIntegrator
  42.  */

  43. public class GillIntegrator extends FixedStepRungeKuttaIntegrator {

  44.     /** Name of integration scheme. */
  45.     public static final String METHOD_NAME = "Gill";

  46.     /** Simple constructor.
  47.      * Build a fourth-order Gill integrator with the given step.
  48.      * @param step integration step
  49.      */
  50.     public GillIntegrator(final double step) {
  51.         super(METHOD_NAME, step);
  52.     }

  53.     /** {@inheritDoc} */
  54.     @Override
  55.     public double[] getC() {
  56.         return new double[] {
  57.             1.0 / 2.0, 1.0 / 2.0, 1.0
  58.         };
  59.     }

  60.     /** {@inheritDoc} */
  61.     @Override
  62.     public double[][] getA() {
  63.         return new double[][] {
  64.             { 1.0 / 2.0 },
  65.             { (FastMath.sqrt(2.0) - 1.0) / 2.0, (2.0 - FastMath.sqrt(2.0)) / 2.0 },
  66.             { 0.0, -FastMath.sqrt(2.0) / 2.0, (2.0 + FastMath.sqrt(2.0)) / 2.0 }
  67.         };
  68.     }

  69.     /** {@inheritDoc} */
  70.     @Override
  71.     public double[] getB() {
  72.         return new double[] {
  73.             1.0 / 6.0, (2.0 - FastMath.sqrt(2.0)) / 6.0, (2.0 + FastMath.sqrt(2.0)) / 6.0, 1.0 / 6.0
  74.         };
  75.     }

  76.     /** {@inheritDoc} */
  77.     @Override
  78.     protected GillStateInterpolator createInterpolator(final boolean forward, final double[][] yDotK,
  79.                                                        final ODEStateAndDerivative globalPreviousState,
  80.                                                        final ODEStateAndDerivative globalCurrentState,
  81.                                                        final EquationsMapper mapper) {
  82.         return new GillStateInterpolator(forward, yDotK, globalPreviousState, globalCurrentState,
  83.                                         globalPreviousState, globalCurrentState, mapper);
  84.     }

  85. }