5.1.5.1. Misuse: Touching, not crossing¶
Description: Resets whose test_value
coincides with a turning point of the test_variable
risk missing detection of the reset point.
Note that:
all elements are in the same component;
the order values of resets are not shown; and
the units of variables are not shown.
component: TouchingNotCrossing
├─ math: x = sin(t*pi/2)
├─ variable: x
└─ variable: y initially 0
├─ reset: rule 1
│ ├─ when x == 1
│ └─ then y = 1
└─ reset: rule 2
├─ when x == -1
└─ then y = 0
See CellML syntax
<variable name="t" units="dimensionless" />
<variable name="x" units="dimensionless" />
<variable name="y" units="dimensionless" initial_value="0" />
<math>
<apply><eq/>
<ci>x</ci>
<apply><sin/>
<apply><times/>
<ci>t</ci>
<apply><divide/>
<pi/>
<cn cellml:units="dimensionless">2</cn>
</apply>
</apply>
</apply>
</apply>
</math>
<!-- Reset rule 1: -->
<reset variable="y" test_variable="x">
<test_value>
<cn units="cellml:dimensionless">1</cn>
</test_value>
<reset_value>
<cn units="cellml:dimensionless">1</cn>
</reset_value>
</reset>
<!-- Reset rule 2: -->
<reset variable="y" test_variable="x">
<test_value>
<cn units="cellml:dimensionless">-1</cn>
</test_value>
<reset_value>
<cn units="cellml:dimensionless">0</cn>
</reset_value>
</reset>
A simulation with this model might proceed as follows:
t |
0.0 |
0.1 |
… |
0.9 |
1.0 |
1.1 |
… |
2.9 |
3.0 |
3.3 |
… |
x |
0 |
0.156 |
… |
0.988 |
1 |
0.988 |
… |
-0.988 |
-1 |
0.988 |
… |
y |
0 |
0 |
… |
0 |
0 → 1 |
1 |
… |
1 |
1 → 0 |
0 |
… |
However, it is easy for implementations to “miss” this type of reset in a simulation.
For example, the following may occur in an implementation with adaptive step sizes that uses root finding to detect resets (i.e.: by searching for sign changes in x - 1
):
t |
0.0 |
0.4 |
… |
0.9 |
1.1 |
1.7 |
… |
x |
0 |
0.588 |
… |
0.988 |
0.988 |
0.454 |
… |
y |
0 |
0 |
… |
0 |
0 |
0 |
0 |
x - 1 |
-1 |
-0.412 |
… |
-0.12 |
-0.12 |
-0.546 |
… |
This behaviour is expected to be common in implementations. For example, the popular adaptive solver https://computing.llnl.gov/projects/sundials/cvodeCVODE has a root finding mechanism that can be used to implement reset rules, but its documentation explicitly states it is unlikely to find roots where the sign does not change. As a result, this type of reset rule is probably best avoided.
5.1.5.1.1. Suggestions¶
TODO ?