ODE(1) | GNU Plotting Utilities | ODE(1) |

# NAME

ode - numerical solution of ordinary differential equations

# SYNOPSIS

**ode** [ *options* ] [ *file* ]

# DESCRIPTION

**ode** is a tool that solves, by numerical integration, the
initial value problem for a specified system of first-order ordinary
differential equations. Three distinct numerical integration schemes are
available: Runge-Kutta-Fehlberg (the default), Adams-Moulton, and Euler. The
Adams-Moulton and Runge-Kutta schemes are available with adaptive step
size.

The operation of **ode** is specified by a program, written in
its input language. The program is simply a list of expressions for the
derivatives of the variables to be integrated, together with some control
statements. Some examples are given in the **EXAMPLES ** section.

**ode** reads the program from the specified file, or from
standard input if no file name is given. If reading from standard input,
**ode** will stop reading and exit when it sees a single period on a line
by itself.

At each time step, the values of variables specified in the program are written to standard output. So a table of values will be produced, with each column showing the evolution of a variable. If there are only two columns, the output can be piped to graph(1) or a similar plotting program.

# OPTIONS

## Input Options

**-f***file*-

**--input-file***file*- Read input from
*file*before reading from standard input. This option makes it possible to work interactively, after reading a program fragment that defines the system of differential equations.

## Output Options

**-p***prec*-

**--precision***prec*- When printing numerical results, use
*prec*significant digits (the default is 6). If this option is given, the print format will be scientific notation. **-t**-

**--title**- Print a title line at the head of the output, naming the variables in each column. If this option is given, the print format will be scientific notation.

## Integration Scheme Options

The following options specify the numerical integration scheme.
Only one of the three basic options **-R**, **-A**, **-E** may be
specified. The default is **-R** (Runge-Kutta-Fehlberg).

**-R***[stepsize]*-

**--runge-kutta***[stepsize]*- Use a fifth-order Runge-Kutta-Fehlberg algorithm, with an adaptive stepsize unless a constant stepsize is specified. When a constant stepsize is specified and no error analysis is requested, then a classical fourth-order Runge-Kutta scheme is used.
**-A***[stepsize]*-

**--adams-moulton***[stepsize]*- Use a fourth-order Adams-Moulton predictor-corrector scheme, with an
adaptive stepsize unless a constant stepsize,
*stepsize*, is specified. The Runge-Kutta-Fehlberg algorithm is used to get past `bad' points (if any). **-E***[stepsize]*-

**--euler***[stepsize]*- Use a `quick and dirty' Euler scheme, with a constant stepsize. The
default value of
*stepsize*is 0.1. Not recommended for serious applications.

- The error bound options
**-r**and**-e**(see below) may not be used if**-E**is specified.

**-h***hmin [hmax]*-

**--step-size-bound***hmin [hmax]*- Use a lower bound
*hmin*on the stepsize. The numerical scheme will not let the stepsize go below*hmin*. The default is to allow the stepsize to shrink to the machine limit, i.e., the minimum nonzero double-precision floating point number.

- The optional argument
*hmax*, if included, specifies a maximum value for the stepsize. It is useful in preventing the numerical routine from skipping quickly over an interesting region.

## Error Bound Options

**-r***rmax [rmin]*-

**--relative-error-bound***rmax [rmin]*- The
**-r**option sets an upper bound on the relative single-step error. If the**-r**option is used, the relative single-step error in any dependent variable will never exceed*rmax*(the default for which is 10^-9). If this should occur, the solution will be abandoned and an error message will be printed. If the stepsize is not constant, the stepsize will be decreased `adaptively', so that the upper bound on the single-step error is not violated. Thus, choosing a smaller upper bound on the single-step error will cause smaller stepsizes to be chosen. A lower bound*rmin*may optionally be specified, to suggest when the stepsize should be increased (the default for*rmin*is*rmax*/1000). **-e***emax [emin]*-

**--absolute-error-bound***emax [emin]*- Similar to
**-r**, but bounds the absolute rather than the relative single-step error. **-s**-

**--suppress-error-bound**- Suppress the ceiling on single-step error, allowing
**ode**to continue even if this ceiling is exceeded. This may result in large numerical errors.

## Informational Options

# DIAGNOSTICS

Mostly self-explanatory. The biggest exception is `syntax error', meaning there is a grammatical error. Language error messages are of the form

**ode: nnn: message...**

where `nnn' is the number of the input line containing the error.
If the **-f** option is used, the phrase "(file)" follows the
`nnn' for errors encountered inside the file. Subsequently, when **ode**
begins reading the standard input, line numbers start over from 1.

No effort is made to recover successfully from syntactic errors in the input. However, there is a meager effort to resynchronize so more than one error can be found in one scan.

Run-time errors elicit a message describing the problem, and the solution is abandoned.

# EXAMPLES

The program

**y' = y**

**y = 1**

**print t, y**

**step 0, 1**

solves an initial value problem whose solution is *y=e^t*.
When **ode** runs this program, it will write two columns of numbers to
standard output. Each line will show the value of the independent variable
*t*, and the variable *y*, as *t* is stepped from 0 to 1.

A more sophisticated example would be

**sine' = cosine**

**cosine' = -sine**

**sine = 0**

**cosine = 1**

**print t, sine**

**step 0, 2*PI**

This program solves an initial value problem for a system of two differential equations. The initial value problem turns out to define the sine and cosine functions. The program steps the system over a full period.

# AUTHORS

**ode** was written by Nicholas B. Tufillaro
(**nbt@reed.edu**), and slightly enhanced by Robert S. Maier
(**rsm@math.arizona.edu**) to merge it into the GNU plotting
utilities.

# SEE ALSO

"The GNU Plotting Utilities Manual".

# BUGS

Email bug reports to **bug-gnu-utils@gnu.org**.

Dec 1998 | FSF |