Alexander Sayapin Teacher's site

Теория управления для БПМ22-01 / весна 2026

Posted on Tue 21 April 2026

In Теория управления.

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)

Курс состоит из теоретического материала и заданий:

Оценка устойчивости системы управления Нечеткий логический контроллер

Список вопросов к экзамену (экзамен будет проходить в письменной форме):

  1. Что такое передаточная функция системы? Охарактеризуйте её математическое определение, область применимости (линейные, стационарные, непрерывные системы) и связь с импульсной реакцией системы.

  2. Как из линейного однородного дифференциального уравнения с постоянными коэффициентами выводится передаточная функция? Приведите общий алгоритм (применение преобразования Лапласа, учёт начальных условий) и объясните, почему передаточная функция – это отношение полинома выходных и входных переменных в s‑области.

  3. Опишите структуру идеального PID‑регулятора в функциональной и операторной (s‑) форме. Запишите его способ вычисления и передаточную функцию, разложите её на отдельные составляющие (пропорциональную, интегральную, дифференциальную) и укажите смысл каждого члена.

  4. В чём заключаются физический смысл и назначение коэффициентов Kₚ, Kᵢ, K𝑑 в PID‑регуляторе? Как каждый из параметров влияет на быстродействие, точность и стабильность регулируемой цепи?

  5. Какие типы ошибок (стационарных, переходных) устраняет каждый из элементов PID‑регулятора (P, I, D)? Обоснуйте, почему, например, интегральный член обеспечивает нулевую установившуюся ошибку при определённом виде возмущения.

  6. Почему в реальных PID‑регуляторах часто вводятся фильтры в дифференциальный член (например, K𝑑 s/(T_f s+1))? Объясните, как фильтрация влияет на шумоупругие свойства регулятора и на фазовый запас системы.

  7. В каких случаях целесообразно использовать только PI‑регулятор, а в каких – только PD‑регулятор? Охарактеризуйте типы объектных систем (медленно реагирующие, с большим запаздыванием, с высоким уровнем шума), в которых предпочтительно использовать один из этих «упрощённых» вариантов.

  8. Какова связь между передаточной функцией и импульсной (временной) реакцией системы? Опишите, как из F(s) получить h(t) (импульсный отклик) и почему импульсный отклик играет ключевую роль в анализе линейных систем.

  9. Какие ограничения накладываются на коэффициенты PID‑регулятора в случае многократных интегрирующих звеньев в объекте управления (например, система второго порядка с интегратором)? Объясните, почему в таких системах часто требуется более сложный регуляторный алгоритм (например, LQR, H∞) или дополнительные компенсационные звенья.

  10. Какие основные проблемы возникают при применении PID‑регуляторов к системам с большим запаздыванием (dead‑time) и как их решать? Обсудите методы, такие как добавление предвосхищения (feed‑forward), использование модели Паджета (Padé) для аппроксимации задержки, и применение более сложных регуляторов (e.g., Smith predictor).

  11. Что произойдёт, если коэффициент дифференциальной составляющей Kd будет слишком большим?

  12. Что такое перерегулирование в переходном процессе? Приведите примеры и способы решения проблемы.

  13. Какое преимущество имеет ПИД-регулятор над П-регулятором? Опишите так же особенности систем, для которых применение П-регулятора более оправдано.

  14. Что такое АЧХ и ФЧХ? Как они описывают поведение системы? Приведите примеры АЧХ и ФЧХ и систем, которым они соответствуют, охарактеризуйте эти системы.

  15. Как импульсная и переходная функции описывают систему управления? Как, зная иимпульсную и/или переходную функцию системы, построить ее модель?


Консультация/зачеты апрель 2026 БПМ22-01

Posted on Sun 12 April 2026

In Общие вопросы.

tags: объявления бпм


Консультации/проставление зачетов

Read More

Методы оптимизации для группы БКБ24

Posted on Sat 21 February 2026

In Методы оптимизации.

tags: методы оптимизации мио


Методы оптимизации для группы БКБ24

Read More

Методы оптимизации для групп БПИ24, БИС24

Posted on Fri 13 February 2026

In Методы оптимизации.

tags: методы оптимизации мио


Математические методы оптимизации систем для групп БПИ24, БИС24

Read More

Основы цифровой обработки изображений БПМ22-01 весна 2026

Posted on Mon 09 February 2026

In Осн. цифр. обр-ки изображений.

tags: Основы цифровой обработки изображений бпм


Основы цифровой обработки изображений БПМ22-01 весна 2026

Read More

Снова перенос консультации январь 2026

Posted on Fri 23 January 2026

In Архив.

tags: объявления бпм мпм мим мио миу мит


Консультации/проставление зачетов

Read More

Очередная консультация январь 2026

Posted on Wed 21 January 2026

In Архив.

tags: объявления бпм мпм мим мио миу мит


Консультации/проставление зачетов

Read More

Перенос консультации январь 2026

Posted on Wed 14 January 2026

In Архив.

tags: объявления бпм мпм мим мио миу мит


Консультации/проставление зачетов

Read More

Консультация/зачеты январь 2026

Posted on Mon 12 January 2026

In Архив.

tags: объявления бпм мпм мим мио миу мит


Консультации/проставление зачетов

Read More

Консультация/зачеты декабрь 2025

Posted on Sun 21 December 2025

In Архив.

tags: объявления мпм бпм мио мим миу


Консультации/проставление зачетов

Read More

Page 1 / 13 »

tags

алфавит (1) архитектура ЭВМ (5) asp.net (1) бгд (22) бисв (23) бкб (22) бме (22) бпэ (23) бпэз (4) бпэзу (1) бпм (34) бпм объявления (7) certbot (1) cheatsheet (1) checkinstall (1) csv (1) дискретная математика (25) экзамен (1) embedded rust (2) english (1) формальные грамматики (1) gdb (2) язык (1) исследование операций (1) jupyter (1) критерии (2) курсовая работа (2) lighttpd (2) low-latency (1) machine learning (3) make (1) make install (1) markdown (1) машинное обучение (1) математическая лингвистика (1) математическая логика (1) математическая статистика (3) Математические основы кмпьютерной графики (3) Математические основы компьютерного моделирования (1) Математические основы компьютерной графики (1) методы оптимизации (26) методы оптмимизации (1) методы принятия решений (1) миа (11) мии (8) мик (7) мим (19) мио (17) мип (9) мит (53) миу (24) миз (18) ml (1) mono (1) мпм (20) natural language processing (1) nlp (1) nucleo (2) объявления (41) оформление (2) openocd (2) openpgp (1) Основы цифровой обработки изображений (1) pandas (1) pgp (1) подтверждение вывода (1) programming (3) python (3) robot (1) robotics (2) setup (6) шпаргалка (1) системы компьютерной математики (1) smartcard (1) ssh (1) ssl (1) STM32 (2) streaming (1) строка (1) тб (21) teaching (1) teaching statement (1) Теоретические основы цифровой обработки изображений (2) Теория управления (2) тест (1) учебник (1) up board (1) video (1) вкр (2) xls (1)