# NAME

PDL::RungeKutta - Solve N-th order M dimensional ordinary differential equations using adaptive stepsize Runge Kutta method.

# DESCRIPTION

This module allows to solve N-th order M dimensional ordinary differential equations. It uses the adaptive stepsize control for fifth order Cash-Karp Runge-Kutta algorithm described in "Numerical Recipes in Fortran 77: The Art of Scientific Computing" Ch. 16.2. The errors are estimated as the difference between fifth order results and the embeded forth order results. To solve N-th order equations, you must first turn it into a system of N first order equations.

# SYNOPSIS

Example: Solve y'' + y = 0, y(0) = 0, y'(0) = 1

``````  use PDL;
use PDL::Math;
use PDL::NiceSlice;
use PDL::RungeKutta;

# y'' + y = 0, Solution: y = sin(t)

\$Y0 = pdl(0,1);           # y(0)=0, y'(0)=1   ( Y0=(f,g), f=y, g=y' )
@esargs=();               # extra arguments for error eval function
\$t0  = 0;                 # initial moment
\$dt0 = 0.1;               # initial time step
\$t1  = 1 0;               # final moment
\$eps = 1.e-6;             # error
\$verbose=1;

# integration
(\$evt,\$evy,\$evd,\$i,\$j) =
rkevolve(\$t0,\$Y,\$dt0,\&DE,\$t1,\$eps,\&error,\@esargs,\$verbose);

\$check=sin(\$evt);
wcols \$evt,\$evy((0)),\$check,'test.dat';

sub DE {                # differential eq
my (\$t,\$y)= @_;
my \$yd=zeroes(2);               # Y'    ( = (f',g') = (y',y'') )
\$yd(0).=\$y(1);                  # f'=g  ( = y' )
\$yd(1).=-\$y(0);                 # g'=-f ( =-y )
return \$yd;
}

sub error {               # error scale
my (\$t,\$Y) = @_;
my \$es=ones(2);         # constant scale
return \$es;
}
``````

Please see the other examples also.

# Exported Functions

## rkevolve

(\$t,\$Y,\$d,\$i,\$j) = rkevolve(\$t0,\$Y0,\$dt0,\$DE,\$t1,\$eps,\$erfcn,\$efarg,\$verbose)

This will solve the differential equation for DE with the initial conditions Y0 between t0 and t1 using adaptive step size control for Runge-Kutta.

Input
* \$t0 scalar, initial moment
* \$Y0 one dimensional piddle wich contains the initial conditions. Number of elements is NxM.
* \$dt0 scalar, initial time step
* \$DE reference to the function for the differential equation. Please see Math::ODE(3) for a more detailed description on how to construct the equations. It should return a piddle with the same dimensions as \$Y0.
* \$t1 scalar, final moment
* \$eps scalar, the requested error. Upon scaling with the output of erfcn this will give the requested error for each element of \$Y.
* \$erfcn reference to the error scaling function. This function should return a pidle containing scaling factors for the requested error for each element of \$Y. Please see Num. Rec. for more details.
* \$efarg reference to an array containing supplementary arguments for erfcn.
* \$verbose scalar, integer. If set to 1 details about progress are printed during calculation.
Output
* \$t piddle containing the independent variable
* \$Y piddle containing the results
* \$d piddle containing the errors as estimated by Cash-Karp Runge-Kutta algorithm
* \$i total number of iterations
* \$j number of resets made in order to decrease the error

## rk5

(\$y,\$del) = rk5(\$t,\$yi,\$h,\$DE)

This will carry out one Cash-Karp Runge-Kutta step. Could be useful if you want to do your own step size control or you just want equal steps.

Input
* \$t initial moment
* \$yi piddle containing the initial conditions
* \$h step
* \$DE reference to differential equation
Output
* \$y piddle containing the result
* \$del piddle containing the errors

# AUTHOR

Dragos Constantinescu <dragos@venus.nipne.ro>

Math::ODE(3)

"Numerical Recipes in Fortran 77: The Art of Scientific Computing" Ch. 16.

http://lib-www.lanl.gov/numerical/index.html

This package is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

24 POD Errors

The following errors were encountered while parsing the POD:

Around line 145:

'=item' outside of any '=over'

Around line 147:

Expected text after =item, not a bullet

Around line 149:

Expected text after =item, not a bullet

Around line 152:

Expected text after =item, not a bullet

Around line 154:

Expected text after =item, not a bullet

Around line 158:

Expected text after =item, not a bullet

Around line 160:

Expected text after =item, not a bullet

Around line 163:

Expected text after =item, not a bullet

Around line 167:

Expected text after =item, not a bullet

Around line 170:

Expected text after =item, not a bullet

Around line 175:

Expected text after =item, not a bullet

Around line 177:

Expected text after =item, not a bullet

Around line 179:

Expected text after =item, not a bullet

Around line 182:

Expected text after =item, not a bullet

Around line 184:

Expected text after =item, not a bullet

Around line 186:

You forgot a '=back' before '=head2'

Around line 193:

'=item' outside of any '=over'

Around line 195:

Expected text after =item, not a bullet

Around line 197:

Expected text after =item, not a bullet

Around line 199:

Expected text after =item, not a bullet

Around line 201:

Expected text after =item, not a bullet

Around line 205:

Expected text after =item, not a bullet

Around line 207:

Expected text after =item, not a bullet

Around line 209:

You forgot a '=back' before '=head1'