Simulation errorsΒΆ
Occasionally, a simulation will encounter a numerical error. Some simulation
types attempt to catch these errors and raise a SimulationError
. These
provide detailed error messages that can help diagnose the source of the error.
A common source of numerical errors is division by some term (x - c)
,
where x
is a variable and c
is a constant. Using double precision, this
should only happen very rarely and try-catch blocks around a simulation are not
typically necessary. This error is much more common when using single precision
(for example during a GPU enabled simulation) or when applying a step protocol
(for example, a term (V - 40) will not cause problems in most simulations, but
can trigger errors if V is stepped to exactly 40 mV. In these scenarios, it is
advised to add a try-catch block around a simulation:
import myokit
m,p,x = myokit.load('model.mmt')
s = myokit.SimulationOpenCL(m, p, 64)
try:
s.run(1000)
except myokit.SimulationError as e:
print(str(e))
Example result:
Encountered numerical error at t=411.054992676 in cell (55) when membrane.V=-77.0.
Obtained 4 previous state(s).
State before:
membrane.V = -77.0
ina.m = 5.76317822560667992e-03
ina.h = 3.50723683834075928e-01
ina.j = 1.33311852812767029e-01
ica.d = 6.89173266291618347e-02
ica.f = 7.21855103969573975e-01
ik.x = 3.83078485727310181e-01
ica.Ca_i = 2.27514933794736862e-03
State during:
membrane.V = nan
ina.m = 5.75887179002165794e-03
ina.h = 3.50991368293762207e-01
ina.j = 1.33416950702667236e-01
ica.d = 6.88845962285995483e-02
ica.f = 7.21879780292510986e-01
ik.x = 3.83071571588516235e-01
ica.Ca_i = 2.27477238513529301e-03
Evaluating derivatives at state before...
invalid value encountered in float_scalars
Encountered when evaluating
if(membrane.V < -100.0, 1.0, 2.837 * (exp(0.04 * (membrane.V + 77.0))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 1.0) / ((membrane.V + 77.0) * exp(0.04 * (membrane.V + 35.0))))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
With the following operands:
(1) 0.0
(2) 0.0
And the following variables:
membrane.V = -77.0
= -77.0