NMODL integration of ODEs
This is an overview of
the different ways a user can specify the equations that define the system they want to simulate in the MOD file
how these equations can be related to each other
how these equations are solved in NMODL
The user can specify information about the system in a variety of ways:
A high level way to describe a system is to specify a Mass Action Kinetic scheme of reaction equations in a
KINETICblockAlternatively a system of ODEs can be specified in a
DERIVATIVEblock (any kinetic scheme can also be written as a system of ODEs)Finally a system of linear/non-linear algebraic equations can be specified in a
LINEAR/NONLINEARblock (a numerical integration scheme, such as backwards Euler, transforms a system of ODEs into a system of linear or non-linear equations)
To reduce duplication of functionality for dealing with these related systems, we implement a hierarchy of transformations:
KINETICblocks of reaction statements are translated toDERIVATIVEblocks of equivalent ODE systems using the law of Mass ActionDERIVATIVEblocks of ODEs are translated to(NON)LINEARblocks of algebraic equations using a numerical integration scheme
After these transformations we are left with only LINEAR/NONLINEAR blocks that are then solved numerically (by Gaussian Elimination, LU factorization or Newton iteration)
KINETIC block
Mass Action kinetics: a set of reaction equations with associated reaction rates
converted to a
DERIVATIVEblocking containing an equivalent system of ODEs using the law of Mass Actionsee the nmodl-kinetic-schemes notebook for more details
DERIVATIVE block
system of ODEs & associated solve method:
cnexp,sparse,derivimplicitoreulercnexpapplicable if ODEs are linear & independent
exact analytic integration
see the nmodl-sympy-solver-cnexp notebook for more details
sparseapplicable if ODEs are linear & coupled
backwards Euler numerical integration scheme: \(f(t+\Delta t) = f(t) + dt f'(t+ \Delta t)\)
results in a linear algebraic system to solve
numerically stable
\(\mathcal{O}(\Delta t)\) integration error
see the nmodl-sympy-solver-sparse notebook for more details
derivimplcitalways applicable
backwards Euler numerical integration scheme: \(f(t+\Delta t) = f(t) + dt f'(t+ \Delta t)\)
results in a non-linear algebraic system to solve
numerically stable
\(\mathcal{O}(\Delta t)\) integration error
see the nmodl-sympy-solver-sparse notebook for more details
euleralways applicable
forwards Euler numerical integration scheme: \(f(t+\Delta t) = f(t) + \Delta t f'(t)\)
numerically unstable
\(\mathcal{O}(\Delta t)\) integration error
not recommended due to instability of scheme
LINEAR block
system of linear algebraic equations
for small systems (\(N<=3\))
solve at compile time by Gaussian elimination
for larger systems
solve at run-time by LU factorization with partial pivoting
see the nmodl-linear-solver notebook for more details
NONLINEAR block
system of non-linear algebraic equations
solve by Newton iteration
construct \(F(X)\), with Jacobian \(J(X)=\frac{\partial F_i}{\partial X_j}\)
such that desired solution \(X^*\) satisfies condition \(F(X^*) = 0\)
iterative solution given by \(X_{n+1} = X_n + J(X_n)^{-1} F(X_n)\)
see the nmodl-nonlinear-solver notebook for more details ***
[ ]: