You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The full observability check for any grids and any sensors is described in #84, it is still a complicated task. In #508 we have implemented a simple necessary condition check so we can throw NotObservableError if we are sure there is not enough measurements.
The feature in #508 have greatly helped the real-time state estimation to give clear errors. However, there are still plenty of scenarios where the number of measurements seems to be sufficient, but they are not independent. It still results in SparseMatrixError.
Proposal
We are still far from implementing the full observability check as in #84. This issue proposes to do another intermediate step to implement the full necessary and sufficient condition check if the data satisfy the following conditions:
The grid is in radial structure without cycles. Parrallel branches do not count as cycles.
There is no voltage phasor (and also no current phasor) measurements.
In this case, implementing a full necessary and sufficient condition check is relatively easy.
Mathematics
See below the mathematical workout of proposal.
Build graph
Build an undirected graph with vertices (bus) and edges (branch). Parallel branches will be merged into one edge.
Since the graph is radial and there is no parallel edges. We strictly have n_edges = n_vertices - 1.
Label all the vertices with either injection_available or injection_unavailable.
Lable all the edges with either measured (if there is at least one power sensor in one of the parallel branches), or not_measured.
Perform a DFS search from the source vertex. For each vertex, record the predecessor vertex, and predecessor edge.
Check observability
Now we can check the observability. To do that, we traverse the vertices in the reverse order of the DFS results. For each vertex, we do the following:
If the predecessor edge is not_measured .
If the current vertex has injection_available
change the predecessor edge to measured.
Else
If the predecessor vertex has injection_available
change the predecessor edge to measured.
change the predecessor vertex to injection_unavailable.
Change the current vertex to injection_unavailable, regardless of the original state.
After traversal to all the vertices in reverse order, check if all the edges are now measured. If yes, the system is observable, otherwise it is not observable. This is a full necessary and sufficient condition check.
Implementation
It seems that we need to build another graph to implement the proposed method. However, all the information is already in the YBusStructure. If the grid is radial, in the topological processing the DFS search is already done, and the vertices are already ordered in reverse of DFS result. The upper triangle of the YBusStructure contains all the information of the predecessor vertex and predecessor edge.
So the implementation proposal will be
In MathModelTopology add a member called is_radial. This is easy to set in the topological processing.
In the observability check, pass the YBusStructure into the check function, and perform the graph check as above.
The figure below shows a simple graph and its YBusStructure. In the upper triangle, there should be only one off-diagonal entry which is the predecessor vertex and predecessor edge.
The text was updated successfully, but these errors were encountered:
Background
The full observability check for any grids and any sensors is described in #84, it is still a complicated task. In #508 we have implemented a simple necessary condition check so we can throw
NotObservableError
if we are sure there is not enough measurements.The feature in #508 have greatly helped the real-time state estimation to give clear errors. However, there are still plenty of scenarios where the number of measurements seems to be sufficient, but they are not independent. It still results in
SparseMatrixError
.Proposal
We are still far from implementing the full observability check as in #84. This issue proposes to do another intermediate step to implement the full necessary and sufficient condition check if the data satisfy the following conditions:
In this case, implementing a full necessary and sufficient condition check is relatively easy.
Mathematics
See below the mathematical workout of proposal.
Build graph
n_edges = n_vertices - 1
.injection_available
orinjection_unavailable
.measured
(if there is at least one power sensor in one of the parallel branches), ornot_measured
.Check observability
Now we can check the observability. To do that, we traverse the vertices in the reverse order of the DFS results. For each vertex, we do the following:
not_measured
.injection_available
measured
.injection_available
measured
.injection_unavailable
.injection_unavailable
, regardless of the original state.After traversal to all the vertices in reverse order, check if all the edges are now
measured
. If yes, the system is observable, otherwise it is not observable. This is a full necessary and sufficient condition check.Implementation
It seems that we need to build another graph to implement the proposed method. However, all the information is already in the
YBusStructure
. If the grid is radial, in the topological processing the DFS search is already done, and the vertices are already ordered in reverse of DFS result. The upper triangle of theYBusStructure
contains all the information of the predecessor vertex and predecessor edge.So the implementation proposal will be
MathModelTopology
add a member calledis_radial
. This is easy to set in the topological processing.YBusStructure
into the check function, and perform the graph check as above.The figure below shows a simple graph and its
YBusStructure
. In the upper triangle, there should be only one off-diagonal entry which is the predecessor vertex and predecessor edge.The text was updated successfully, but these errors were encountered: