Posted on Tue 21 April 2026
tags: Теория управления бпм
Добрый день!
Обновлен список вопросов к экзамену. Экзамен будет проходить в письменной форме.
Мы будем обсуждать теорию управления на практических примерах. Здесь, на сайте, для вас будут размещены задания, список вопросов к экзамену, список литерауры по предмету, список вопросов к экзамену/зачету и другая необходимая информация.
Курс рассчитан на 1 семестр, в конце курса предусмотрен экзамен.
Для допуска к экзамену/зачету необходимо выполнить и защитить все лабораторные работы и получить не менее 51 балла в течение семестра.
Итоговая оценка выставляется в соответствии с требованиями балльно-рейтинговой системы (см. критерии так же оценки на экзамене). Для допуска к экзамену необходимо выполнить и защитить все лабораторные работы.
При выполнении работ можно использовать следующие ресурсы (список будет пополняться):
За основу можно брать следующий код (для Lego-робота):
from pybricks.hubs import TechnicHub
from pybricks.pupdevices import DCMotor, ColorDistanceSensor
from pybricks.parameters import Button, Color, Direction, Port, Side, Stop
from pybricks.robotics import DriveBase
from pybricks.tools import wait, StopWatch
hub = TechnicHub()
left_motor = DCMotor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
right_motor = DCMotor(Port.B, positive_direction=Direction.CLOCKWISE)
light_sensor = ColorDistanceSensor(Port.C)
left_motor.dc(30)
right_motor.dc(30)
wait(3000)
left_motor.dc(0)
right_motor.dc(0)
Либо, для робота второго типа, вот такой:
"""
датчик цвета и освещенности поверхности.
для получения освещенности поверхности используйте свойство illumination, например, так
>>> cs.illumination
"""
cs = ColorSensor()
"""
Управлением моторами. Параметр принимает значения от -4095 до 4095
(положительные значения - движение робота вперед, отрицательные - движение назад)
рекомендуется использовать значения в пределах от -1500 до 1500
"""
motors.run_left(1500) # запускаем левый мотор
motors.run_right(1500) # запускаем правый мотор
for i in range(20):
print(i)
print(cs.illumination) # выводим в консоль значение освещенности
sleep(0.1) # ожидаем 0.1 секунды (в качестве параметра допускаются вещественные значения)
motors.run_left(0) # останавливаем левый мотор
motors.run_right(0) # останавливаем правый мотор
Для нечеткого логического контроллера необходимо использовать следующий шаблон кода (код основан на коде библиотеки fuzzypy):
from pybricks.hubs import TechnicHub
from pybricks.pupdevices import DCMotor, ColorDistanceSensor
from pybricks.parameters import Button, Color, Direction, Port, Side, Stop
from pybricks.robotics import DriveBase
from pybricks.tools import wait, StopWatch
hub = TechnicHub()
def larsen(member_value, alfa_level):
return member_value * alfa_level
def mamdani(member_value, alfa_level):
return min(member_value, alfa_level)
def step_generator(start, stop, num):
if num <= 0:
raise ValueError("The number of steps shouldn't be zero or negative")
if start == stop:
raise ValueError("The start number shouldn't be equal to stop")
step = float(stop - start) / float(num)
cur_x = start
while cur_x <= stop:
yield cur_x
cur_x += step
def build_resulting_fuzzy_term(rules, variable_to_build_for):
if not isinstance(rules, list):
rules = [rules]
given_variable_rules = [
rule
for rule in rules
if rule.variable == variable_to_build_for
]
def resulting_membership_function(x):
return max(
[
rule(x)
for rule in given_variable_rules
]
)
return FuzzyTerm(resulting_membership_function, variable_to_build_for)
def center_of_gravity(function_to_evaluate, x_elements):
x = list(x_elements)
num = sum(
x * function_to_evaluate(x)
for x in x
)
denum = sum(
function_to_evaluate(x)
for x in x
)
return num / denum if denum else function_to_evaluate.variable.upp_limit
def first_maximum(function_to_evaluate, x_elements):
arguments = list(x_elements)
max_x = arguments[0]
max_value = function_to_evaluate(max_x)
for current_x in arguments:
current_value = function_to_evaluate(current_x)
if current_value > max_value:
max_value = current_value
max_x = current_x
return max_x
def first_maximum(function_to_evaluate: FuzzyTerm, x_elements: Iterable[float]) -> float:
arguments = list(x_elements)
max_x = arguments[0]
max_value = function_to_evaluate(max_x)
for current_x in arguments:
current_value = function_to_evaluate(current_x)
if current_value > max_value:
max_value = current_value
max_x = current_x
return max_x
def defuzzify(term_to_defuzzify, method):
variable = term_to_defuzzify.variable
lower_limit = variable.low_limit
upper_limit = variable.upp_limit
defuzzified_value = method(term_to_defuzzify, step_generator(lower_limit, upper_limit, 100))
variable.value = defuzzified_value
return defuzzified_value
class MembershipFunction:
"""
Abstract class for creating of Membership function.
The functions can be multiplied, also "and" and "or" operators are applicable
"""
def __init__(self, *args):
self.__points = sorted(args[0] if isinstance(args, tuple) and len(args) == 1 else args)
self.left_border = min(self.__points)
self.right_border = max(self.__points)
def __and__(self, other):
ret = MembershipFunction(list(set(self.__points).union(set(other.__points))))
def ret_func(*d, **mp):
return min(float(self(*d, **mp)), float(other(*d, **mp)))
ret.func = ret_func
return ret
def __or__(self, other):
ret = MembershipFunction(list(set(self.__points).union(set(other.__points))))
def ret_func(*d, **mp):
return max(float(self(*d, **mp)), float(other(*d, **mp)))
ret.func = ret_func
return ret
def __mul__(self, other):
ret = MembershipFunction(list(set(self.__points).union(set(other.__points))))
def ret_func(*d, **mp):
return float(self(*d, **mp)) * float(other(*d, **mp))
ret.func = ret_func
return ret
def __call__(self, x):
return self.func(x)
class TriFunc(MembershipFunction):
"""
The triangle membership function.
"""
def __init__(self, *args):
super(TriFunc, self).__init__(*args)
def trifunc(x):
if x < args[0]:
ret = 0.0
elif x <= args[1] != args[0]:
ret = (x - args[0]) / (args[1] - args[0])
elif x <= args[2]:
ret = 1 - (x - args[1]) / (args[2] - args[1])
else:
ret = 0.0
return ret
self.func = trifunc
class TrapecFunc(MembershipFunction):
"""
The triangle membership function.
"""
def __init__(self, *args):
super(TrapecFunc, self).__init__(*args)
def trapfunc(x):
if x < args[0]:
ret = 0.0
elif x <= args[1]:
ret = (x - args[0]) / (args[1] - args[0])
elif x <= args[2]:
ret = 1
elif x <= args[3]:
ret = 1 - (x - args[2]) / (args[3]- args[2])
else:
ret = 0.0
return ret
self.func = trapfunc
class FuzzyTerm:
"""
A fuzzy term like the weather is hot or the speed is slow
"""
def __init__(self, membership, variable):
"""
Create new fuzzy term
:param membership: The membership function to describe the value of the variable as a fuzzy set
:param variable: The variable to describe the linguistic term of
"""
self.membership = membership
self.variable = variable
def __call__(self, optional_x = None):
"""
Compute the level
:return: level
"""
return self.membership(optional_x if optional_x is not None else self.variable.value)
def __and__(self, other):
"""
Combine two terms with "and" condition
:param other: the term to combine with
:return: new membership function
"""
def ret_func(*d, **mp):
return min(float(self.membership(*d, **mp)), float(other.membership(*d, **mp)))
ret_term = FuzzyTerm(ret_func, self.variable)
return ret_term
def __or__(self, other):
"""
Combine two terms with "or" condition
:param other: the term to combine with
:return: new membership function
"""
def ret_func(*d, **mp):
return max(float(self.membership(*d, **mp)), float(other.membership(*d, **mp)))
ret_term = FuzzyTerm(ret_func, self.variable)
return ret_term
class FuzzyRule:
"""
A fuzzy rule that works as a membership function
"""
def __init__(self, antecedents, variable, membership, implication=larsen):
"""
Create new fuzzy rule
:param antecedents: A list of (or just the one) antecedents for the rule. Can be associated with different variables
:param variable: The output variable
:param membership: The membership function that corresponds to the rule
:param implication: The implication function that corresponds to the rule
"""
if isinstance(antecedents, list):
self.antecedents = antecedents
else:
self.antecedents = [antecedents]
variable.low_limit = min(variable.low_limit, membership.left_border)
variable.upp_limit = max(variable.upp_limit, membership.right_border)
self.membership = membership
self.variable = variable
self.implication = implication
def __call__(self, x):
"""
Compute the ruth level for the given x
:param x:
:return:
"""
value_by_rules = min([cur_ant() for cur_ant in self.antecedents])
membership = self.membership(x)
self.variable.value = self.implication(value_by_rules, membership)
return self.variable.value
class FuzzyVariable:
"""
A fuzzy varibale
"""
def __init__(self):
self.value = 0.0
self.low_limit = float("inf")
self.upp_limit = -float("inf")
def is_(self, membership):
"""
Create the fuzzy term associated with the variable
:param membership: The membership functions that describes the term
:return: The created fuzzy term
"""
self.low_limit = min(self.low_limit, membership.left_border)
self.upp_limit = max(self.upp_limit, membership.right_border)
return FuzzyTerm(membership, self)
left_motor_drive = DCMotor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
right_motor_drive = DCMotor(Port.B, positive_direction=Direction.CLOCKWISE)
light_sensor = ColorDistanceSensor(Port.C)
# Create the input fuzzy variable
brightness = FuzzyVariable()
# Create output fuzzy variables
left_motor = FuzzyVariable()
right_motor = FuzzyVariable()
# Determine the fuzzy terms
pass
# Create output variables membership functions
pass
# Determine the rules
pass
dt = 10
while True:
pass # implement your code here
wait(dt)
Курс состоит из теоретического материала и заданий:
Оценка устойчивости системы управления Нечеткий логический контроллер
Список вопросов к экзамену (экзамен будет проходить в письменной форме):
Что такое передаточная функция системы? Охарактеризуйте её математическое определение, область применимости (линейные, стационарные, непрерывные системы) и связь с импульсной реакцией системы.
Как из линейного однородного дифференциального уравнения с постоянными коэффициентами выводится передаточная функция? Приведите общий алгоритм (применение преобразования Лапласа, учёт начальных условий) и объясните, почему передаточная функция – это отношение полинома выходных и входных переменных в s‑области.
Опишите структуру идеального PID‑регулятора в функциональной и операторной (s‑) форме. Запишите его способ вычисления и передаточную функцию, разложите её на отдельные составляющие (пропорциональную, интегральную, дифференциальную) и укажите смысл каждого члена.
В чём заключаются физический смысл и назначение коэффициентов Kₚ, Kᵢ, K𝑑 в PID‑регуляторе? Как каждый из параметров влияет на быстродействие, точность и стабильность регулируемой цепи?
Какие типы ошибок (стационарных, переходных) устраняет каждый из элементов PID‑регулятора (P, I, D)? Обоснуйте, почему, например, интегральный член обеспечивает нулевую установившуюся ошибку при определённом виде возмущения.
Почему в реальных PID‑регуляторах часто вводятся фильтры в дифференциальный член (например, K𝑑 s/(T_f s+1))? Объясните, как фильтрация влияет на шумоупругие свойства регулятора и на фазовый запас системы.
В каких случаях целесообразно использовать только PI‑регулятор, а в каких – только PD‑регулятор? Охарактеризуйте типы объектных систем (медленно реагирующие, с большим запаздыванием, с высоким уровнем шума), в которых предпочтительно использовать один из этих «упрощённых» вариантов.
Какова связь между передаточной функцией и импульсной (временной) реакцией системы? Опишите, как из F(s) получить h(t) (импульсный отклик) и почему импульсный отклик играет ключевую роль в анализе линейных систем.
Какие ограничения накладываются на коэффициенты PID‑регулятора в случае многократных интегрирующих звеньев в объекте управления (например, система второго порядка с интегратором)? Объясните, почему в таких системах часто требуется более сложный регуляторный алгоритм (например, LQR, H∞) или дополнительные компенсационные звенья.
Какие основные проблемы возникают при применении PID‑регуляторов к системам с большим запаздыванием (dead‑time) и как их решать? Обсудите методы, такие как добавление предвосхищения (feed‑forward), использование модели Паджета (Padé) для аппроксимации задержки, и применение более сложных регуляторов (e.g., Smith predictor).
Что произойдёт, если коэффициент дифференциальной составляющей Kd будет слишком большим?
Что такое перерегулирование в переходном процессе? Приведите примеры и способы решения проблемы.
Какое преимущество имеет ПИД-регулятор над П-регулятором? Опишите так же особенности систем, для которых применение П-регулятора более оправдано.
Что такое АЧХ и ФЧХ? Как они описывают поведение системы? Приведите примеры АЧХ и ФЧХ и систем, которым они соответствуют, охарактеризуйте эти системы.
Как импульсная и переходная функции описывают систему управления? Как, зная иимпульсную и/или переходную функцию системы, построить ее модель?
Posted on Sun 12 April 2026
In Общие вопросы.
tags: объявления бпм
Консультации/проставление зачетов
Read MorePosted on Sat 21 February 2026
tags: методы оптимизации мио
Методы оптимизации для группы БКБ24
Read MorePosted on Fri 13 February 2026
tags: методы оптимизации мио
Математические методы оптимизации систем для групп БПИ24, БИС24
Read MorePosted on Mon 09 February 2026
In Осн. цифр. обр-ки изображений.
tags: Основы цифровой обработки изображений бпм
Основы цифровой обработки изображений БПМ22-01 весна 2026
Read MorePosted on Fri 23 January 2026
In Архив.
tags: объявления бпм мпм мим мио миу мит
Консультации/проставление зачетов
Read MorePosted on Wed 21 January 2026
In Архив.
tags: объявления бпм мпм мим мио миу мит
Консультации/проставление зачетов
Read MorePosted on Wed 14 January 2026
In Архив.
tags: объявления бпм мпм мим мио миу мит
Консультации/проставление зачетов
Read MorePosted on Mon 12 January 2026
In Архив.
tags: объявления бпм мпм мим мио миу мит
Консультации/проставление зачетов
Read MorePosted on Sun 21 December 2025
In Архив.
tags: объявления мпм бпм мио мим миу
Консультации/проставление зачетов
Read MorePage 1 / 13 »