public static bool IsSystemObservability(ref State system_state, int k0 = 0) { bool result; int tempResult; Observability node = new Observability(ref system_state); if (!system_state.stationarity) //система не стационарная p.55 { tempResult = node.IsObserv_NonStationarity(ref system_state, k0); if (tempResult < 0) { result = false; } else { //Выставляем биты в state. // 0 - высавляем observersability в 0 // 1 - высавляем observersability в 1 // 2 - тоже выставляем observersability в 1... result = true; switch (tempResult) { case 0: system_state.full_observersability = false; system_state.part_observersability = false; break; case 1: system_state.full_observersability = true; break; case 2: system_state.part_observersability = true; break; } } } else //система стационарна { tempResult = node.IsObserv_stationarity(ref system_state); if (tempResult < 0) { result = false; } else { //Выставляем биты в state. // 0 - высавляем observersability в 0 // 1 - высавляем observersability в 1 // 2 - тоже выставляем observersability в 1... result = true; switch (tempResult) { case 0: system_state.full_observersability = false; system_state.part_observersability = false; break; case 1: system_state.full_observersability = true; break; case 2: system_state.part_observersability = true; break; } } } return(result); }
/// <summary> /// Наблюдаемость /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button_observ_Click(object sender, EventArgs e) { int locationX = 10; int locationY = 160; tabPage3.Controls.Clear(); tabPage3.Controls.Add(button_observ); tabPage3.Controls.Add(label_IsObserv); tabPage3.Controls.Add(label_FullObserv); tabPage3.Controls.Add(label_PartObserv); if (!sys.current_state.stationarity) { tabPage3.Controls.Add(label_Sa); tabPage3.Controls.Add(label_Sr); } tabPage3.Controls.Add(label_Va); tabPage3.Controls.Add(label_Vr); Observability.IsSystemObservability(ref sys.current_state); label_PartObserv.Location = new Point(locationX, locationY - 60); this.VrMatrixBox = new MatrixDrawer(new MatrixLibrary.Matrix(20, 20)); label_Vr.Text = "Ранг Vr: " + Matrix.Rank(Observability.tmpVr).ToString(); VrMatrixBox.Location = new Point(locationX, locationY); label_Vr.Location = new Point(locationX, locationY - 25); this.tabPage3.Controls.Add(VrMatrixBox); this.VrMatrixBox.ReloadMatrix(Observability.tmpVr); if (sys.current_state.stationarity) { label_Vr.Text += " | n = " + sys.current_state.n.ToString(); } else { locationX += VrMatrixBox.Width + 20; this.SrMatrixBox = new MatrixDrawer(new MatrixLibrary.Matrix(20, 20)); label_Sr.Text = "Ранг Sr: " + Matrix.Rank(Observability.tmpSr).ToString(); SrMatrixBox.Location = new Point(locationX, locationY); label_Sr.Location = new Point(locationX, locationY - 25); this.tabPage3.Controls.Add(SrMatrixBox); this.SrMatrixBox.ReloadMatrix(Observability.tmpSr); } locationX = 10; locationY += VrMatrixBox.Height + 80; label_FullObserv.Location = new Point(locationX, locationY - 60); this.VaMatrixBox = new MatrixDrawer(new MatrixLibrary.Matrix(20, 20)); label_Va.Text = "Ранг Va: " + Matrix.Rank(Observability.tmpVa).ToString(); VaMatrixBox.Location = new Point(locationX, locationY); label_Va.Location = new Point(locationX, locationY - 25); this.tabPage3.Controls.Add(VaMatrixBox); this.VaMatrixBox.ReloadMatrix(Observability.tmpVa); if (sys.current_state.stationarity) { int tmp = sys.current_state.n * (Observability.J + 1); label_Va.Text += " | n(J+1) = " + tmp.ToString(); } else { locationX += VaMatrixBox.Width + 20; this.SaMatrixBox = new MatrixDrawer(new MatrixLibrary.Matrix(20, 20)); label_Sa.Text = "Ранг Sa: " + Matrix.Rank(Observability.tmpSa).ToString(); SaMatrixBox.Location = new Point(locationX, locationY); label_Sa.Location = new Point(locationX, locationY - 25); this.tabPage3.Controls.Add(SaMatrixBox); this.SaMatrixBox.ReloadMatrix(Observability.tmpSa); } if (sys.current_state.full_observersability) { label_IsObserv.ForeColor = Color.Green; label_IsObserv.Text = "Система полностью наблюдаема"; if (!debug) { step = 3; } } else { label_IsObserv.ForeColor = Color.Red; if (sys.current_state.part_observersability) { label_IsObserv.Text = "Система частично наблюдаема"; } else { label_IsObserv.Text = "Система не наблюдаема"; } } }
/// <summary> /// Функция построения последовательности обработки системы ///diff_state - состояние, содержащее A, B и т.п. для следующего шага ///следствия реализации регулятора: diff_state.x[0] - новый х. также для А, В, analogA, analog_B,H,... /// </summary> /// <param name="diff_state"></param> public void next_stage(State diff_state) { if (Digitizer.DigitizeSystem(ref this.current_state) && Controllability.IsSystemControllability(ref this.current_state) && Observability.IsSystemObservability(ref this.current_state)) { if (!Regulator.MakeRegulation(ref this.current_state, diff_state)) { throw new ArgumentException("Ошибка при регулировании");//если вернули false, то для такой системы нет регулятора } } else { throw new ArgumentException("Ошибка при определении параметров системы");//если не удалось даже подготовить к регуляции } }