Quickstart#

A model with two states, one observed up to an unknown scale:

import symident as si

m = si.Model({"A": "-k1*A", "B": "k1*A - k2*B"}, {"y": "s*B"})
res = si.detect(m, reconstruct=True)
print(res)
Result:  rank 4 / 5  |  1 non-identifiable direction

Generators  X = Σᵢ η(i) ∂ᵢ

Scalings:
  X₁
      η(A) :  + A
      η(B) :  + B
      η(s) :  - s

The coordinates are the parameters k1, k2, s and the initial values of A and B. Four combinations of them are identifiable; the fifth direction scales both initial values up and s down without changing y. reduce() removes it:

print(res.reduce())
Reduced 1 of 1 direction.

Trafo (non-identity entries)
  A = 1

Sections: the invariants name each orbit, the chart takes one point on it
  {X₁}  A = 1
      pin: a scaling orbit is a ray, so any positive value meets it exactly once

Fixing the initial value of A at one leaves an identifiable model.