package org.spaceroots.mantissa.ode;

/**
 * This class implements the 5(4) Higham and Hall integrator for
 * Ordinary Differential Equations.

 * 

This integrator is an embedded Runge-Kutta-Fehlberg integrator * of order 5(4) used in local extrapolation mode (i.e. the solution * is computed using the high order formula) with stepsize control * (and automatic step initialization) and continuous output. This * method uses 7 functions evaluations per step.

* @version $Id: HighamHall54Integrator.java 1709 2006-12-03 21:16:50Z luc $ * @author L. Maisonobe */ public class HighamHall54Integrator extends RungeKuttaFehlbergIntegrator { private static final String methodName = "Higham-Hall 5(4)"; private static final double[] c = { 2.0/9.0, 1.0/3.0, 1.0/2.0, 3.0/5.0, 1.0, 1.0 }; private static final double[][] a = { {2.0/9.0}, {1.0/12.0, 1.0/4.0}, {1.0/8.0, 0.0, 3.0/8.0}, {91.0/500.0, -27.0/100.0, 78.0/125.0, 8.0/125.0}, {-11.0/20.0, 27.0/20.0, 12.0/5.0, -36.0/5.0, 5.0}, {1.0/12.0, 0.0, 27.0/32.0, -4.0/3.0, 125.0/96.0, 5.0/48.0} }; private static final double[] b = { 1.0/12.0, 0.0, 27.0/32.0, -4.0/3.0, 125.0/96.0, 5.0/48.0, 0.0 }; private static final double[] e = { -1.0/20.0, 0.0, 81.0/160.0, -6.0/5.0, 25.0/32.0, 1.0/16.0, -1.0/10.0 }; /** Simple constructor. * Build a fifth order Higham and Hall integrator with the given step bounds * @param minStep minimal step (must be positive even for backward * integration), the last step can be smaller than this * @param maxStep maximal step (must be positive even for backward * integration) * @param scalAbsoluteTolerance allowed absolute error * @param scalRelativeTolerance allowed relative error */ public HighamHall54Integrator(double minStep, double maxStep, double scalAbsoluteTolerance, double scalRelativeTolerance) { super(false, c, a, b, new HighamHall54StepInterpolator(), minStep, maxStep, scalAbsoluteTolerance, scalRelativeTolerance); } /** Simple constructor. * Build a fifth order Higham and Hall integrator with the given step bounds * @param minStep minimal step (must be positive even for backward * integration), the last step can be smaller than this * @param maxStep maximal step (must be positive even for backward * integration) * @param vecAbsoluteTolerance allowed absolute error * @param vecRelativeTolerance allowed relative error */ public HighamHall54Integrator(double minStep, double maxStep, double[] vecAbsoluteTolerance, double[] vecRelativeTolerance) { super(false, c, a, b, new HighamHall54StepInterpolator(), minStep, maxStep, vecAbsoluteTolerance, vecRelativeTolerance); } /** Get the name of the method. * @return name of the method */ public String getName() { return methodName; } /** Get the order of the method. * @return order of the method */ public int getOrder() { return 5; } /** Compute the error ratio. * @param yDotK derivatives computed during the first stages * @param y0 estimate of the step at the start of the step * @param y1 estimate of the step at the end of the step * @param h current step * @return error ratio, greater than 1 if step should be rejected */ protected double estimateError(double[][] yDotK, double[] y0, double[] y1, double h) { double error = 0; for (int j = 0; j < y0.length; ++j) { double errSum = e[0] * yDotK[0][j]; for (int l = 1; l < e.length; ++l) { errSum += e[l] * yDotK[l][j]; } double yScale = Math.max(Math.abs(y0[j]), Math.abs(y1[j])); double tol = (vecAbsoluteTolerance == null) ? (scalAbsoluteTolerance + scalRelativeTolerance * yScale) : (vecAbsoluteTolerance[j] + vecRelativeTolerance[j] * yScale); double ratio = h * errSum / tol; error += ratio * ratio; } return Math.sqrt(error / y0.length); } }

Ads help maintain this website.