---
name: "ode"
section: "1"
platform: "linux"
package: "plotutils"
version: "2.6-12"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/ode"
---

# ode(1)

numerical solution of ordinary differential equations

## 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)](/graph/1.md) 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

- **--help**

  Print a list of command-line options, and exit.

- **--version**

  Print the version number of **ode** and the plotting utilities package, and exit.

## 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**.
