brainpy.integrators.ode.MidPoint
brainpy.integrators.ode.MidPoint#
- class brainpy.integrators.ode.MidPoint(f, var_type=None, dt=None, name=None, show_code=False, state_delays=None, neutral_delays=None)[source]#
Explicit midpoint method for ODEs.
Also known as the modified Euler method 1.
The midpoint method is a one-step method for numerically solving the differential equation given by:
\[y'(t) = f(t, y(t)), \quad y(t_0) = y_0 .\]The formula of the explicit midpoint method is:
\[y_{n+1} = y_n + hf\left(t_n+\frac{h}{2},y_n+\frac{h}{2}f(t_n, y_n)\right).\]Therefore, the Butcher tableau of the midpoint method is:
\[\begin{split}\begin{array}{c|cc} 0 & 0 & 0 \\ 1 / 2 & 1 / 2 & 0 \\ \hline & 0 & 1 \end{array}\end{split}\]Derivation
Compared to the slope formula of Euler method \(y'(t) \approx \frac{y(t+h) - y(t)}{h}\), the midpoint method use
\[y'\left(t+\frac{h}{2}\right) \approx \frac{y(t+h) - y(t)}{h},\]The reason why we use this, please see the following geometric interpretation. Then, we get
\[y(t+h) \approx y(t) + hf\left(t+\frac{h}{2},y\left(t+\frac{h}{2}\right)\right).\]However, we do not know \(y(t+h/2)\). The solution is then to use a Taylor series expansion exactly as the Euler method to solve:
\[y\left(t + \frac{h}{2}\right) \approx y(t) + \frac{h}{2}y'(t)=y(t) + \frac{h}{2}f(t, y(t)),\]Finally, we can get the final step function:
\[y(t + h) \approx y(t) + hf\left(t + \frac{h}{2}, y(t) + \frac{h}{2}f(t, y(t))\right).\]Geometric interpretation
In the basic Euler’s method, the tangent of the curve at \((t_{n},y_{n})\) is computed using \(f(t_{n},y_{n})\). The next value \(y_{n+1}\) is found where the tangent intersects the vertical line \(t=t_{n+1}\). However, if the second derivative is only positive between \(t_{n}\) and \(t_{n+1}\), or only negative, the curve will increasingly veer away from the tangent, leading to larger errors as \(h\) increases.
Compared with the Euler method, midpoint method use the tangent at the midpoint (upper, green line segment in the following figure 2), which would most likely give a more accurate approximation of the curve in that interval.
Although this midpoint tangent could not be accurately calculated, we can estimate midpoint value of \(y(t)\) by using the original Euler’s method. Finally, the improved tangent is used to calculate the value of \(y_{n+1}\) from \(y_{n}\). This last step is represented by the red chord in the diagram.
Note
Note that the red chord is not exactly parallel to the green segment (the true tangent), due to the error in estimating the value of \(y(t)\) at the midpoint.
References
- __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.