001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.math3.ode.nonstiff;
019    
020    
021    /**
022     * This class implements the 3/8 fourth order Runge-Kutta
023     * integrator for Ordinary Differential Equations.
024     *
025     * <p>This method is an explicit Runge-Kutta method, its Butcher-array
026     * is the following one :
027     * <pre>
028     *    0  |  0    0    0    0
029     *   1/3 | 1/3   0    0    0
030     *   2/3 |-1/3   1    0    0
031     *    1  |  1   -1    1    0
032     *       |--------------------
033     *       | 1/8  3/8  3/8  1/8
034     * </pre>
035     * </p>
036     *
037     * @see EulerIntegrator
038     * @see ClassicalRungeKuttaIntegrator
039     * @see GillIntegrator
040     * @see MidpointIntegrator
041     * @version $Id: ThreeEighthesIntegrator.java 1416643 2012-12-03 19:37:14Z tn $
042     * @since 1.2
043     */
044    
045    public class ThreeEighthesIntegrator extends RungeKuttaIntegrator {
046    
047      /** Time steps Butcher array. */
048      private static final double[] STATIC_C = {
049        1.0 / 3.0, 2.0 / 3.0, 1.0
050      };
051    
052      /** Internal weights Butcher array. */
053      private static final double[][] STATIC_A = {
054        {  1.0 / 3.0 },
055        { -1.0 / 3.0, 1.0 },
056        {  1.0, -1.0, 1.0 }
057      };
058    
059      /** Propagation weights Butcher array. */
060      private static final double[] STATIC_B = {
061        1.0 / 8.0, 3.0 / 8.0, 3.0 / 8.0, 1.0 / 8.0
062      };
063    
064      /** Simple constructor.
065       * Build a 3/8 integrator with the given step.
066       * @param step integration step
067       */
068      public ThreeEighthesIntegrator(final double step) {
069        super("3/8", STATIC_C, STATIC_A, STATIC_B, new ThreeEighthesStepInterpolator(), step);
070      }
071    
072    }