brainpy.integrators.ode.RK4#

class brainpy.integrators.ode.RK4(f, var_type=None, dt=None, name=None, show_code=False, state_delays=None, neutral_delays=None)[source]#

Classical fourth-order Runge-Kutta method for ODEs.

For the given initial value problem of

\[{\frac {dy}{dt}}=f(t,y),\quad y(t_{0})=y_{0}.\]

The fourth-order RK method is formulated as:

\[\begin{split}\begin{aligned} y_{n+1}&=y_{n}+{\frac {1}{6}}h\left(k_{1}+2k_{2}+2k_{3}+k_{4}\right),\\ t_{n+1}&=t_{n}+h\\ \end{aligned}\end{split}\]

for \(n = 0, 1, 2, 3, \cdot\), using

\[\begin{split}\begin{aligned} k_{1}&=\ f(t_{n},y_{n}),\\ k_{2}&=\ f\left(t_{n}+{\frac {h}{2}},y_{n}+h{\frac {k_{1}}{2}}\right),\\ k_{3}&=\ f\left(t_{n}+{\frac {h}{2}},y_{n}+h{\frac {k_{2}}{2}}\right),\\ k_{4}&=\ f\left(t_{n}+h,y_{n}+hk_{3}\right). \end{aligned}\end{split}\]

Here \(y_{n+1}\) is the RK4 approximation of \(y(t_{n+1})\), and the next value (\(y_{n+1}\)) is determined by the present value (\(y_{n}\)) plus the weighted average of four increments, where each increment is the product of the size of the interval, \(h\), and an estimated slope specified by function \(f\) on the right-hand side of the differential equation.

  • \(k_{1}\) is the slope at the beginning of the interval, using \(y\) (Euler’s method);

  • \(k_{2}\) is the slope at the midpoint of the interval, using \(y\) and \(k_{1}\);

  • \(k_{3}\) is again the slope at the midpoint, but now using \(y\) and \(k_{2}\);

  • \(k_{4}\) is the slope at the end of the interval, using \(y\) and \(k_{3}\).

The RK4 method is a fourth-order method, meaning that the local truncation error is on the order of (\(O(h^{5}\)), while the total accumulated error is on the order of (\(O(h^{4}\)).

The corresponding Butcher tableau is:

\[\begin{split}\begin{array}{c|cccc} 0 & 0 & 0 & 0 & 0 \\ 1 / 2 & 1 / 2 & 0 & 0 & 0 \\ 1 / 2 & 0 & 1 / 2 & 0 & 0 \\ 1 & 0 & 0 & 1 & 0 \\ \hline & 1 / 6 & 1 / 3 & 1 / 3 & 1 / 6 \end{array}\end{split}\]

References

1

Lambert, J. D. and Lambert, D. Ch. 5 in Numerical Methods for Ordinary Differential Systems: The Initial Value Problem. New York: Wiley, 1991.

2

Press, W. H.; Flannery, B. P.; Teukolsky, S. A.; and Vetterling, W. T. “Runge-Kutta Method” and “Adaptive Step Size Control for Runge-Kutta.” §16.1 and 16.2 in Numerical Recipes in FORTRAN: The Art of Scientific Computing, 2nd ed. Cambridge, England: Cambridge University Press, pp. 704-716, 1992.

__init__(f, var_type=None, dt=None, name=None, show_code=False, state_delays=None, neutral_delays=None)#

Methods

__init__(f[, var_type, dt, name, show_code, ...])

build()

cpu()

Move all variable into the CPU device.

cuda()

Move all variables into the GPU device.

load_state_dict(state_dict[, warn])

Copy parameters and buffers from state_dict into this module and its descendants.

load_states(filename[, verbose])

Load the model states.

nodes([method, level, include_self])

Collect all children nodes.

register_implicit_nodes(*nodes[, node_cls])

register_implicit_vars(*variables, ...)

save_states(filename[, variables])

Save the model states.

set_integral(f)

Set the integral function.

state_dict()

Returns a dictionary containing a whole state of the module.

to(device)

Moves all variables into the given device.

tpu()

Move all variables into the TPU device.

train_vars([method, level, include_self])

The shortcut for retrieving all trainable variables.

tree_flatten()

Flattens the object as a PyTree.

tree_unflatten(aux, dynamic_values)

New in version 2.3.1.

unique_name([name, type_])

Get the unique name for this object.

vars([method, level, include_self, ...])

Collect all variables in this node and the children nodes.

Attributes

A

B

C

arguments

All arguments when calling the numer integrator of the differential equation.

dt

The numerical integration precision.

integral

The integral function.

name

Name of the model.

neutral_delays

neutral delays.

parameters

The parameters defined in the differential equation.

state_delays

State delays.

variables

The variables defined in the differential equation.