/// <summary> /// главная функция рассчета управляемости системы. возвращает нашелся ли метод на тип системы, описанной в sysytem_state ///!!!Конструкторы не описаны - АБСТРАКТНЫЙ КОД! /// </summary> /// <param name="system_state"></param> /// <returns></returns> public static bool IsSystemControllability(ref State system_state) { //была ли определена управляемоть bool flag = false; //объект для инициализации в зависимости от типа системы Controllability node = new Controllability(ref system_state); if (system_state.synchronism) //система синхронна { if (!system_state.stationarity) //система не стационарная { if (system_state.delay_by_state && system_state.delay_by_control) //есть запаздывание по состоянию и управлению { node.IsContr_NonPerm_XU(ref system_state); //запись результата в State - состояние системы flag = true; } if (system_state.delay_by_state && !system_state.delay_by_control) //есть запаздывание по состоянию и НЕТ по управлению { node.IsContr_NonPerm_X(ref system_state); flag = true; } if (!system_state.delay_by_state && system_state.delay_by_control) //НЕТ запаздывания по состоянию и есть по управлению { node.IsContr_NonPerm_U(ref system_state); flag = true; } } else //система стационарна { if (system_state.delay_by_state && system_state.delay_by_control) //есть запаздывание по состоянию и по управлению { node.IsContr_Perm_XU(ref system_state); flag = true; } if (system_state.delay_by_state && !system_state.delay_by_control) //есть запаздывание по состоянию и НЕТ по управлению { node.IsContr_Perm_X(ref system_state); flag = true; } if (!system_state.delay_by_state && system_state.delay_by_control) //НЕТ запаздывания по состоянию и есть по управлению { node.IsContr_Perm_U(ref system_state); flag = true; } } } else //система асинхронна - пока хз. в книге написано что приводятся к синхронным. { flag = false; } return(flag); }
/// <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("Ошибка при определении параметров системы");//если не удалось даже подготовить к регуляции } }
/// <summary> /// Управляемость /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { int locationX = 10; int locationY = 160; String Matrix1Name = ""; String Matrix2Name = ""; tabPage2.Controls.Clear(); tabPage2.Controls.Add(button2); tabPage2.Controls.Add(label3); tabPage2.Controls.Add(label6); tabPage2.Controls.Add(label4); tabPage2.Controls.Add(label7); if (!sys.current_state.stationarity) { tabPage2.Controls.Add(label8); tabPage2.Controls.Add(label5); } tabPage2.Controls.Add(label9); Controllability.IsSystemControllability(ref sys.current_state); if (sys.current_state.stationarity) { Matrix1Name = " Vr"; Matrix2Name = " Va"; } label3.Location = new Point(locationX, locationY - 60); this.UniversalMatrixBox3 = new MatrixDrawer(new MatrixLibrary.Matrix(20, 20)); label4.Text = "Ранг" + Matrix1Name + ": " + Matrix.Rank(Controllability.GR).ToString(); UniversalMatrixBox3.Visible = false; UniversalMatrixBox3.Location = new Point(locationX, locationY); label4.Location = new Point(locationX, locationY - 25); this.tabPage2.Controls.Add(UniversalMatrixBox3); this.UniversalMatrixBox3.ReloadMatrix(Controllability.GR); UniversalMatrixBox3.Visible = true; if (sys.current_state.stationarity) { label4.Text += " | n = " + sys.current_state.n.ToString(); } else { locationX += UniversalMatrixBox3.Width + 20; this.UniversalMatrixBox4 = new MatrixDrawer(new MatrixLibrary.Matrix(20, 20)); label8.Text = "Ранг: " + Matrix.Rank(Controllability.temp_GR).ToString(); UniversalMatrixBox4.Visible = false; UniversalMatrixBox4.Location = new Point(locationX, locationY); label8.Location = new Point(locationX, locationY - 25); this.tabPage2.Controls.Add(UniversalMatrixBox4); this.UniversalMatrixBox4.ReloadMatrix(Controllability.temp_GR); UniversalMatrixBox4.Visible = true; } locationX = 10; locationY += UniversalMatrixBox3.Height + 80; label6.Location = new Point(locationX, locationY - 60); this.UniversalMatrixBox5 = new MatrixDrawer(new MatrixLibrary.Matrix(20, 20)); label7.Text = "Ранг" + Matrix2Name + ": " + Matrix.Rank(Controllability.G_).ToString(); UniversalMatrixBox5.Visible = false; UniversalMatrixBox5.Location = new Point(locationX, locationY); label7.Location = new Point(locationX, locationY - 25); this.tabPage2.Controls.Add(UniversalMatrixBox5); this.UniversalMatrixBox5.ReloadMatrix(Controllability.G_); UniversalMatrixBox5.Visible = true; if (sys.current_state.stationarity) { int tmp = sys.current_state.n * (sys.current_state.L[sys.current_state.a - 1] + 1); label7.Text += " | n(La+1) = " + tmp.ToString(); } else { locationX += UniversalMatrixBox5.Width + 20; this.UniversalMatrixBox6 = new MatrixDrawer(new MatrixLibrary.Matrix(20, 20)); label5.Text = "Ранг: " + Matrix.Rank(Controllability.temp_G_).ToString(); UniversalMatrixBox6.Visible = false; UniversalMatrixBox6.Location = new Point(locationX, locationY); label5.Location = new Point(locationX, locationY - 25); this.tabPage2.Controls.Add(UniversalMatrixBox6); this.UniversalMatrixBox6.ReloadMatrix(Controllability.temp_G_); UniversalMatrixBox6.Visible = true; } if (sys.current_state.full_controllability) { label9.ForeColor = Color.Green; label9.Text = "Система полностью управляема"; if (!debug) { step = 2; } } else { label9.ForeColor = Color.Red; if (sys.current_state.part_controllability) { label9.Text = "Система частично управляема"; } else { label9.Text = "Система не управляема"; } } }