yields the observable subsystem of the system sys.
ObservableDecomposition[sys,{z1,…}]
specifies the new coordinates zi.
ObservableDecomposition
yields the observable subsystem of the system sys.
ObservableDecomposition[sys,{z1,…}]
specifies the new coordinates zi.
Details and Options
- ObservableDecomposition gives {p,osys}, where p is the transformation and osys is the observable subsystem.
- The system sys can be a standard or descriptor StateSpaceModel or AffineStateSpaceModel.
- The observable subsystem is given by StateSpaceTransform[sys,p].
- ObservableDecomposition accepts a Method option. The following settings can be specified:
-
Automatic automatically choose the method "Matrix" use the observability matrix "Distribution" use the observability distribution
Examples
open all close allBasic Examples (1)
Find the observable subsystem and its transformation:
ObservableDecomposition[StateSpaceModel[{{{Subscript[a, 1], 0, 0}, {0, Subscript[a, 2], 0},
{0, 0, Subscript[a, 3]}}, {{Subscript[b, 1]},
{Subscript[b, 2]}, {Subscript[b, 3]}},
{{Subscript[c, 1], 0, Subscript[c, 3]}},
{{Subscript[d, 11]}}}, SamplingPeriod -> None, SystemsModelLabels -> None]]Scope (4)
The observable subsystem of an observable system is the complete system:
ssm = StateSpaceModel[{{{0, 0, -2}, {1, 0, -3}, {0, 1, -1}}, {{3}, {-2}, {1}}, {{0, 0, 1}}, {{0}}},
SamplingPeriod -> None, SystemsModelLabels -> None];
ObservableDecomposition[ssm]The observable subsystem of a partially observable continuous-time system:
ssm = StateSpaceModel[{{{3, 6, 4}, {9, 6, 10}, {-7, -7, -9}}, {{1/3, 2/3}, {2/3, 1/3}, {-1/6, 1/3}},
{{1, 2, 3}, {3, 3, 6}}, {{0, 0}, {0, 0}}}, SamplingPeriod -> None, SystemsModelLabels -> None];MatrixForm /@ ObservableDecomposition[N@ssm]The observable subsystem of a descriptor system:
ObservableDecomposition[StateSpaceModel[{{{Subscript[a, 1], 0, 0}, {0, Subscript[a, 2], 0},
{0, 0, Subscript[a, 3]}}, {{0, 0}, {Subscript[b, 1], 0},
{0, Subscript[b, 2]}}, {{0, Subscript[c, 1], 0},
{0, 0, Subscript[c, 3]}},
{{Subscript[d, 11], Subscript[d, 12]},
{Subscript[d, 21], Subscript[d, 22]}},
{{Subscript[e, 1], 0, 0}, {0, Subscript[e, 2], 0}, {0, 0, 0}}},
SamplingPeriod -> None, SystemsModelLabels -> None]]The observable subsystem of an affine system:
ObservableDecomposition[AffineStateSpaceModel[{{-Subscript[x, 2], Subscript[x, 1]*
Subscript[x, 2], Subscript[x, 3]},
{{1 + Subscript[x, 2]}, {0}, {0}}, {Subscript[x, 1]}, {{0}}},
{Subscript[x, 1], Subscript[x, 2], Subscript[x, 3]},
{Subscript[, 1]}, {Automatic}, Automatic, SamplingPeriod -> None]]ObservableDecomposition[AffineStateSpaceModel[{{-Subscript[x, 2], Subscript[x, 1]*
Subscript[x, 2], Subscript[x, 3]},
{{1 + Subscript[x, 2]}, {0}, {0}}, {Subscript[x, 1]}, {{0}}},
{Subscript[x, 1], Subscript[x, 2], Subscript[x, 3]},
{Subscript[, 1]}, {Automatic}, Automatic, SamplingPeriod -> None], {Subscript[z, 1], Subscript[z, 2], Subscript[z, 3]}]Applications (7)
Linear Systems (4)
Construct the Kalman observable decomposition:
ssm = StateSpaceModel[{{{Subscript[a, 1], 0, 0}, {0, Subscript[a, 2], 0},
{0, 0, Subscript[a, 3]}}, {{0, 0}, {Subscript[b, 1], 0},
{0, Subscript[b, 2]}}, {{Subscript[c, 1], 0, 0},
{0, 0, Subscript[c, 3]}},
{{Subscript[d, 11], Subscript[d, 12]},
{Subscript[d, 21], Subscript[d, 22]}}}, SamplingPeriod -> None,
SystemsModelLabels -> None];ObservableDecomposition picks out the observable subsystem only:
{p, ossm} = ObservableDecomposition[ssm];ossmKalman observable decomposition puts the observable subsystem first and keeps the rest:
po = NullSpace[p]; (* Orthogonal space *)
StateSpaceTransform[ssm, ArrayFlatten[{{p, po}}]]Compute the dimension of the observable subspace:
{p, ossm} = ObservableDecomposition[StateSpaceModel[{{{Subscript[a, 1], 0, 0}, {0, Subscript[a, 2], 0},
{0, 0, Subscript[a, 3]}}, {{0, 0}, {Subscript[b, 1], 0},
{0, Subscript[b, 2]}}, {{Subscript[c, 1], 0, 0},
{0, 0, Subscript[c, 3]}},
{{Subscript[d, 11], Subscript[d, 12]},
{Subscript[d, 21], Subscript[d, 22]}}}, SamplingPeriod -> None,
SystemsModelLabels -> None]];The observable subspace is the range of p, i.e. the column dimension:
Dimensions[p]//LastFind the observable subspace for the system below and show what state trajectories you can tell apart from observing the output only:
ssm = StateSpaceModel[{{{-6, -2, -3}, {3, -1, 3}, {2, 2, -1}}, {{1}, {0}, {-2}}, {{0, 1, -1}}, {{0}}},
SamplingPeriod -> None, SystemsModelLabels -> None];The system is unobservable, so only a subspace is observable from output:
ObservableModelQ[ssm]The range of the transformation p gives the observable subspace:
{p, osys} = ObservableDecomposition[ssm];ospace = ParametricPlot3D[p.{u, v}, {u, -1, 1}, {v, -1, 1}, Mesh -> None, PlotStyle -> Opacity[0.7]]Simulate trajectories whose initial value projects to a single point on the observable subspace:
w = First@NullSpace[p];
x0 = Table[p.{0.5, 0.5} + λ w, {λ, -0.4, 0.4, 0.2}];
sr = Table[StateResponse[{ssm, x}, Sin[2t], {t, 0, 10}], {x, x0}];Show[ParametricPlot3D[Evaluate[sr], {t, 0, 10}], ospace, ParametricPlot3D[Evaluate[p.{0.5, 0.5} + λ w], {λ, -0.5, 0.5}]]From observing the output, all these trajectories look identical:
or = Table[OutputResponse[{ssm, x}, Sin[2t], {t, 0, 10}], {x, x0}];Plot[or, {t, 0, 10}]Determine states that can be estimated using available measurements and design an estimator:
Only the position of mass
is measured, and so the system is not completely observable:
pars = {Subscript[k, 1] -> 75, Subscript[k, 2] -> 100, Subscript[m, 1] -> 1, Subscript[m, 2] -> 0.5};ssm = StateSpaceModel[{{{0, 1, 0, 0, 0, 0},
{-(Subscript[k, 1] + Subscript[k, 2])/Subscript[m, 1], 0,
Subscript[k, 2]/Subscript[m, 1], 0, 0, 0}, {0, 0, 0, 1, 0, 0},
{Subscript[k, 2]/Subscript[m, 2], 0,
-Subscript[k, 2]/Subscript[m, 2], 0, 0, 0}, {0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, -Subscript[k, 2]/Subscript[m, 2], 0}},
{{0, 0}, {Subscript[m, 1]^(-1), 0}, {0, 0}, {0, 0}, {0, 0},
{0, Subscript[m, 2]^(-1)}}, {{1, 0, 0, 0, 0, 0}}, {{0, 0}}},
SamplingPeriod -> None, SystemsModelLabels ->
{None, None, {Subscript[x, 1], Subscript[v, 1],
Subscript[x, 2], Subscript[v, 2*x],
Subscript[y, 2], Subscript[v, 2*y]}}] /. pars;ObservableModelQ[ssm]The states associated with zero rows in the transformation matrix
cannot be observed:
{p, osys} = ObservableDecomposition[ssm];Position[p, {_ ? PossibleZeroQ..}]An estimator can be designed to estimate any combination of the first four states:
ℓ = EstimatorGains[osys, {-1, -2, -3 + I, -3 - I}]StateOutputEstimator[osys, ℓ];est = SystemsModelSeriesConnect[%, TransferFunctionModel[{PadRight[p[[3]], 5]}]]Compute the response of
for a set of input signals and initial conditions:
inps = {UnitStep[t] - UnitStep[t - 2], UnitStep[t - 1] - UnitStep[t - 3]};
ics = {0.01, 0, 0.1, 0, 0.05, 0};x2 = StateResponse[{ssm, ics}, inps, {t, 0, 8}][[3]];
Plot[x2, {t, 0, 8}]The estimated state trajectories:
x2e = OutputResponse[est, Join[inps, OutputResponse[{ssm, ics}, inps, {t, 0, 8}]], {t, 0, 8}];Plot[{x2, x2e}, {t, 0, 8}, PlotLegends -> {"actual", "estimated"}, PlotRange -> All]Affine Systems (3)
Construct the triangular observability decomposition:
assm = AffineStateSpaceModel[{{Subscript[x, 1], -Subscript[x, 1] +
Subscript[x, 2] + Subscript[x, 1]*Subscript[x, 2],
-Subscript[x, 1] - Subscript[x, 3]},
{{0}, {1}, {1 + Subscript[x, 1]}}, {Subscript[x, 2]}, {{0}}},
{Subscript[x, 1], Subscript[x, 2], Subscript[x, 3]},
Automatic, {Automatic}, Automatic, SamplingPeriod -> None];ObservableDecomposition picks out the observable subsystem only:
{{p1, p2}, osys} = ObservableDecomposition[assm];osysTriangular observability decomposition puts the observable subsystem first and keeps the rest:
StateSpaceTransform[assm, {p1, Flatten[p2]}]Compute the dimension of the observable subspace:
assm = AffineStateSpaceModel[{{E^Subscript[x, 2]*Subscript[x, 2] +
Subscript[x, 1]*Subscript[x, 3], Subscript[x, 3],
(-Subscript[x, 2])*Subscript[x, 3] + Subscript[x, 4],
(-Subscript[x, 2]^2)*Subscript[x, 3] +
Subscript[x, 3]^2 + Subscript[x, 2]*Subscript[x, 4]},
{{Subscript[x, 1]}, {1}, {0}, {Subscript[x, 3]}},
{Subscript[x, 3]}, {{0}}}, {Subscript[x, 1],
Subscript[x, 2], Subscript[x, 3], Subscript[x, 4]},
Automatic, {Automatic}, Automatic, SamplingPeriod -> None];ObservableModelQ[assm]The dimension can be obtained from the inverse transformation
:
{{Subscript[p, 1], Subscript[p, 2]}, ossm} = ObservableDecomposition[assm];ossmLength[First[Subscript[p, 2]]]Find the subspaces whose outputs are indistinguishable:
asys = AffineStateSpaceModel[{{E^Subscript[x, 2]*Subscript[x, 2] +
Subscript[x, 1]*Subscript[x, 3], Subscript[x, 3],
(-Subscript[x, 2])*Subscript[x, 3] + Subscript[x, 4],
(-Subscript[x, 2]^2)*Subscript[x, 3] +
Subscript[x, 3]^2 + Subscript[x, 2]*Subscript[x, 4]},
{{Subscript[x, 1]}, {1}, {0}, {Subscript[x, 3]}},
{Subscript[x, 3]}, {{0}}}, {Subscript[x, 1],
Subscript[x, 2], Subscript[x, 3], Subscript[x, 4]},
Automatic, {Automatic}, Automatic, SamplingPeriod -> None];The system is unobservable, so only a subspace is observable from output:
ObservableModelQ[asys]The indistinguishable subspace:
{{Subscript[p, 1], {Subscript[p, 21], Subscript[p, 22]}}, osys} = ObservableDecomposition[asys];isubspace[{x1_, x2_, x3_, x4_}] := Last /@ Subscript[p, 21] /. {Subscript[x, 1] -> x1, Subscript[x, 2] -> x2, Subscript[x, 3] -> x3, Subscript[x, 4] -> x4}isubspace[{Subscript[x, 1], Subscript[x, 2], Subscript[x, 3], Subscript[x, 4]}]Subscript[pt, 1] = {1, 3, 1, 2};
Subscript[pt, 2] = {1, 1, 1, 0};isubspace /@ {Subscript[pt, 1], Subscript[pt, 2]}The trajectories of the outputs from the two points are the same:
Table[OutputResponse[{asys, pt}, UnitStep[t], {t, 0, 1}], {pt, {Subscript[pt, 1], Subscript[pt, 2]}}];Table[Plot[or, {t, 0, 1}], {or, Flatten[%, 1]}]Properties & Relations (2)
The transformation matrix p selects the observable subsystem using StateSpaceTransform:
ssm = StateSpaceModel[{{{Subscript[a, 1], 0, 0}, {0, Subscript[a, 2], 0},
{0, 0, Subscript[a, 3]}}, {{0, 0}, {Subscript[b, 1], 0},
{0, Subscript[b, 2]}}, {{Subscript[c, 1], 0, 0},
{0, 0, Subscript[c, 3]}},
{{Subscript[d, 11], Subscript[d, 12]},
{Subscript[d, 21], Subscript[d, 22]}}}, SamplingPeriod -> None,
SystemsModelLabels -> None];{p, osys} = ObservableDecomposition[ssm];
tsys = StateSpaceTransform[ssm, {p, p}];{osys, tsys}For affine systems, the transformation rules select the observable subsystem:
assm = AffineStateSpaceModel[{{-Subscript[x, 4], 0, -Subscript[x, 1],
Subscript[x, 2]}, {{1}, {0}, {1 + Subscript[x, 2]}, {0}},
{Subscript[x, 1], Subscript[x, 2]}, {{0}, {0}}},
{Subscript[x, 1], Subscript[x, 2], Subscript[x, 3],
Subscript[x, 4]}, {Subscript[, 1]}, {Automatic, Automatic}, Automatic,
SamplingPeriod -> None];{p, osys} = ObservableDecomposition[assm];
tsys = StateSpaceTransform[assm, p];{osys, tsys}Related Guides
Text
Wolfram Research (2010), ObservableDecomposition, Wolfram Language function, https://reference.wolfram.com/language/ref/ObservableDecomposition.html (updated 2014).
CMS
Wolfram Language. 2010. "ObservableDecomposition." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2014. https://reference.wolfram.com/language/ref/ObservableDecomposition.html.
APA
Wolfram Language. (2010). ObservableDecomposition. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/ObservableDecomposition.html
BibTeX
@misc{reference.wolfram_2026_observabledecomposition, author="Wolfram Research", title="{ObservableDecomposition}", year="2014", howpublished="\url{https://reference.wolfram.com/language/ref/ObservableDecomposition.html}", note=[Accessed: 12-June-2026]}
BibLaTeX
@online{reference.wolfram_2026_observabledecomposition, organization={Wolfram Research}, title={ObservableDecomposition}, year={2014}, url={https://reference.wolfram.com/language/ref/ObservableDecomposition.html}, note=[Accessed: 12-June-2026]}