10 класс
Компьютерное моделирование технических систем
Урок: Знакомство с платформой Engee

14. Знакомство с российской инженерной платформой Engee

📅 13.01 ⏱ 1 академический час (40 минут)

📋 План занятия

  1. 00:20 Введение в модельно-ориентированное проектирование
  2. 20:40 Обзор платформы Engee: возможности и интерфейс

🎯 Основной материал

Что такое Engee?

Engee — это российская инженерная платформа для разработки сложных технических систем с применением методологии модельно-ориентированного проектирования. Это единственная российская мультиязычная среда IDE для разработки инженерных скриптов, программ и приложений.

Ключевые возможности платформы:

  • Математические вычисления: Инженерные исследования, анализ данных, визуализация
  • Динамическое моделирование: Создание и отладка системных моделей с помощью блок-схем
  • 1D-моделирование: Физическое моделирование электроники, механики, гидравлики
  • Генерация кода: Автоматическая генерация читаемого Си-кода для встраиваемых систем
  • Полунатурное тестирование: Интеграция с аппаратными комплексами реального времени
Перейти на Engee →

Практическое задание на уроке:

Задача: Ознакомиться с веб-интерфейсом платформы Engee и ее основными возможностями

Цель: Понять структуру платформы, основные инструменты и принцип работы

Инструкция:

  1. Перейдите по ссылке start.engee.com
  2. Изучите разделы интерфейса: файловый браузер, командную строку, редактор скриптов
  3. Создайте простой математический скрипт (например, вычисление площади круга)
  4. Попробуйте построить график функции
Пример простого скрипта:
// Вычисление площади круга
radius = 5;
area = 3.14 * radius^2;
disp("Площадь круга: " + area);

📝 Домашнее задание

ДЗ #1 📅 Срок сдачи: 20 января 2025 🏆 Макс. балл: 5 баллов

Регистрация и первое знакомство с Engee

Цель задания: Получить практический доступ к платформе, изучить базовый функционал и создать первый проект

Что нужно сделать:

  1. Зарегистрироваться на платформе Engee по адресу start.engee.com

🔍 Дополнительно

❓ Частые вопросы по теме

Вопрос 1: Чем Engee отличается от MATLAB/Simulink?

Engee — это российский аналог с облачной архитектурой, не требующий установки. Поддерживает мультиязычность (Julia, Python, MATLAB-синтаксис, Fortran, C/C++), имеет богатую библиотеку российских компонентов и интеграцию с отечественными процессорами (Байкал, Эльбрус).

Вопрос 2: Нужно ли устанавливать Engee на компьютер?

Нет, Engee — это облачная платформа, которая работает прямо в браузере. Достаточно иметь доступ в интернет и зарегистрированный аккаунт.

Вопрос 3: Какие браузеры поддерживает Engee?

Engee поддерживает современные браузеры: Chrome, Firefox, Edge, Safari. Рекомендуется использовать последние версии.

Урок 15: Командная строка и редактор скриптов в Engee

Работа с командной строкой и редактором скриптов в Engee

📅 20.01 ⏱ 1 академический час (40 минут)

📋 План занятия

  1. 00:05 Организационный момент. Постановка целей урока
  2. 05:10 Работа с командной строкой: ввод команд, создание переменных
  3. 10:30 Практическая работа: выполнение упражнений из материалов
  4. 30:40 Подведение итогов. Домашнее задание

🎯 Практическая работа на уроке

Часть 1: Работа с командной строкой

На этом уроке вы будете выполнять задания из документа "01 - Окно команд.pdf":

Задачи для выполнения:

  1. Откройте командную строку в Engee (кнопка на левой панели)
  2. Выполните умножение чисел 3 и 5: 3*5
  3. Создайте переменную m и присвойте ей результат: m = 3*5
  4. Измените значение переменной: m = m + 1
  5. Создайте переменную y = m/2
  6. Создайте переменную с подавлением вывода: k = 8 - 2;
  7. Используйте стрелку вверх для повторения команд
  8. Создайте переменную A = -2 (обратите внимание на регистр)
  9. Вычислите среднее: meanAa = (a+A)/2
  10. Очистите командную строку: Ctrl+L
>> 3*5 15 >> m = 3*5 15 >> m = m + 1 16 >> y = m/2 8.0

Часть 2: Работа в редакторе скриптов

Теперь перейдите к выполнению заданий из документа "02 - Редактор скриптов.pdf":

Задачи для выполнения:

  1. Откройте редактор скриптов (кнопка на левой панели)
  2. Создайте новый скрипт с именем "Мой_первый_скрипт"
  3. В первой ячейке введите: r = 3
  4. Во второй ячейке вычислите площадь круга: x = pi*r^2
  5. Измените значение r = 0.5 и пересчитайте площадь
  6. Добавьте текстовую ячейку с заголовком "Расчет длины окружности"
  7. В следующей ячейке вычислите длину окружности: y = 2*pi*r
  8. Запустите все ячейки по очереди, наблюдая результаты под каждой
# Текстовая ячейка Расчет геометрических параметров круга # Кодовая ячейка 1 r = 3 # Кодовая ячейка 2 x = pi*r^2 # Кодовая ячейка 3 y = 2*pi*r

Дополнительные задания для быстрых учащихся:

  1. Создайте переменную с греческой буквой: введите \alpha и нажмите Tab
  2. Вычислите синус угла: sin(pi/4)
  3. Работайте с комплексными числами: sqrt(-9+0im)
  4. Сохраните переменные в файл (если успеете освоить JLD2)

📝 Домашнее задание

ДЗ #2 📅 Срок сдачи: 27 января 2026 🏆 Макс. балл: 5 баллов

Создание учебного скрипта в Engee

Цель задания: Закрепить навыки работы с переменными, операторами и редактором скриптов

Задание 1: Базовые вычисления

  1. Создайте новый скрипт с именем "Домашняя_работа_1"
  2. В первой текстовой ячейке напишите "Часть 1: Арифметические операции"
  3. Создайте переменные: a = 12, b = 7, c = 3.5
  4. Вычислите и выведите: сумму, разность, произведение и частное a и b
  5. Вычислите: (a + b) * c / 2

Задание 2: Работа с математическими функциями

  1. Добавьте текстовую ячейку "Часть 2: Математические функции"
  2. Вычислите квадратный корень из a: sqrt(a)
  3. Вычислите модуль разности: abs(a - 15)
  4. Вычислите синус угла 45 градусов (в радианах: pi/4)

Задание 3: Создание отчета

  1. Добавьте текстовую ячейку в конце скрипта с заголовком "Выводы"
  2. Напишите 2-3 предложения о том, что вы узнали на уроке
  3. Сохраните скрипт

Требования к сдаче:

  • Все ячейки должны быть выполнены (иметь вывод под собой)
  • Скрипт должен содержать как текстовые, так и кодовые ячейки

🔍 Полезная информация

❓ Частые ошибки начинающих

Забыли поставить точку с запятой для подавления вывода

Команда x = 5+1 покажет результат 6. Команда x = 5+1; выполнит вычисление, но не покажет результат.

Путаница с регистром переменных

В Julia a и A — разные переменные. Следите за регистром при создании и использовании переменных.

Не обновляются связанные переменные

Если вы изменили переменную m, то y = m/2 не обновится автоматически. Нужно выполнить команду заново.

📱 Горячие клавиши Engee

  • Enter — выполнить команду/ячейку
  • Ctrl+Enter — выполнить ячейку и перейти к следующей
  • / — навигация по истории команд
  • Ctrl+L — очистить командную строку
  • Tab — автодополнение (например, для греческих букв)
Урок 16: Векторы и матрицы. Основы работы с массивами

Занятие 16: Векторы и матрицы. Основы работы с массивами

📅 27 января 2026 ⏱ 1 академический час (40 минут) Занятие 16

📋 План занятия

  1. 00:05 Организационный момент. Цель урока: создание массивов для моделирования робота
  2. 05:15 Теория: что такое векторы и матрицы в Julia. Создание массивов вручную и через диапазоны
  3. 15:30 Практика: выполнение упражнений из блока "03 - Векторы и матрицы.pdf"
  4. 25:40 Применение: создание массивов данных для модели робота (шаги, скорости)
  5. 35:40 Итоги. Домашнее задание: создание массивов для моторов робота

🎯 Практическая работа на уроке

Часть 1: Теория векторов и матриц (по материалам PDF)

Сегодня изучаем блок "03 - Векторы и матрицы.pdf". Массивы - это коллекции чисел, которые позволяют работать с несколькими значениями одновременно. В моделировании робота массивы будут хранить:

  • Координаты положения робота
  • Скорости на разных участках траектории
  • Показания датчиков во времени
  • Управляющие сигналы для моторов

Задания из учебного блока "03 - Векторы и матрицы.pdf"

Задача 1: Создание простых переменных

  1. Создайте переменную x со значением 4: x = 4
  2. Создайте массив y с двумя элементами 7 и 9: y = [7 9]
  3. Создайте вектор z с элементами 7 и 9 через точку с запятой: z = [7; 9]
  4. Создайте вектор a с тремя числами: a = [3, 10, 5]

Задача 2: Создание матриц

  1. Создайте матрицу 2×3: b = [3 4 5; 6 7 8]
  2. Создайте матрицу из задачи 5 PDF: c = [5 6 7; 8 9 10]
  3. Попробуйте разные разделители: пробелы, запятые, точки с запятой
# Примеры создания массивов # Вектор-строка (1×n матрица) vec_row = [1 2 3 4 5] # Вектор-столбец (n×1 матрица) vec_col = [1; 2; 3; 4; 5] # Матрица 2×3 mat = [1 2 3; 4 5 6] # Массив с вычислениями внутри calc_array = [2+2, 3*3, sqrt(16)]

Часть 2: Создание данных для модели робота

Используем массивы для создания "цифрового двойника" - набора данных, описывающих поведение робота:

Создание базовых данных робота:

  1. Вектор времени (шагов симуляции): time_steps = [0, 1, 2, 3, 4, 5]
  2. Вектор скоростей робота: speed = [0.0, 0.5, 1.0, 1.0, 0.5, 0.0]
  3. Вектор номеров шагов через оператор диапазона: step_numbers = [1:6;]
  4. Проверьте созданные массивы командой display()
# Создание данных для модели робота time_steps = [0, 1, 2, 3, 4, 5] speed = [0.0, 0.5, 1.0, 1.0, 0.5, 0.0] # Альтернативный способ через диапазон step_numbers = [1:6;] # Обратите внимание на точку с запятой в конце! # Проверка println("Время шагов: ", time_steps) println("Скорости: ", speed) println("Номера шагов: ", step_numbers)

Задания с диапазонами (оператор :)

Оператор : создает диапазон чисел. Для преобразования в вектор нужно добавить точку с запятой внутри квадратных скобок.

Практические задания:

  1. Создайте диапазон от 1 до 10: 1:10
  2. Преобразуйте в вектор: [1:10;]
  3. Создайте диапазон с шагом 0.5: 1:0.5:5
  4. Преобразуйте в вектор: [1:0.5:5;]
  5. Создайте вектор от 3 до 13 с шагом 2: [3:2:13;]

📝 Домашнее задание

ДЗ #16 📅 Срок сдачи: 3 февраля 2026 🏆 Макс. балл: 5 баллов

Создание массивов данных для модели робота

Цель: Научиться создавать и использовать массивы для хранения данных о роботе.

Задание 1: Создание базовых массивов

  1. Создайте новый скрипт в Engee с именем "Занятие16_Массивы"
  2. В первой текстовой ячейке напишите "Создание данных для модели робота"
  3. Создайте вектор wheel_left из 6 элементов: [30, 35, 40, 40, 35, 30]
  4. Создайте вектор wheel_right с такими же значениями
  5. Создайте вектор step_numbers от 1 до 6 с помощью оператора :

Задание 2: Анализ созданных данных

  1. Выведите все три созданных массива на экран
  2. Определите размер каждого массива с помощью функции size()
  3. Выведите 3-й элемент каждого массива
  4. Создайте текстовую ячейку с объяснением: "Эти массивы будут хранить мощность моторов робота на каждом шаге симуляции"

Задание 3: Эксперименты с диапазонами

  1. Создайте диапазон от 0 до 10 с шагом 2
  2. Преобразуйте его в вектор
  3. Создайте вектор от 0.1 до 1.0 с шагом 0.1
  4. Объясните в текстовой ячейке, как эти диапазоны могут пригодиться в моделировании

Требования к сдаче:

  • Все ячейки должны быть выполнены (иметь вывод)
  • Скрипт должен содержать не менее 2 текстовых ячеек с комментариями
  • Должны быть созданы все указанные массивы

🔍 Полезная информация

❓ Частые ошибки с массивами

Разница между [1:5] и [1:5;]

[1:5] создает массив из одного элемента - диапазона. [1:5;] создает вектор из 5 чисел. Точка с запятой внутри скобок "раскрывает" диапазон.

Пробелы vs запятые в квадратных скобках

В Julia пробелы создают вектор-строку (матрицу 1×n), запятые или точки с запятой создают вектор-столбец. Для начала обучения это не критично, но важно знать.

Индексация начинается с 1

В отличие от многих языков программирования, в Julia индексы массивов начинаются с 1, а не с 0. arr[1] - первый элемент.

💡 Применение в проекте

Сегодня мы создали основу для модели робота:

  • time_steps - моменты времени симуляции
  • speed - скорость робота в каждый момент
  • wheel_left/right - мощность моторов

На следующих уроках мы научимся изменять эти массивы, анализировать их и визуализировать данные.

Урок 17: Индексы и модификация массивов

Занятие 17: Индексы и модификация массивов

📅 3 февраля 2026 ⏱ 1 академический час (40 минут) Занятие 17

📋 План занятия

  1. 00:05 Проверка ДЗ 16. Разбор ошибок с массивами
  2. 05:15 Теория: индексация массивов, срезы, ключевое слово end
  3. 15:30 Практика: выполнение упражнений из "04 - Индексы и модификация массивов.pdf"
  4. 25:40 Применение: изменение данных робота (мощности моторов, скорость)
  5. 35:40 Итоги. Домашнее задание: модификация данных для проекта

🎯 Практическая работа на уроке

Часть 1: Основы индексации массивов (по материалам PDF)

Изучаем блок "04 - Индексы и модификация массивов.pdf". Индексация - это механизм доступа к элементам массива по их положению (индексу). В Julia индексы начинаются с 1 (не с 0 как в некоторых языках).

# Основные правила индексации в Julia: # 1. Индексы начинаются с 1 # 2. arr[индекс] - доступ к элементу # 3. arr[начало:конец] - срез (диапазон) # 4. arr[end] - последний элемент # 5. arr[end-1] - предпоследний элемент

Задания из учебного блока "04 - Индексы и модификация массивов.pdf"

Задача 1: Базовое извлечение элементов

Используем массив data из PDF (представлен ниже):

# Создаем тестовую матрицу как в PDF data = [3.0 0.53 4.0753 3.517; 18.0 1.78 6.6678 2.1328; 19.0 0.86 1.5177 3.6852; 20.0 1.6 3.6375 8.5389; 21.0 3.0 4.7243 10.157; 23.0 6.11 9.0698 2.8739; 38.0 2.54 5.3002 4.4508]
  1. Извлеките элемент из 6-й строки, 3-го столбца: data[6, 3]
  2. Извлеките элемент из последней строки, 3-го столбца: data[end, 3]
  3. Извлеките элемент из предпоследней строки, 3-го столбца: data[end-1, 3]
  4. Извлеките весь 2-й столбец: data[:, 2]
  5. Извлеките последние два столбца: data[:, 3:4] или data[:, end-1:end]

Задача 2: Работа с векторами

  1. Создайте вектор: density = data[:, 2]
  2. Извлеките 6-й элемент: density[6]
  3. Извлеките элементы со 2-го по 5-й: density[2:5]
  4. Извлеките 1-й, 3-й и 6-й элементы: density[[1, 3, 6]]

Часть 2: Модификация данных робота

Используем массивы из прошлого урока и учимся их изменять:

Работа с массивами робота:

# Воссоздаем массивы из прошлого урока wheel_left = [30, 35, 40, 40, 35, 30] wheel_right = [30, 35, 40, 40, 35, 30] speed = [0.0, 0.5, 1.0, 1.0, 0.5, 0.0]
  1. Увеличьте мощность левого мотора на 2-м шаге на 5: wheel_left[2] = wheel_left[2] + 5
  2. Уменьшите скорость на последнем шаге: speed[end] = 0.2
  3. Измените мощность правого мотора на 4-м шаге: wheel_right[4] = 45
  4. Создайте срез первых трех значений скорости: first_three_speed = speed[1:3]
  5. Создайте массив только четных шагов (2,4,6): even_steps = speed[2:2:end]

Практика с ключевым словом end:

  1. Предпоследний элемент: wheel_left[end-1]
  2. Последние три элемента: speed[end-2:end]
  3. Все кроме первого: wheel_right[2:end]

Дополнительные задания (для быстрых учащихся)

Задание 1: Замена значений в матрице

# Создаем тестовую матрицу для робота robot_data = [1 2 3; 4 5 6; 7 8 9]
  1. Замените элемент в 1-й строке, 3-м столбце на 10: robot_data[1, 3] = 10
  2. Замените всю 2-ю строку: robot_data[2, :] = [10, 20, 30]
  3. Замените 3-й столбец на 100: robot_data[:, 3] .= 100

Задание 2: Копирование данных

  1. Скопируйте 2-й столбец в 1-й: robot_data[:, 1] = robot_data[:, 2]
  2. Создайте копию массива: robot_copy = copy(robot_data)

📝 Домашнее задание

ДЗ #17 📅 Срок сдачи: 10 февраля 2026 🏆 Макс. балл: 5 баллов

Модификация данных робота

Цель: Научиться извлекать и изменять элементы массивов для настройки модели робота.

Задание 1: Работа с массивами из прошлого ДЗ

  1. Откройте скрипт из ДЗ 16 или создайте новый "Занятие17_Индексация"
  2. Воссоздайте массивы: wheel_left, wheel_right, step_numbers
  3. Измените значения в массиве wheel_left:
    • Увеличьте значение на 2-м шаге на 5 единиц
    • Увеличьте значение на 4-м шаге на 5 единиц
    • Уменьшите значение на последнем шаге на 10 единиц

Задание 2: Создание новых массивов через срезы

  1. Создайте новый массив first_three_steps, содержащий только первые три элемента из wheel_left
  2. Создайте массив even_power, содержащий только элементы на четных позициях (2,4,6) из wheel_right
  3. Создайте массив odd_power, содержащий только элементы на нечетных позициях (1,3,5)

Задание 3: Анализ с использованием end

  1. Выведите последний элемент каждого созданного массива
  2. Выведите предпоследний элемент массива wheel_left
  3. Выведите последние два элемента массива wheel_right
  4. Создайте текстовую ячейку с объяснением: "Эти операции позволяют нам анализировать и корректировать поведение робота в конце траектории"

Требования к сдаче:

  • Все операции должны быть выполнены в скрипте Engee
  • Должны быть созданы все указанные массивы
  • Вывод результатов каждой операции должен быть виден
  • Добавьте минимум 2 текстовые ячейки с комментариями

🔍 Полезная информация

❓ Типичные ошибки при индексации

Индекс вне диапазона (BoundsError)

Если массив имеет 6 элементов, а вы пытаетесь обратиться к arr[7], получите ошибку. Всегда проверяйте размер массива: size(arr) или length(arr).

Забыли про end при работе с срезами

Для получения всех элементов кроме первого нужно arr[2:end], а не arr[2:] (это вызовет ошибку).

Путаница с индексацией матриц

Для матриц нужны два индекса: matrix[строка, столбец]. matrix[1] вернет первый элемент при линейной индексации (по столбцам).

💡 Применение в проекте робота

Сегодня мы научились:

  • Извлекать данные - получать мощность моторов на конкретном шаге
  • Изменять параметры - корректировать поведение робота
  • Работать со срезами - анализировать отдельные участки траектории

Это позволяет нам "настраивать" робота, изменяя его параметры в нужные моменты времени.

Урок 18: Векторы и матрицы. Основы работы с массивами

Занятие 18: Операции с массивами. Анализ данных

📅 10 февраля 2026 ⏱ 1 академический час (40 минут) Занятие 18

📋 План занятия

  1. 00:05 Проверка ДЗ 17. Разбор модификации массивов
  2. 05:15 Теория: поэлементные операции, функции sum, maximum, mean
  3. 15:30 Практика: выполнение упражнений из "05 - Операции с массивами.pdf"
  4. 25:40 Применение: анализ данных робота (средняя скорость, разница моторов)
  5. 35:40 Итоги. Домашнее задание: расчет статистики для проекта

🎯 Практическая работа на уроке

Часть 1: Поэлементные операции (по материалам PDF)

Изучаем блок "05 - Операции с массивами.pdf". В Julia есть два типа операций с массивами:

  • Поэлементные операции (с точкой): .+, .-, .*, ./ - применяются к каждому элементу
  • Матричные операции (без точки): * - матричное умножение
  • Скалярные операции: массив + число - операция применяется ко всем элементам

Задания из учебного блока "05 - Операции с массивами.pdf"

Задача 1: Базовые операции с массивами

# Создаем тестовые массивы x = [1, 2, 3] y = [4, 5, 6]
  1. Прибавьте 2 к каждому элементу x: x .+ 2 или x .+ 2
  2. Сложите массивы x и y: x + y (обычный + работает для сложения массивов одинакового размера)
  3. Умножьте каждый элемент x на 3: x * 3 или x .* 3
  4. Разделите каждый элемент y на 2: y / 2 или y ./ 2
  5. Поэлементное умножение x и y: x .* y

Задача 2: Статистические функции

using Statistics # Не забудьте подключить библиотеку!
  1. Найдите максимальное значение: maximum(x)
  2. Найдите минимальное значение: minimum(x)
  3. Найдите среднее значение: mean(x)
  4. Найдите сумму всех элементов: sum(x)
  5. Округлите элементы: round.(x)

Часть 2: Анализ данных робота

Применяем операции к данным нашего робота:

Анализ параметров движения:

# Воссоздаем данные робота wheel_left = [30, 35, 40, 40, 35, 30] wheel_right = [30, 35, 40, 40, 35, 30] speed = [0.0, 0.5, 1.0, 1.0, 0.5, 0.0]

Задание 1: Расчет разницы моторов

  1. Вычислите разницу мощностей: diff_power = wheel_right .- wheel_left
  2. Найдите максимальную разницу: maximum(abs.(diff_power))
  3. Определите, на каком шаге разница наибольшая

Задание 2: Расчет суммарных параметров

  1. Вычислите суммарную мощность: total_power = wheel_left .+ wheel_right
  2. Найдите среднюю мощность: mean(total_power)
  3. Найдите максимальную суммарную мощность

Задание 3: Анализ скорости

  1. Вычислите среднюю скорость: mean(speed)
  2. Найдите максимальную скорость: maximum(speed)
  3. Вычислите, сколько времени скорость была больше 0.7: sum(speed .> 0.7)

Дополнительные задания (для быстрых учащихся)

Задание 1: Комбинированные операции

# Данные сенсоров робота (0-белое, 1-черное) sensor_data = [0, 0, 1, 1, 1, 0]
  1. Создайте маску для черного: on_black = sensor_data .== 1
  2. Посчитайте время на черной линии: sum(on_black)
  3. Найдите индексы, где был черный: findall(on_black)

Задание 2: Нормализация данных

  1. Нормализуйте скорость к диапазону 0-1: normalized_speed = speed ./ maximum(speed)
  2. Масштабируйте мощность к диапазону 0-100

📝 Домашнее задание

ДЗ #18 📅 Срок сдачи: 17 февраля 2026 🏆 Макс. балл: 5 баллов

Анализ данных робота с помощью операций с массивами

Цель: Научиться анализировать данные робота с помощью статистических функций и поэлементных операций.

Задание 1: Расчет основных параметров

  1. Создайте новый скрипт "Занятие18_Операции" или продолжите предыдущий
  2. Воссоздайте массивы: wheel_left, wheel_right, speed
  3. Вычислите разницу мощностей моторов на каждом шаге: diff_power = wheel_right .- wheel_left
  4. Вычислите суммарную мощность моторов на каждом шаге: total_power = wheel_left .+ wheel_right
  5. Найдите максимальное значение в массиве total_power

Задание 2: Статистический анализ

  1. Вычислите среднюю скорость робота
  2. Найдите максимальную скорость и шаг, на котором она была достигнута
  3. Посчитайте, сколько шагов скорость была больше 0.5
  4. Вычислите среднюю суммарную мощность моторов

Задание 3: Анализ разницы моторов

  1. Найдите шаг, на котором была наибольшая разница между моторами
  2. Вычислите среднюю абсолютную разницу: mean(abs.(diff_power))
  3. Определите, на скольких шагах левый мотор был мощнее правого
  4. Создайте текстовую ячейку с выводом: "Анализ показывает, что наибольшая разница моторов была на шаге X, что может привести к повороту робота"

Требования к сдаче:

  • Используйте библиотеку Statistics (using Statistics)
  • Все расчеты должны быть выполнены в коде
  • Выведите результаты всех вычислений
  • Добавьте минимум 3 текстовые ячейки с комментариями к каждому блоку расчетов

🔍 Полезная информация

❓ Разница между .* и *

Поэлементное vs матричное умножение

.* умножает соответствующие элементы: [1,2] .* [3,4] = [3,8]. * пытается выполнить матричное умножение: [1,2] * [3,4] вызовет ошибку, так как размеры не подходят.

Когда точка не нужна

Для сложения/вычитания массивов одинакового размера точка не обязательна: + и - работают как поэлементные операции. Для умножения/деления точка обязательна.

Операции с скалярами

При операциях массива со скаляром точка не нужна: arr + 5 и arr .+ 5 дают одинаковый результат.

💡 Применение в проекте

Сегодня мы научились анализировать данные робота:

  • Сравнивать моторы - находить разницу, которая приводит к поворотам
  • Оценивать общую мощность - определять "силу" робота
  • Анализировать скорость - находить пики и средние значения

Это позволяет нам оценивать эффективность работы робота и находить проблемы в управлении.

Урок 19: Векторы и матрицы. Основы работы с массивами

Занятие 19: Построение графиков. Визуализация данных

📅 17 февраля 2026 ⏱ 1 академический час (40 минут) Занятие 19

📋 План занятия

  1. 00:05 Проверка ДЗ 18. Разбор статистического анализа
  2. 05:15 Теория: библиотека Plots, функция plot(), настройка графиков
  3. 15:30 Практика: выполнение упражнений из "07 - Построение графиков.pdf"
  4. 25:40 Применение: визуализация данных робота (график скорости, мощности)
  5. 35:40 Итоги. Домашнее задание: создание графиков для проекта

🎯 Практическая работа на уроке

Часть 1: Основы построения графиков (по материалам PDF)

Изучаем блок "07 - Построение графиков.pdf". Графики позволяют визуально анализировать данные. Основные функции:

using Plots # Подключаем библиотеку графиков gr() # Выбираем backend (можно также plotly(), pyplot())
  • plot(x, y) - график линии
  • scatter(x, y) - точечный график
  • bar(x, y) - столбчатая диаграмма
  • title!("Заголовок") - добавление заголовка
  • xlabel!("Ось X"), ylabel!("Ось Y") - подписи осей

Задания из учебного блока "07 - Построение графиков.pdf"

Задача 1: Базовые графики

# Подготовка данных x = 1:10 y = sin.(x)
  1. Постройте простой график: plot(x, y)
  2. Добавьте заголовок: title!("График синуса")
  3. Добавьте подписи осей: xlabel!("X"), ylabel!("sin(X)")
  4. Измените цвет линии: plot(x, y, color=:red) или plot(x, y, c=:red)
  5. Измените стиль линии: plot(x, y, linestyle=:dash)

Задача 2: Настройка маркеров

  1. Добавьте маркеры: plot(x, y, marker=:circle) или plot(x, y, m=:o)
  2. Измените размер маркеров: plot(x, y, markersize=10)
  3. Сделайте график без линии: plot(x, y, linealpha=0, marker=:circle)
  4. Используйте разные типы маркеров: :circle, :square, :xcross, :diamond

Задача 3: Несколько графиков на одном

y2 = cos.(x)
  1. Постройте два графика: plot(x, [y y2])
  2. Или используйте plot!: plot(x, y); plot!(x, y2)
  3. Разные цвета для линий: plot(x, [y y2], color=[:red :blue])
  4. Добавьте легенду: plot(x, [y y2], label=["sin" "cos"])

Часть 2: Визуализация данных робота

Строим графики для анализа поведения робота:

График 1: Изменение скорости робота

# Данные робота step_numbers = [1:6;] speed = [0.0, 0.5, 1.0, 1.0, 0.5, 0.0]
  1. Постройте график скорости: plot(step_numbers, speed)
  2. Добавьте заголовок: "Изменение скорости робота"
  3. Подпишите оси: "Шаг симуляции", "Скорость (м/с)"
  4. Добавьте маркеры: marker=:circle
  5. Сохраните график: savefig("robot_speed.png")

График 2: Мощность моторов

wheel_left = [30, 35, 40, 40, 35, 30] wheel_right = [30, 35, 40, 40, 35, 30]
  1. Постройте оба графика на одном: plot(step_numbers, [wheel_left wheel_right])
  2. Добавьте легенду: label=["Левый мотор" "Правый мотор"]
  3. Измените цвета: color=[:blue :red]
  4. Разные типы линий: linestyle=[:solid :dash]

График 3: Сравнение параметров

  1. Создайте график с двумя областями: plot(layout=(2,1))
  2. Верхний график - скорость, нижний - мощность
  3. Используйте plot! для добавления графиков в нужные области

Дополнительные задания (для быстрых учащихся)

Задание 1: Гистограмма

  1. Постройте гистограмму скорости: histogram(speed)
  2. Измените цвет столбцов: histogram(speed, color=:green)
  3. Добавьте заголовок: "Распределение скорости"

Задание 2: Настройка отображения

  1. Измените размер графика: plot(..., size=(800, 400))
  2. Добавьте сетку: plot(..., grid=true)
  3. Измените толщину линии: plot(..., linewidth=3)
  4. Сохраните в высоком разрешении: savefig(..., dpi=300)

📝 Домашнее задание

ДЗ #19 📅 Срок сдачи: 24 февраля 2026 🏆 Макс. балл: 5 баллов

Визуализация данных робота с помощью графиков

Цель: Научиться создавать информативные графики для анализа поведения робота.

Задание 1: Создание базовых графиков

  1. Создайте новый скрипт "Занятие19_Графики"
  2. Воссоздайте массивы: step_numbers, speed, wheel_left, wheel_right, total_power (из ДЗ 18)
  3. Постройте график зависимости скорости от номера шага
  4. Добавьте заголовок "Изменение скорости робота" и подписи осей
  5. Используйте синий цвет линии и круглые маркеры

Задание 2: График мощности моторов

  1. Постройте график, на котором одновременно отображены мощности левого и правого моторов
  2. Используйте разные цвета для моторов (например, синий для левого, красный для правого)
  3. Добавьте легенду с названиями "Левый мотор" и "Правый мотор"
  4. Добавьте заголовок "Мощность моторов робота"
  5. Сохраните график в файл: savefig("motor_power.png")

Задание 3: Комплексная визуализация

  1. Создайте график с двумя областями (subplot)
  2. В верхней области отобразите график скорости
  3. В нижней области отобразите график суммарной мощности моторов
  4. Добавьте общий заголовок "Анализ движения робота"
  5. Создайте текстовую ячейку с анализом: "График показывает, что когда скорость максимальна (шаг 3-4), суммарная мощность также максимальна"

Требования к сдаче:

  • Используйте библиотеку Plots (using Plots)
  • Все графики должны быть построены в скрипте
  • Графики должны иметь заголовки и подписи осей
  • Сохраните хотя бы один график в файл
  • Добавьте текстовые ячейки с комментариями к каждому графику

🔍 Полезная информация

❓ Частые проблемы с графиками

График не отображается

Убедитесь, что подключили библиотеку: using Plots. В Engee графики отображаются под ячейкой с кодом.

Неправильные размеры массивов

Для plot(x, y) массивы x и y должны быть одинаковой длины. Проверьте: length(x) == length(y).

Не сохраняется график

Функция savefig() сохраняет последний построенный график. Убедитесь, что график построен перед вызовом savefig.

💡 Применение в проекте

Визуализация позволяет:

  • Быстро оценить поведение - увидеть, как меняются параметры
  • Найти аномалии - резкие скачки или падения
  • Сравнить параметры - как связаны скорость и мощность
  • Создать отчеты - наглядные материалы для презентации

Графики - мощный инструмент анализа данных робота.

Урок 20: Векторы и матрицы. Основы работы с массивами

Занятие 20: Вызов функций. Анализ данных

📅 24 февраля 2026 ⏱ 1 академический час (40 минут) Занятие 20

📋 План занятия

  1. 00:05 Демонстрация лучших графиков из ДЗ 19
  2. 05:15 Теория: функции size(), findmax(), получение нескольких выходов
  3. 15:30 Практика: выполнение упражнений из "06 - Вызов функций.pdf"
  4. 25:40 Применение: анализ данных робота (поиск максимумов, размеры массивов)
  5. 35:40 Итоги. Домашнее задание: анализ ошибок следования

🎯 Практическая работа на уроке

Часть 1: Работа с функциями (по материалам PDF)

Изучаем блок "06 - Вызов функций.pdf". Функции в Julia могут возвращать одно или несколько значений. Важные функции для анализа данных:

using Statistics # Для функций mean, std и др.
  • size(arr) - размеры массива (для матриц возвращает (строки, столбцы))
  • length(arr) - общее количество элементов
  • findmax(arr) - максимальное значение и его индекс
  • findmin(arr) - минимальное значение и его индекс
  • findall(condition) - все индексы, где условие истинно
  • argmax(arr) - индекс максимального элемента
  • argmin(arr) - индекс минимального элемента

Задания из учебного блока "06 - Вызов функций.pdf"

Задача 1: Определение размеров данных

# Создаем тестовые данные data_matrix = [1 2 3; 4 5 6; 7 8 9] data_vector = [10, 20, 30, 40, 50]
  1. Узнайте размер матрицы: size(data_matrix)
  2. Узнайте длину вектора: length(data_vector)
  3. Получите отдельно количество строк и столбцов: (rows, cols) = size(data_matrix)
  4. Создайте переменные dr (rows) и dc (cols) с размерами

Задача 2: Поиск экстремумов

  1. Найдите максимальное значение в векторе: maximum(data_vector)
  2. Найдите максимальное значение и его индекс: (max_val, max_idx) = findmax(data_vector)
  3. Найдите минимальное значение и индекс: findmin(data_vector)
  4. Найдите только индекс максимума: argmax(data_vector)
  5. Найдите только индекс минимума: argmin(data_vector)

Задача 3: Работа с условиями

# Данные с условиями temperatures = [15.2, 18.5, 22.1, 19.8, 25.3, 17.6]
  1. Найдите все температуры выше 20: findall(temperatures .> 20)
  2. Найдите максимальную температуру выше 20: maximum(temperatures[temperatures .> 20])
  3. Подсчитайте сколько температур выше 20: sum(temperatures .> 20)

Часть 2: Анализ данных робота с помощью функций

Применяем функции для глубокого анализа данных робота:

Анализ 1: Основные характеристики

# Данные робота speed = [0.0, 0.5, 1.0, 1.0, 0.5, 0.0] wheel_left = [30, 35, 40, 40, 35, 30] wheel_right = [30, 35, 40, 40, 35, 30]
  1. Определите размер массива скорости: size(speed)
  2. Найдите максимальную скорость и шаг, когда она была: (max_speed, speed_step) = findmax(speed)
  3. Найдите минимальную скорость: minimum(speed)
  4. Определите, на скольких шагах скорость была больше 0.7

Анализ 2: Сравнение моторов

# Разница мощностей diff_power = wheel_right .- wheel_left
  1. Найдите максимальную разницу между моторами
  2. Определите, на каком шаге левый мотор был значительно мощнее правого
  3. Найдите шаг с наименьшей разницей (наиболее сбалансированная работа)
  4. Подсчитайте, на скольких шагах правый мотор был мощнее левого

Анализ 3: Комплексный анализ

  1. Создайте функцию, которая возвращает три значения: среднюю скорость, максимальную скорость и шаг максимума
  2. Используйте оператор ~ для игнорирования ненужных возвращаемых значений
  3. Например: (~, idx) = findmax(speed) - получаем только индекс

Дополнительные задания (для быстрых учащихся)

Задание 1: Анализ тенденций

# Данные с трендом trend_data = [1, 3, 2, 5, 4, 7, 6, 9, 8]
  1. Найдите локальные максимумы (элементы больше соседей)
  2. Определите, сколько раз данные росли (текущий > предыдущего)
  3. Найдите самую длинную возрастающую последовательность

Задание 2: Пользовательская функция анализа

  1. Напишите функцию analyze_robot(speed, power_left, power_right)
  2. Функция должна возвращать словарь или именованный кортеж с ключевыми метриками
  3. Включите: среднюю скорость, максимальную мощность, баланс моторов

📝 Домашнее задание

ДЗ #20 📅 Срок сдачи: 3 марта 2026 🏆 Макс. балл: 5 баллов

Глубокий анализ данных робота с помощью функций

Цель: Научиться использовать функции для комплексного анализа данных робота.

Задание 1: Анализ размеров и структуры данных

  1. Создайте новый скрипт "Занятие20_Функции"
  2. Воссоздайте все массивы робота: speed, wheel_left, wheel_right, diff_power, total_power
  3. Определите размер каждого массива с помощью size()
  4. Создайте переменные num_steps (количество шагов) и num_params (количество параметров)
  5. Выведите сводку: "Робот анализировался на X шагах по Y параметрам"

Задание 2: Поиск экстремальных значений

  1. Найдите максимальную и минимальную скорость, а также шаги, когда они были достигнуты
  2. Найдите шаг с наибольшей разницей между моторами (максимальное значение abs.(diff_power))
  3. Найдите шаг с наибольшей суммарной мощностью
  4. Определите, на каком шаге была самая сбалансированная работа моторов (минимальная абсолютная разница)

Задание 3: Комплексный анализ с несколькими возвращаемыми значениями

  1. Напишите код, который в одной строке получает из findmax(speed) только индекс максимальной скорости (используйте ~ для игнорирования значения)
  2. Создайте кортеж с основными характеристиками: (max_speed, min_speed, avg_speed) = (maximum(speed), minimum(speed), mean(speed))
  3. Напишите функцию get_robot_stats(), которая возвращает словарь со статистиками
  4. Создайте текстовую ячейку с выводом: "Анализ показывает, что максимальная скорость была достигнута на шаге X, когда разница моторов составляла Y"

Требования к сдаче:

  • Используйте функции findmax, findmin, argmax, argmin
  • Продемонстрируйте получение нескольких возвращаемых значений
  • Используйте оператор ~ для игнорирования значений
  • Создайте хотя бы одну пользовательскую функцию анализа
  • Добавьте текстовые ячейки с интерпретацией результатов

🔍 Полезная информация

❓ Особенности работы с функциями

findmax vs maximum

maximum(arr) возвращает только значение. findmax(arr) возвращает кортеж (значение, индекс). Для получения индекса используйте findmax.

size для векторов и матриц

Для вектора size(arr) вернет кортеж из одного элемента (n,). Для матрицы (rows, cols). Используйте length(arr) для общего количества элементов.

Игнорирование возвращаемых значений

Если функция возвращает несколько значений, но вам нужно не все, используйте ~: (~, idx) = findmax(arr) - получаем только индекс.

💡 Применение в проекте

Функции анализа позволяют:

  • Находить критические точки - когда скорость максимальна/минимальна
  • Анализировать баланс - насколько сбалансированно работают моторы
  • Определять структуру данных - сколько шагов, параметров
  • Автоматизировать анализ - создавать функции для регулярного использования

Это основа для создания интеллектуальной системы анализа данных робота.

Урок 21: Векторы и матрицы. Основы работы с массивами

Занятие 21: Бинарные массивы. Моделирование датчиков

📅 3 марта 2026 ⏱ 1 академический час (40 минут) Занятие 21

📋 План занятия

  1. 00:05 Проверка ДЗ 20. Разбор анализа с функциями
  2. 05:15 Теория: логические операторы, бинарные массивы, маски
  3. 15:30 Практика: выполнение упражнений из "09 - Бинарные массивы.pdf"
  4. 25:40 Применение: моделирование датчика линии робота (0-белое, 1-черное)
  5. 35:40 Итоги. Домашнее задание: анализ показаний датчика

🎯 Практическая работа на уроке

Часть 1: Логические операции и бинарные массивы (по материалам PDF)

Изучаем блок "09 - Бинарные массивы.pdf". Бинарные массивы содержат только значения true (1) и false (0). Они создаются с помощью операторов сравнения:

# Операторы сравнения (возвращают true/false) # .> - больше # .< - меньше # .>= - больше или равно # .<= - меньше или равно # .== - равно # .!= - не равно # Логические операторы (для комбинирования условий) # .& - И (and) # .| - ИЛИ (or) # .! - НЕ (not) или .~

Задания из учебного блока "09 - Бинарные массивы.pdf"

Задача 1: Создание бинарных массивов

# Тестовые данные temperatures = [15, 18, 22, 19, 25, 17]
  1. Создайте маску для температур выше 20: hot_days = temperatures .> 20
  2. Создайте маску для температур ниже 18: cold_days = temperatures .< 18
  3. Создайте маску для температур от 18 до 22: comfortable = (temperatures .>= 18) .& (temperatures .<= 22)
  4. Проверьте равенство: temperatures .== 22
  5. Проверьте неравенство: temperatures .!= 20

Задача 2: Использование масок для фильтрации

# Маска (бинарный массив) high_temp_mask = temperatures .> 20
  1. Примените маску для фильтрации: temperatures[high_temp_mask]
  2. Найдите индексы высоких температур: findall(high_temp_mask)
  3. Подсчитайте количество высоких температур: sum(high_temp_mask)
  4. Измените значения по маске: temperatures[high_temp_mask] .= 30

Задача 3: Комбинирование условий

  1. Температуры выше 20 И ниже 25: (temperatures .> 20) .& (temperatures .< 25)
  2. Температуры ниже 18 ИЛИ выше 22: (temperatures .< 18) .| (temperatures .> 22)
  3. НЕ высокие температуры: .(!(temperatures .> 20)) или temperatures .<= 20

Часть 2: Моделирование датчика линии робота

Создаем модель датчика следования за линией. В реальном роботе ИК-датчик возвращает 1, когда видит черную линию, и 0, когда видит белое поле.

Модель 1: Простой датчик

# Моделируем показания датчика на 10 шагах # 0 - белое поле, 1 - черная линия sensor_readings = [0, 0, 1, 1, 1, 0, 0, 1, 1, 0]
  1. Создайте маску для черной линии: on_black = sensor_readings .== 1
  2. Найдите шаги, когда робот был на линии: findall(on_black)
  3. Подсчитайте время на линии: sum(on_black)
  4. Найдите периоды непрерывного нахождения на линии

Модель 2: Анализ поведения

# Скорость робота в те же моменты времени speed = [0.5, 0.6, 0.4, 0.3, 0.5, 0.7, 0.8, 0.4, 0.3, 0.6]
  1. Найдите скорость, когда робот на черной линии: speed[on_black]
  2. Найдите скорость, когда робот на белом поле: speed[.!on_black]
  3. Сравните средние скорости: mean(speed[on_black]) vs mean(speed[.!on_black])
  4. Найдите моменты, когда скорость была высокой (>0.6) И робот был на линии

Модель 3: Коррекция данных

  1. Создайте маску для "проблемных" ситуаций (высокая скорость на линии)
  2. Измените скорость в проблемных ситуациях: speed[problem_mask] .= 0.3
  3. Создайте маску для "идеальных" ситуаций (умеренная скорость на линии)
  4. Проанализируйте результат коррекции

Дополнительные задания (для быстрых учащихся)

Задание 1: Анализ последовательностей

# Более сложные показания датчика complex_sensor = [0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1]
  1. Найдите начало и конец каждого периода на черной линии
  2. Определите длину самого длинного непрерывного периода на линии
  3. Найдите количество переходов с белого на черное

Задание 2: Модель с шумом

  1. Добавьте случайный шум к показаниям датчика
  2. Создайте фильтр для удаления одиночных выбросов (одиночные 0 среди 1 или наоборот)
  3. Сравните "чистые" и "зашумленные" данные

📝 Домашнее задание

ДЗ #21 📅 Срок сдачи: 10 марта 2026 🏆 Макс. балл: 5 баллов

Моделирование и анализ данных датчика линии

Цель: Научиться работать с бинарными массивами для моделирования датчиков робота.

Задание 1: Создание модели датчика

  1. Создайте новый скрипт "Занятие21_Датчики"
  2. Создайте массив sensor из 10 элементов, моделирующий показания датчика линии:
    • 0 - белое поле
    • 1 - черная линия
    • Например: [0, 0, 1, 1, 1, 0, 0, 1, 1, 0]
  3. Создайте маску on_black, которая равна true там, где датчик видит черную линию
  4. Создайте маску on_white для белого поля
  5. Выведите обе маски и объясните, что они означают

Задание 2: Анализ показаний датчика

  1. Используя маску on_black, определите на каких шагах робот был на черной линии
  2. Подсчитайте, сколько всего шагов робот был на линии
  3. Найдите самый длинный непрерывный участок на черной линии
  4. Определите, сколько раз робот терял линию (переход 1→0)
  5. Создайте массив speed и проанализируйте скорость на черной и белой поверхности

Задание 3: Сложные условия фильтрации

  1. Создайте маску для ситуаций, когда скорость больше 0.7
  2. Создайте комбинированную маску для ситуаций, когда робот на черной линии И скорость высокая
  3. Создайте маску для ситуаций, когда робот на белом поле ИЛИ скорость низкая (<0.3)
  4. Используя маски, отфильтруйте соответствующие значения скорости
  5. Создайте текстовую ячейку с анализом: "Робот проводит X% времени на линии. На линии его средняя скорость Y, вне линии - Z"

Требования к сдаче:

  • Используйте операторы сравнения с точкой: .==, .>, .<
  • Используйте логические операторы: .& (И), .| (ИЛИ)
  • Продемонстрируйте фильтрацию массивов с помощью масок
  • Используйте sum() для подсчета true значений
  • Используйте findall() для поиска индексов
  • Добавьте текстовые ячейки с анализом результатов

🔍 Полезная информация

❓ Особенности бинарных массивов

Точка в операторах сравнения

Для поэлементного сравнения массивов нужна точка: arr .> 5. Без точки arr > 5 попытается сравнить весь массив с числом, что не имеет смысла.

BitArray vs Array{Bool}

Бинарные массивы в Julia обычно имеют тип BitArray, который эффективно хранит true/false значения (1 бит на элемент вместо 8 байт).

Фильтрация vs индексация

arr[mask] возвращает элементы, где mask=true. arr[findall(mask)] делает то же самое, но через промежуточный шаг с индексами.

💡 Применение в проекте робота

Бинарные массивы позволяют:

  • Моделировать датчики - создавать виртуальные показания
  • Анализировать состояние - где робот, что он "видит"
  • Фильтровать данные - анализировать только определенные ситуации
  • Принимать решения - на основе условий (если на линии, то...)

Это основа для создания алгоритмов управления роботом.

Урок 22: Векторы и матрицы. Основы работы с массивами

Занятие 22: Программирование I. Условные операторы

📅 10 марта 2026 ⏱ 1 академический час (40 минут) Занятие 22

📋 План занятия

  1. 00:05 Проверка ДЗ 21. Разбор работы с датчиками
  2. 05:15 Теория: условный оператор if-elseif-else, логические условия
  3. 15:30 Практика: выполнение упражнений из "10 - Программирование.pdf" (часть 1)
  4. 25:40 Применение: простейший алгоритм для робота (если датчик видит черное → поворот)
  5. 35:40 Итоги. Домашнее задание: реализация логики принятия решений

🎯 Практическая работа на уроке

Часть 1: Условные операторы (по материалам PDF)

Изучаем первую часть блока "10 - Программирование.pdf". Условные операторы позволяют выполнять код только при определенных условиях. Структура:

# Базовая структура if-else if условие # код, выполняемый если условие истинно else # код, выполняемый если условие ложно end # Структура с несколькими условиями if условие1 # код для условия1 elseif условие2 # код для условия2 else # код, если ни одно условие не выполнено end

Задания из учебного блока "10 - Программирование.pdf"

Задача 1: Простые условия

# Тестовые переменные x = 5 y = 10
  1. Проверьте, равно ли x 5: if x == 5 println("x равно 5") end
  2. Проверьте, больше ли y чем x: if y > x println("y больше x") end
  3. Используйте if-else: если x четное, выведите "четное", иначе "нечетное"
  4. Проверьте несколько условий: если x < 5, если x == 5, если x > 5

Задача 2: Сложные условия

temperature = 22 is_raining = false
  1. Проверьте комбинированное условие: если температура > 20 И не идет дождь
  2. Используйте elseif: если температура < 10 - "холодно", 10-20 - "прохладно", 20-30 - "тепло", >30 - "жарко"
  3. Создайте переменную погоды на основе условий
  4. Используйте вложенные условия (if внутри if)

Задача 3: Практическое применение

# Данные о батарее робота battery_level = 75 # в процентах is_charging = false
  1. Если батарея < 20% и не заряжается - вывести предупреждение
  2. Если батарея > 80% и заряжается - вывести "почти заряжено"
  3. Создайте систему оповещений о состоянии батареи

Часть 2: Алгоритм управления роботом

Создаем простейший алгоритм следования за линией на основе показаний датчика:

Алгоритм 1: Бинарное управление

# Показание датчика в текущий момент sensor_value = 1 # 0 - белое, 1 - черное base_power = 30 # Базовая мощность моторов
  1. Создайте переменную turn_power (мощность поворота)
  2. Если датчик видит черное (1) - поворачиваем влево: turn_power = 10
  3. Если датчик видит белое (0) - поворачиваем вправо: turn_power = -5
  4. Рассчитайте мощности моторов:
    left_power = base_power + turn_power right_power = base_power - turn_power
  5. Выведите результат: "Левый мотор: X, Правый мотор: Y"

Алгоритм 2: Учет скорости

current_speed = 0.7 max_safe_speed = 1.0
  1. Если скорость близка к максимальной - уменьшить базовую мощность
  2. Если скорость очень низкая - увеличить базовую мощность
  3. Создайте адаптивную систему, которая регулирует мощность в зависимости от скорости
  4. Добавьте проверку на критически низкую скорость

Алгоритм 3: Комбинированные условия

  1. Если робот на линии И скорость нормальная - двигаться прямо
  2. Если робот на линии И скорость высокая - немного уменьшить мощность
  3. Если робот не на линии - активно искать линию
  4. Если робот не на линии долгое время - остановиться

Дополнительные задания (для быстрых учащихся)

Задание 1: Система приоритетов

# Множественные условия battery_critical = false sensor_error = false obstacle_detected = true
  1. Создайте систему приоритетов: безопасность > заряд батареи > выполнение задачи
  2. Реализуйте логику: если препятствие - остановиться, иначе если батарея критическая - идти на зарядку, иначе следовать за линией
  3. Добавьте обработку ошибок датчика

Задание 2: Калькулятор поворота

  1. Напишите функцию, которая принимает показание датчика и текущую скорость
  2. Функция должна возвращать мощности для левого и правого моторов
  3. Добавьте разные режимы: осторожный, нормальный, агрессивный
  4. Протестируйте функцию на разных входных данных

📝 Домашнее задание

ДЗ #22 📅 Срок сдачи: 17 марта 2026 🏆 Макс. балл: 5 баллов

Реализация алгоритма управления роботом

Цель: Научиться создавать алгоритмы принятия решений для управления роботом.

Задание 1: Базовый алгоритм следования за линией

  1. Создайте новый скрипт "Занятие22_Алгоритм"
  2. Создайте переменные:
    • sensor_value - текущее показание датчика (0 или 1)
    • base_power = 30 - базовая мощность моторов
    • current_speed - текущая скорость робота
  3. Реализуйте алгоритм:
    if sensor_value == 1 # Робот на черной линии turn_power = 10 # Поворачиваем влево println("На линии -> поворот влево") else # Робот на белом поле turn_power = -5 # Поворачиваем вправо println("Вне линии -> поворот вправо") end
  4. Рассчитайте и выведите конечные мощности моторов

Задание 2: Учет скорости в алгоритме

  1. Добавьте проверку скорости в алгоритм:
    • Если скорость < 0.3 - увеличить базовую мощность на 10
    • Если скорость > 0.8 - уменьшить базовую мощность на 10
    • Иначе - использовать стандартную мощность
  2. Используйте конструкцию if-elseif-else для реализации
  3. Протестируйте алгоритм с разными значениями скорости (0.2, 0.5, 0.9)
  4. Выведите для каждого теста: начальные условия и результирующие мощности

Задание 3: Комплексная система управления

  1. Создайте систему, которая учитывает одновременно:
    • Показание датчика (на линии/вне линии)
    • Текущую скорость (низкая/нормальная/высокая)
    • Время нахождения вне линии (если долго вне линии - экстренный поворот)
  2. Используйте вложенные условия (if внутри if)
  3. Добавьте переменную time_off_track и логику ее обработки
  4. Создайте текстовую ячейку с описанием алгоритма: "Мой алгоритм сначала проверяет X, затем Y, и в зависимости от Z делает W"

Требования к сдаче:

  • Используйте все три формы: if, if-else, if-elseif-else
  • Продемонстрируйте вложенные условия
  • Протестируйте алгоритм минимум с 3 разными наборами входных данных
  • Выводите понятные сообщения о принимаемых решениях
  • Добавьте текстовые ячейки с объяснением логики

🔍 Полезная информация

❓ Частые ошибки с условиями

= vs ==

= - оператор присваивания. == - оператор сравнения. В условиях нужно использовать ==: if x == 5.

Забытый end

Каждый if должен заканчиваться end. Если забыть end, Julia будет ждать продолжения и выдаст ошибку.

Сложные условия без скобок

При комбинировании условий используйте скобки для ясности: (x > 5) && (y < 10) вместо x > 5 && y < 10.

💡 Применение в проекте робота

Условные операторы - основа интеллекта робота:

  • Принятие решений - что делать в текущей ситуации
  • Обработка сенсоров - как реагировать на показания датчиков
  • Управление моторами - какую мощность подавать
  • Обработка ошибок - что делать при проблемах

Без условий робот был бы просто набором заранее заданных команд.

Урок 23: Векторы и матрицы. Основы работы с массивами

Занятие 23: Программирование II. Циклы

📅 17 марта 2026 ⏱ 1 академический час (40 минут) Занятие 23

📋 План занятия

  1. 00:05 Проверка ДЗ 22. Разбор алгоритмов управления
  2. 05:15 Теория: цикл for, итерация по диапазонам и массивам
  3. 15:30 Практика: выполнение упражнений из "10 - Программирование.pdf" (часть 2)
  4. 25:40 Применение: создание прототипа симулятора робота (цикл по шагам)
  5. 35:40 Итоги. Домашнее задание: автоматизация расчета

🎯 Практическая работа на уроке

Часть 1: Циклы for (по материалам PDF)

Изучаем вторую часть блока "10 - Программирование.pdf". Циклы позволяют выполнять один и тот же код много раз. В Julia основной цикл - for:

# Базовая структура цикла for for переменная in диапазон # код, выполняемый на каждой итерации end # Итерация по диапазону for i in 1:5 println("Шаг ", i) end # Итерация по массиву for value in [10, 20, 30, 40] println("Значение: ", value) end

Задания из учебного блока "10 - Программирование.pdf"

Задача 1: Простые циклы

  1. Выведите числа от 1 до 10: for i in 1:10 println(i) end
  2. Выведите квадраты чисел от 1 до 5: for x in 1:5 println(x^2) end
  3. Выведите только четные числа от 2 до 10: for i in 2:2:10 println(i) end
  4. Итерация в обратном порядке: for i in 5:-1:1 println(i) end

Задача 2: Накопление результатов

# Сумма чисел total = 0 for i in 1:10 total = total + i end println("Сумма: ", total)
  1. Вычислите сумму чисел от 1 до 100
  2. Вычислите произведение чисел от 1 до 5 (факториал 5)
  3. Создайте массив квадратов чисел от 1 до 10
  4. Найдите максимальное число в массиве с помощью цикла (без функции maximum)

Задача 3: Вложенные циклы

# Таблица умножения for i in 1:5 for j in 1:5 print(i*j, " ") end println() # переход на новую строку end
  1. Создайте таблицу умножения 10×10
  2. Выведите треугольник из звездочек с помощью вложенных циклов
  3. Создайте матрицу, где каждый элемент равен сумме его индексов

Часть 2: Создание симулятора робота

Используем циклы для моделирования движения робота шаг за шагом:

Симулятор 1: Простая симуляция

# Данные для симуляции sensor_data = [0, 0, 1, 1, 1, 0] # Показания датчика base_power = 30 # Базовая мощность
  1. Создайте массивы для хранения истории:
    left_history = zeros(6) # История мощности левого мотора right_history = zeros(6) # История мощности правого мотора turn_history = zeros(6) # История поворотов
  2. Напишите цикл, который для каждого шага:
    • Получает показание датчика
    • Применяет алгоритм из прошлого урока
    • Рассчитывает мощности моторов
    • Сохраняет результаты в массивы истории
  3. Выведите итоговые массивы

Симулятор 2: С учетом скорости

# Добавляем скорость initial_speed = 0.0 speed_history = zeros(6)
  1. Расширьте симулятор: на каждом шаге рассчитывайте скорость на основе мощности
  2. Используйте упрощенную формулу: speed = mean_power / 100
  3. Корректируйте мощность в зависимости от скорости (как в прошлом уроке)
  4. Сохраняйте историю скорости

Симулятор 3: Визуализация процесса

  1. Внутри цикла выводите информацию о каждом шаге:
    println("Шаг ", step, ": датчик=", sensor, " L=", left_power, " R=", right_power, " скорость=", round(current_speed, digits=2))
  2. В конце постройте графики истории мощности и скорости
  3. Проанализируйте, как менялось поведение робота

Дополнительные задания (для быстрых учащихся)

Задание 1: Усложненная симуляция

  1. Добавьте случайные помехи в показания датчика
  2. Реализуйте адаптивный алгоритм, который учится на ошибках
  3. Добавьте ограничение по энергии (батарея разряжается)

Задание 2: Анализ эффективности

  1. После симуляции вычислите метрики:
    • Среднее отклонение от линии
    • Эффективность использования энергии
    • Плавность движения
  2. Сравните разные алгоритмы управления
  3. Найдите оптимальные параметры

📝 Домашнее задание

ДЗ #23 📅 Срок сдачи: 24 марта 2026 🏆 Макс. балл: 5 баллов

Создание прототипа симулятора робота с использованием циклов

Цель: Научиться использовать циклы для автоматизации расчетов и создания симуляторов.

Задание 1: Базовый симулятор

  1. Создайте новый скрипт "Занятие23_Симулятор"
  2. Создайте массив показаний датчика: sensor = [0, 0, 1, 1, 0, 0]
  3. Создайте массивы для хранения истории:
    • turn_history - история значений поворота
    • left_history - история мощности левого мотора
    • right_history - история мощности правого мотора
  4. Напишите цикл for, который проходит по всем элементам массива sensor
  5. Внутри цикла используйте алгоритм из ДЗ 22 для расчета turn_power
  6. Сохраняйте результаты в массивы истории

Задание 2: Расширенная симуляция

  1. Добавьте в симулятор учет скорости:
    • Создайте массив speed_history
    • Начальная скорость = 0.0
    • На каждом шаге рассчитывайте скорость как среднее мощностей моторов, деленное на 100
    • Корректируйте базовую мощность в зависимости от скорости (как в ДЗ 22)
  2. Добавьте вывод информации на каждом шаге:
    println("Шаг ", i, ": датчик=", sensor[i], " поворот=", turn_history[i], " скорость=", round(speed_history[i], digits=2))
  3. После цикла выведите все массивы истории

Задание 3: Анализ результатов

  1. После завершения симуляции вычислите:
    • Среднюю скорость робота
    • Общее время на черной линии
    • Среднюю разницу между моторами
    • Максимальную достигнутую скорость
  2. Постройте графики:
    • График изменения скорости
    • График мощностей левого и правого моторов
    • График значений поворота
  3. Создайте текстовую ячейку с анализом: "Симуляция показала, что робот проводит X% времени на линии. Наибольшая скорость была достигнута на шаге Y, когда показания датчика были Z"

Требования к сдаче:

  • Используйте цикл for для итерации по массиву
  • Сохраняйте историю в массивах
  • Выводите информацию на каждом шаге (или через несколько шагов)
  • После цикла анализируйте результаты
  • Создайте хотя бы один график с результатами симуляции
  • Добавьте текстовые ячейки с описанием симуляции и анализом результатов

🔍 Полезная информация

❓ Особенности циклов в Julia

Индексация в циклах

Для доступа к индексу и значению используйте: for (i, val) in enumerate(arr) или for i in 1:length(arr) и тогда arr[i].

Изменение массивов в циклах

Массивы можно изменять внутри цикла: arr[i] = новое_значение. Убедитесь, что индекс в допустимом диапазоне.

Прерывание цикла

Для досрочного выхода из цикла используйте break. Для перехода к следующей итерации - continue.

💡 Применение в проекте робота

Циклы позволяют:

  • Моделировать поведение во времени - шаг за шагом
  • Автоматизировать расчеты - для множества условий
  • Собирать статистику - накапливать данные
  • Тестировать алгоритмы - на разных наборах данных

Цикл - это "двигатель" симуляции, который заставляет время идти и робота двигаться.

Урок 24: Векторы и матрицы. Основы работы с массивами

Занятие 24: Физика движения. От мощности к координатам

📅 24 марта 2026 ⏱ 1 академический час (40 минут) Занятие 24

📋 План занятия

  1. 00:05 Анализ ДЗ 23. Разбор симуляторов
  2. 05:15 Теория: основы кинематики, связь скорости и координаты
  3. 15:30 Применение: улучшение симулятора - добавление расчета позиции
  4. 25:40 Практика: расчет траектории робота по мощности моторов
  5. 35:40 Итоги. Домашнее задание: финальная подготовка к интеграции

🎯 Практическая работа на уроке

Часть 1: Основы кинематики для моделирования

Чтобы симуляция была реалистичной, нужно связать мощность моторов с движением робота. Используем упрощенную модель:

# Основные понятия: # v - скорость (м/с) # x - координата (м) # t - время (с) # dt - шаг времени (интервал между расчетами) # Уравнение движения (равномерное): # Новая_координата = Старая_координата + Скорость * Время # В дискретной форме (для симуляции): x_new = x_old + v * dt # Связь мощности моторов и скорости (упрощенно): # Скорость пропорциональна средней мощности моторов v = (power_left + power_right) / k # где k - коэффициент, зависящий от массы, трения и т.д.

Практика: Расчет движения по заданной скорости

Задача 1: Равномерное движение

# Параметры dt = 1.0 # Шаг времени (1 секунда) v = 0.5 # Постоянная скорость (0.5 м/с) x = 0.0 # Начальная позиция time_steps = 6
  1. Создайте массив для хранения позиций: x_positions = zeros(time_steps)
  2. Напишите цикл, который рассчитывает позицию на каждом шаге
  3. Используйте формулу: x = x + v * dt
  4. Сохраняйте каждое значение x в массив
  5. Выведите итоговый массив позиций
  6. Постройте график x от времени

Задача 2: Движение с переменной скоростью

# Скорость меняется со временем speeds = [0.0, 0.5, 1.0, 1.0, 0.5, 0.0]
  1. Используйте массив speeds вместо постоянной скорости
  2. В цикле берите скорость для текущего шага: v = speeds[i]
  3. Рассчитайте позицию на каждом шаге
  4. Сравните с равномерным движением
  5. Проанализируйте, как изменение скорости влияет на пройденный путь

Задача 3: Движение в 2D

# Добавляем координату Y x = 0.0 y = 0.0 vx = 0.3 # Скорость по X vy = 0.4 # Скорость по Y
  1. Расширьте модель для двух координат
  2. Создайте массивы x_positions и y_positions
  3. Рассчитайте траекторию за 10 шагов
  4. Постройте график траектории в координатах (x, y)
  5. Вычислите общее пройденное расстояние

Часть 2: Интеграция физики в симулятор робота

Объединяем все компоненты: датчики, алгоритм управления, мощность моторов и физику движения:

Полный симулятор робота

# Исходные данные sensor_data = [0, 0, 1, 1, 1, 0] # Показания датчика base_power = 30 # Базовая мощность dt = 1.0 # Шаг времени

Шаг 1: Инициализация массивов

# Массивы для истории num_steps = length(sensor_data) left_history = zeros(num_steps) right_history = zeros(num_steps) speed_history = zeros(num_steps) x_positions = zeros(num_steps) y_positions = zeros(num_steps) # Начальные условия x = 0.0 y = 0.0 current_speed = 0.0

Шаг 2: Основной цикл симуляции

  1. Для каждого шага i от 1 до num_steps:
  2. Получите показание датчика: sensor = sensor_data[i]
  3. Примените алгоритм управления (из ДЗ 22) для расчета turn_power
  4. Рассчитайте мощности моторов: left = base_power + turn_power, right = base_power - turn_power
  5. Сохраните мощности в историю
  6. Рассчитайте скорость: current_speed = (left + right) / 200 (упрощенная формула)
  7. Сохраните скорость в историю
  8. Обновите координаты: x = x + current_speed * dt (пока только по X)
  9. Сохраните координаты в историю
  10. Выведите информацию о текущем шаге

Шаг 3: Анализ результатов

  1. После цикла выведите все массивы истории
  2. Постройте графики:
    • Траектория движения (x от шага)
    • Скорость от времени
    • Мощности моторов
  3. Проанализируйте результаты:
    • Как далеко уехал робот?
    • Когда скорость была максимальна?
    • Как повороты влияли на движение?

Дополнительные задания (для быстрых учащихся)

Задание 1: Модель с углом поворота

# Добавляем угол поворота theta = 0.0 # Начальный угол (радианы) # При повороте меняется направление скорости vx = current_speed * cos(theta) vy = current_speed * sin(theta)
  1. Расширьте модель для учета направления движения
  2. Рассчитайте, как разница мощностей моторов влияет на угол поворота
  3. Смоделируйте движение по кругу

Задание 2: Учет инерции

  1. Добавьте инерцию: скорость не может мгновенно измениться
  2. Используйте формулу: v_new = v_old + a * dt, где a - ускорение
  3. Ускорение зависит от разницы между текущей и целевой скоростью
  4. Сравните модели с инерцией и без

📝 Домашнее задание

ДЗ #24 📅 Срок сдачи: 31 марта 2026 🏆 Макс. балл: 5 баллов

Создание физической модели движения робота

Цель: Научиться рассчитывать траекторию движения робота на основе мощности моторов.

Задание 1: Расчет движения по прямой

  1. Создайте новый скрипт "Занятие24_Физика" или продолжите предыдущий
  2. Задайте массивы мощностей моторов (из прошлых ДЗ или создайте новые):
    left_power = [30, 30, 40, 40, 30, 30] right_power = [30, 30, 20, 20, 30, 30]
  3. Рассчитайте скорость на каждом шаге: speed = (left_power[i] + right_power[i]) / 100
  4. Рассчитайте позицию робота вдоль оси X:
    • Начальная позиция: x = 0.0
    • Шаг времени: dt = 1.0
    • Формула: x = x + speed * dt
  5. Сохраняйте позицию в массив x_positions
  6. Выведите итоговую траекторию

Задание 2: Анализ влияния разницы моторов

  1. Проанализируйте, как разница мощностей моторов влияет на движение:
    • Если мощности равны - движение по прямой
    • Если правый мотор мощнее - поворот влево
    • Если левый мотор мощнее - поворот вправо
  2. Создайте три разных сценария с разными соотношениями мощностей
  3. Для каждого сценария рассчитайте траекторию
  4. Постройте графики всех трех траекторий на одном рисунке
  5. Объясните в текстовой ячейке, почему траектории разные

Задание 3: Интеграция с алгоритмом управления

  1. Объедините физическую модель с алгоритмом управления из ДЗ 22-23
  2. Создайте полный цикл симуляции:
    • Входные данные: показания датчика
    • Алгоритм: рассчитывает мощности моторов
    • Физика: рассчитывает скорость и позицию
    • Выход: траектория движения
  3. Протестируйте на разных наборах данных датчика
  4. Постройте финальную траекторию
  5. Создайте текстовую ячейку с выводом: "Моя модель показывает, что при данных показаниях датчика робот проезжает X метров, максимально отклоняясь на Y метров от прямой"

Требования к сдаче:

  • Реализуйте расчет позиции по скорости
  • Проанализируйте минимум 3 разных сценария движения
  • Постройте графики траекторий
  • Интегрируйте физику с алгоритмом управления
  • Продемонстрируйте полный цикл симуляции
  • Добавьте текстовые ячейки с анализом физических принципов

🔍 Полезная информация

❓ Упрощения в физической модели

Идеальная поверхность

Мы предполагаем, что нет трения, поверхность идеально ровная. В реальности трение замедляет робота и влияет на повороты.

Мгновенный отклик

В нашей модели скорость мгновенно меняется с изменением мощности. В реальности есть инерция - робот не может мгновенно разогнаться или остановиться.

Линейная зависимость

Мы используем линейную зависимость скорости от мощности. В реальности зависимость может быть более сложной, особенно на высоких скоростях.

💡 Дальнейшее развитие модели

Для более реалистичной симуляции можно добавить:

  • Трение - сила, замедляющая движение
  • Инерцию - сопротивление изменению скорости
  • Массу - чем тяжелее робот, тем сложнее его разогнать
  • Проскальзывание - колеса могут буксовать
  • Неровности поверхности - влияют на движение

Наша модель - хорошее начало для понимания основных принципов.

Урок 25: Эксперимент 1 - Влияние базовой мощности на движение робота

Урок 25: Эксперимент 1 - Влияние базовой мощности на движение робота

📅 31 марта 2026 ⏱ 1 академический час (40 минут) Занятие 25

📋 План занятия

  1. 00:05 Что исследуем и почему компьютерное моделирование выгоднее
  2. 05:15 Запуск базовой симуляции робота (повторение)
  3. 10:25 Эксперимент: изменение базовой мощности (3-5 вариантов)
  4. 25:35 Сбор и анализ результатов. Выводы
  5. 35:40 Домашнее задание: расширенный эксперимент

🔬 Что мы исследуем сегодня?

🎯 Цель эксперимента

Исследуем: Как изменение базовой мощности (base_power) влияет на скорость, пройденное расстояние и устойчивость робота при следовании по линии.

💡 Почему компьютерное моделирование выгоднее реальных экспериментов?

  • ⚡ Скорость: За 5 минут можно протестировать 10-20 вариантов параметров. В реальности на один тест уходит 5-10 минут с учётом перезарядки и перенастройки.
  • 💰 Экономия: Нет риска сломать робота при агрессивных настройках. Можно тестировать экстремальные значения.
  • 📊 Полнота данных: Симуляция автоматически записывает все параметры (скорость, позицию, мощность) на каждом шаге.
  • 🔄 Повторяемость: Один и тот же эксперимент можно повторить с точностью до миллиметра. В реальности условия меняются (заряд батареи, освещение, неровности пола).
  • 📈 Визуализация: Мгновенное построение графиков и сравнение результатов.

📝 Базовый код симуляции робота

using Plots, Statistics # Функция симуляции робота function run_robot_simulation(sensor_data, base_power, turn_left, turn_right, dt=1.0) num_steps = length(sensor_data) x_positions = zeros(num_steps) speed_history = zeros(num_steps) left_history = zeros(num_steps) right_history = zeros(num_steps) x = 0.0 for i in 1:num_steps sensor = sensor_data[i] # Алгоритм управления if sensor == 1 turn_power = turn_left else turn_power = turn_right end left_power = base_power + turn_power right_power = base_power - turn_power # Ограничение мощности left_power = max(0, left_power) right_power = max(0, right_power) left_history[i] = left_power right_history[i] = right_power # Скорость current_speed = (left_power + right_power) / 200 speed_history[i] = current_speed # Движение x = x + current_speed * dt x_positions[i] = x end return x_positions, speed_history, left_history, right_history end # Данные трассы (0-белое, 1-черное) sensor_data = [0, 0, 1, 1, 1, 0, 0, 1, 1, 0] println("Симулятор робота загружен!") println("Длина трассы: ", length(sensor_data), " шагов")

🧪 Эксперимент: Меняем базовую мощность

# Параметры эксперимента turn_left = 10 # Поворот на линии (влево) turn_right = -5 # Поворот вне линии (вправо) dt = 1.0 # Тестируем разные значения базовой мощности base_powers = [20, 30, 40, 50, 60] results = [] println("="^50) println("ЗАПУСК ЭКСПЕРИМЕНТА") println("="^50) for bp in base_powers println("\n🔧 Тестируем base_power = $bp") println("-"^30) x_pos, speeds, left, right = run_robot_simulation(sensor_data, bp, turn_left, turn_right, dt) final_x = x_pos[end] max_speed = maximum(speeds) avg_speed = mean(speeds) total_energy = sum(left .+ right) push!(results, (bp, final_x, max_speed, avg_speed, total_energy, x_pos, speeds)) println(" Пройденный путь: $(round(final_x, digits=2)) м") println(" Макс. скорость: $(round(max_speed, digits=2)) м/с") println(" Сред. скорость: $(round(avg_speed, digits=2)) м/с") println(" Затрачено энергии: $(round(total_energy))") end println("\n" * "="^50) println("СВОДНАЯ ТАБЛИЦА РЕЗУЛЬТАТОВ") println("="^50) println("base_power | Путь (м) | Макс.скорость | Сред.скорость | Энергия") println("-"^50) for (bp, final_x, max_s, avg_s, energy, _, _) in results println(" $bp | $(round(final_x, digits=2)) | $(round(max_s, digits=2)) | $(round(avg_s, digits=2)) | $(round(energy))") end

📊 Визуализация результатов

# График траекторий для всех вариантов p1 = plot(title="Сравнение траекторий при разной базовой мощности", xlabel="Шаг симуляции", ylabel="Координата X (м)", legend=:bottomright) colors = [:blue, :red, :green, :purple, :orange] for (idx, (bp, _, _, _, _, x_pos, _)) in enumerate(results) plot!(1:length(x_pos), x_pos, label="base_power=$bp", linewidth=2, color=colors[idx]) end savefig("experiment1_trajectories.png") println("\n✅ График траекторий сохранён: experiment1_trajectories.png") # График зависимости пути от базовой мощности base_vals = [r[1] for r in results] path_vals = [r[2] for r in results] p2 = plot(base_vals, path_vals, title="Зависимость пройденного пути от базовой мощности", xlabel="Базовая мощность", ylabel="Пройденный путь (м)", marker=:circle, markersize=8, linewidth=2, label="Путь") savefig("experiment1_power_vs_path.png") println("✅ График зависимости сохранён: experiment1_power_vs_path.png") # График скорости p3 = plot(title="Сравнение скоростей", xlabel="Шаг симуляции", ylabel="Скорость (м/с)", legend=:topright) for (idx, (bp, _, _, _, _, _, speeds)) in enumerate(results) plot!(1:length(speeds), speeds, label="base_power=$bp", linewidth=2, color=colors[idx], linestyle=:dash) end savefig("experiment1_speeds.png") println("✅ График скоростей сохранён: experiment1_speeds.png")

📈 Анализ результатов эксперимента

println("\n" * "="^50) println("АНАЛИЗ РЕЗУЛЬТАТОВ") println("="^50) # Находим оптимальную базовую мощность best_idx = argmax([r[2] for r in results]) # Максимальный путь best_bp = results[best_idx][1] best_path = results[best_idx][2] println("\n🏆 Лучший результат по пройденному пути:") println(" base_power = $best_bp → путь = $(round(best_path, digits=2)) м") # Анализ эффективности (путь на единицу энергии) println("\n📊 Анализ эффективности (путь/энергия):") for (bp, final_x, _, _, energy, _, _) in results efficiency = final_x / energy println(" base_power=$bp: $(round(efficiency, digits=4)) м/ед.энергии") end # Выводы println("\n" * "="^50) println("ВЫВОДЫ") println("="^50) println(""" 1. При увеличении базовой мощности: - Пройденный путь увеличивается, но не линейно - Максимальная скорость растёт - Расход энергии увеличивается 2. Оптимальное значение base_power: $best_bp - Обеспечивает максимальный путь - При дальнейшем увеличении рост замедляется 3. Рекомендация для реального робота: - Начать с base_power = $best_bp - При необходимости скорректировать с учётом реальных условий """)

📥 Скачать Julia-скрипт к уроку

Полный код симулятора для этого занятия. Запустите в Engee или любой среде Julia.

⬇️ Скачать скрипт (.jl)

Файл: robot_simulation_lessonXX.jl

📚 Домашнее задание

ДЗ #25 📅 Срок сдачи: 7 апреля 2026 🏆 Макс. балл: 5 баллов

Расширенный эксперимент по подбору базовой мощности

Цель: Самостоятельно провести эксперимент с более широким диапазоном параметров и найти оптимальное значение для конкретной трассы.

Задание 1: Расширенный диапазон

  1. Используя код из урока, протестируйте базовые мощности в диапазоне от 10 до 100 с шагом 10
  2. Для каждого значения запишите: пройденный путь, максимальную скорость, среднюю скорость, затраченную энергию
  3. Постройте график зависимости пути от базовой мощности

Задание 2: Анализ оптимальности

  1. Найдите значение base_power, при котором путь максимален
  2. Найдите значение base_power, при котором эффективность (путь/энергия) максимальна
  3. Объясните, почему эти значения могут различаться
  4. Какой критерий вы выберете для реального робота и почему?

Задание 3: Творческая часть

  1. Придумайте свою трассу (массив sensor_data) и повторите эксперимент
  2. Сравните оптимальные значения для двух разных трасс
  3. Сделайте вывод о влиянии конфигурации трассы на выбор параметров

Требования к сдаче:

  • Скрипт с полным кодом эксперимента
  • Все графики (минимум 3)
  • Таблица результатов
  • Текстовый анализ с выводами (минимум 5 предложений)

🔧 Полезная информация

💡 Что мы узнали сегодня?

  • Базовая мощность напрямую влияет на скорость и пройденный путь
  • Слишком малая мощность → робот медленный
  • Слишком большая мощность → робот может "слететь" с трассы
  • Есть оптимальное значение, которое можно найти через симуляцию

🔬 Для самостоятельного исследования

Почему путь не растёт линейно?

Из-за ограничений: при высокой скорости робот может "проскакивать" повороты и терять линию, что снижает эффективный путь.

Как связаны мощность и энергия?

Энергия пропорциональна сумме мощностей моторов за всё время. Чем выше мощность, тем быстрее разряжается батарея.

Урок 26: Эксперимент 2 - Влияние коэффициента поворота на устойчивость

Урок 26: Эксперимент 2 - Влияние коэффициента поворота на устойчивость робота

📅 7 апреля 2026 ⏱ 1 академический час (40 минут) Занятие 26

📋 План занятия

  1. 00:05 Что исследуем: влияние "агрессивности" поворотов на траекторию
  2. 05:15 Повторение: как работает алгоритм поворота
  3. 10:25 Эксперимент: изменение turn_left и turn_right
  4. 25:35 Анализ: поиск оптимального баланса между откликом и стабильностью
  5. 35:40 Домашнее задание: исследование устойчивости к шумам

🔬 Что мы исследуем сегодня?

🎯 Цель эксперимента

Исследуем: Как изменение силы поворота (turn_left и turn_right) влияет на способность робота удерживаться на линии и плавность движения.

💡 Почему компьютерное моделирование выгоднее?

  • 🎮 Безопасное тестирование экстремальных режимов: В симуляции можно проверить, что произойдёт при повороте в 3 раза сильнее нормы — робот просто "слетит" с трассы на графике. В реальности можно сломать колёса или моторы.
  • 📏 Точное измерение устойчивости: Можно ввести случайные помехи и оценить, насколько робот "выживает". В реальности трудно создать одинаковые условия для сравнения.
  • 🔄 Быстрый перебор комбинаций: 10×10 комбинаций = 100 экспериментов за 2 минуты.
  • 📊 Объективные метрики: Среднеквадратичное отклонение от линии, количество "сходов".

📝 Код симуляции с настраиваемыми поворотами

using Plots, Statistics function run_simulation_with_turns(sensor_data, base_power, turn_left, turn_right, dt=1.0) num_steps = length(sensor_data) x_positions = zeros(num_steps) speed_history = zeros(num_steps) left_history = zeros(num_steps) right_history = zeros(num_steps) turn_history = zeros(num_steps) x = 0.0 for i in 1:num_steps sensor = sensor_data[i] if sensor == 1 turn_power = turn_left else turn_power = turn_right end turn_history[i] = turn_power left_power = max(0, base_power + turn_power) right_power = max(0, base_power - turn_power) left_history[i] = left_power right_history[i] = right_power current_speed = (left_power + right_power) / 200 speed_history[i] = current_speed x = x + current_speed * dt x_positions[i] = x end return x_positions, speed_history, left_history, right_history, turn_history end # Данные трассы (0-белое, 1-черное) sensor_data = [0, 0, 1, 1, 1, 0, 0, 1, 1, 0] base_power = 35 # Оптимальное из прошлого эксперимента dt = 1.0 println("Симулятор загружен!") println("Трасса: $sensor_data") println("Базовая мощность: $base_power")

🧪 Эксперимент: Меняем силу поворота

# Тестируем разные комбинации поворотов turn_left_values = [5, 10, 15, 20] turn_right_values = [-3, -5, -8, -12] results_turns = [] println("="^60) println("ЗАПУСК ЭКСПЕРИМЕНТА: ВЛИЯНИЕ ПОВОРОТОВ") println("="^60) for tl in turn_left_values for tr in turn_right_values x_pos, speeds, left, right, turns = run_simulation_with_turns( sensor_data, base_power, tl, tr, dt ) final_x = x_pos[end] max_speed = maximum(speeds) avg_speed = mean(speeds) # Метрика плавности: сумма изменений поворота smoothness = sum(abs.(diff(turns))) push!(results_turns, (tl, tr, final_x, max_speed, avg_speed, smoothness, x_pos, speeds)) println("\n📊 tl=$tl, tr=$tr") println(" Путь: $(round(final_x, digits=2)) м") println(" Макс.скорость: $(round(max_speed, digits=2)) м/с") println(" Плавность (меньше=лучше): $(round(smoothness, digits=1))") end end println("\n" * "="^60) println("СВОДНАЯ ТАБЛИЦА РЕЗУЛЬТАТОВ") println("="^60) println("turn_left | turn_right | Путь (м) | Плавность") println("-"^50) for (tl, tr, final_x, _, _, smooth, _, _) in results_turns println(" $tl | $tr | $(round(final_x, digits=2)) | $(round(smooth, digits=1))") end

📊 Анализ и визуализация

# График сравнения траекторий для разных turn_left p1 = plot(title="Влияние turn_left на траекторию (при turn_right=-5)", xlabel="Шаг", ylabel="X (м)", legend=:bottomright) for tl in turn_left_values # Находим результат с tr=-5 for (tl_val, tr_val, _, _, _, _, x_pos, _) in results_turns if tl_val == tl && tr_val == -5 plot!(1:length(x_pos), x_pos, label="tl=$tl", linewidth=2) break end end end savefig("experiment2_trajectories_tl.png") println("✅ График траекторий сохранён: experiment2_trajectories_tl.png") # График сравнения траекторий для разных turn_right p2 = plot(title="Влияние turn_right на траекторию (при tl=10)", xlabel="Шаг", ylabel="X (м)", legend=:bottomright) for tr in turn_right_values for (tl_val, tr_val, _, _, _, _, x_pos, _) in results_turns if tl_val == 10 && tr_val == tr plot!(1:length(x_pos), x_pos, label="tr=$tr", linewidth=2) break end end end savefig("experiment2_trajectories_tr.png") println("✅ График траекторий сохранён: experiment2_trajectories_tr.png") # Поиск оптимальной комбинации best_smooth = minimum([r[6] for r in results_turns]) best_idx = argmin([r[6] for r in results_turns]) best_tl, best_tr, best_path, _, _, best_smooth_val, _, _ = results_turns[best_idx] println("\n" * "="^60) println("АНАЛИЗ РЕЗУЛЬТАТОВ") println("="^60) println("\n🏆 Лучшая комбинация по плавности:") println(" turn_left = $best_tl, turn_right = $best_tr") println(" Плавность = $(round(best_smooth_val, digits=1))") println(" Пройденный путь = $(round(best_path, digits=2)) м") println("\n📈 ВЫВОДЫ:") println(""" 1. Слишком маленький поворот (tl=5, tr=-3): - Робот медленно реагирует, может "слететь" с линии - Траектория плавная, но путь меньше 2. Оптимальный поворот (tl=$best_tl, tr=$best_tr): - Хороший баланс между реакцией и плавностью - Рекомендуется для реального робота 3. Слишком большой поворот (tl=20, tr=-12): - Резкие движения, "рыскание" - Траектория может стать хаотичной """)

📥 Скачать Julia-скрипт к уроку

Полный код симулятора для этого занятия. Запустите в Engee или любой среде Julia.

⬇️ Скачать скрипт (.jl)

Файл: robot_simulation_lessonXX.jl

📚 Домашнее задание

ДЗ #26 📅 Срок сдачи: 14 апреля 2026 🏆 Макс. балл: 5 баллов

Исследование устойчивости к помехам

Цель: Проверить, насколько устойчив робот при разных настройках поворота, если добавить случайные помехи в показания датчика.

Задание 1: Добавление шума

  1. Модифицируйте функцию симуляции так, чтобы с вероятностью 10% показание датчика инвертировалось (0→1, 1→0)
  2. Проведите по 10 симуляций для каждой комбинации turn_left и turn_right из урока
  3. Для каждой комбинации подсчитайте процент успешных прохождений (робот доехал до конца)

Задание 2: Поиск устойчивой комбинации

  1. Найдите комбинацию, которая даёт наибольший процент успеха при наличии шума
  2. Сравните с комбинацией, оптимальной по плавности из урока
  3. Объясните разницу

Задание 3: Визуализация и выводы

  1. Постройте тепловую карту (heatmap) зависимости успеха от turn_left и turn_right
  2. Сделайте вывод: какие настройки стоит выбрать для реального робота, если пол неровный или датчики могут ошибаться?

Требования к сдаче:

  • Код с функцией добавления шума
  • Таблица результатов (минимум 20 симуляций)
  • Тепловая карта устойчивости
  • Текстовый вывод (минимум 5 предложений)

🔧 Полезная информация

💡 Что мы узнали сегодня?

  • Сила поворота влияет на резкость и плавность движения
  • Слишком слабый поворот → робот "пропускает" повороты
  • Слишком сильный → "рыскание" и нестабильность
  • Есть золотая середина, которую можно найти через симуляцию

🔬 Для самостоятельного исследования

Что такое "рыскание"?

Это колебания робота относительно линии. При слишком сильном повороте робот постоянно "перелетает" линию и вынужден постоянно корректировать траекторию.

Как измерить устойчивость?

Можно добавить случайные ошибки датчика и посчитать, сколько симуляций робот доезжает до конца. Чем выше процент, тем устойчивее алгоритм.

Урок 27: Эксперимент 3 - Полная оптимизация параметров робота

Урок 27: Эксперимент 3 - Полная оптимизация параметров робота

📅 14 апреля 2026 ⏱ 1 академический час (40 минут) Занятие 27

📋 План занятия

  1. 00:05 Что исследуем: совместное влияние всех параметров
  2. 05:15 Повторение результатов экспериментов 1 и 2
  3. 10:25 Полный перебор параметров (grid search)
  4. 25:35 Создание единой метрики качества и выбор лучшей комбинации
  5. 35:40 Домашнее задание: проверка на разных трассах

🔬 Что мы исследуем сегодня?

🎯 Цель эксперимента

Исследуем: Как совместно влияют базовая мощность и сила поворота на движение робота. Найдём глобально оптимальную комбинацию параметров для заданной трассы.

💡 Почему компьютерное моделирование выгоднее?

  • 🎯 Grid Search: Перебор 5×5×5 = 125 комбинаций за 2 минуты. В реальности это неделя экспериментов.
  • 📊 Многокритериальная оптимизация: Можно одновременно учитывать скорость, путь, плавность и энергопотребление.
  • 🔄 Адаптация под разные трассы: Легко поменять трассу и заново подобрать параметры.
  • 📄 Документация: Все результаты сохраняются в таблицу для анализа.

📝 Полная функция симуляции

using Plots, Statistics function full_simulation(sensor_data, base_power, turn_left, turn_right, dt=1.0) num_steps = length(sensor_data) x_positions = zeros(num_steps) speed_history = zeros(num_steps) left_history = zeros(num_steps) right_history = zeros(num_steps) turn_history = zeros(num_steps) x = 0.0 for i in 1:num_steps sensor = sensor_data[i] if sensor == 1 turn_power = turn_left else turn_power = turn_right end turn_history[i] = turn_power left_power = max(0, base_power + turn_power) right_power = max(0, base_power - turn_power) left_history[i] = left_power right_history[i] = right_power current_speed = (left_power + right_power) / 200 speed_history[i] = current_speed x = x + current_speed * dt x_positions[i] = x end return x_positions, speed_history, left_history, right_history, turn_history end # Трасса sensor_data = [0, 0, 1, 1, 1, 0, 0, 1, 1, 0] dt = 1.0 println("Полный симулятор загружен!") println("Трасса: $sensor_data")

🧪 Grid Search: Перебор всех комбинаций

# Диапазоны параметров base_powers = [25, 30, 35, 40, 45] turn_lefts = [5, 8, 10, 12, 15] turn_rights = [-3, -5, -7, -10, -12] all_results = [] println("="^60) println("ЗАПУСК GRID SEARCH (5×5×5 = 125 комбинаций)") println("="^60) for bp in base_powers for tl in turn_lefts for tr in turn_rights x_pos, speeds, left, right, turns = full_simulation(sensor_data, bp, tl, tr, dt) final_x = x_pos[end] max_speed = maximum(speeds) avg_speed = mean(speeds) energy = sum(left .+ right) # Метрика плавности (чем меньше, тем лучше) smoothness = sum(abs.(diff(turns))) # Комплексная оценка качества # Чем больше путь и плавность, тем лучше quality_score = final_x * 10 - smoothness * 0.1 - energy * 0.01 push!(all_results, (bp, tl, tr, final_x, max_speed, avg_speed, energy, smoothness, quality_score)) end end end println("\n✅ Grid Search завершён! Обработано $(length(all_results)) комбинаций") # Находим лучшую комбинацию по качеству best_idx = argmax([r[9] for r in all_results]) best_bp, best_tl, best_tr, best_path, best_max_s, best_avg_s, best_energy, best_smooth, best_score = all_results[best_idx] println("\n" * "="^60) println("🏆 ЛУЧШАЯ КОМБИНАЦИЯ ПАРАМЕТРОВ") println("="^60) println(" base_power = $best_bp") println(" turn_left = $best_tl") println(" turn_right = $best_tr") println("-"^40) println(" Пройденный путь: $(round(best_path, digits=2)) м") println(" Макс. скорость: $(round(best_max_s, digits=2)) м/с") println(" Сред. скорость: $(round(best_avg_s, digits=2)) м/с") println(" Энергия: $(round(best_energy))") println(" Плавность: $(round(best_smooth, digits=1))") println(" Качество: $(round(best_score, digits=2))")

📊 Визуализация и анализ

# Запускаем симуляцию с лучшими параметрами x_opt, speeds_opt, left_opt, right_opt, turns_opt = full_simulation( sensor_data, best_bp, best_tl, best_tr, dt ) # График оптимальной траектории p_opt = plot(1:length(x_opt), x_opt, title="Оптимальная траектория робота", xlabel="Шаг симуляции", ylabel="Координата X (м)", label="Путь", linewidth=3, color=:green, marker=:circle) # Добавляем отметки участков трассы for i in 1:length(sensor_data) if sensor_data[i] == 1 vline!([i], label=false, color=:black, alpha=0.2, linewidth=2) end end savefig("experiment3_optimal_trajectory.png") println("✅ График оптимальной траектории сохранён") # Сравнение с "плохими" параметрами bad_params = [(25, 5, -3), (45, 15, -12)] for (bp, tl, tr) in bad_params x_bad, _, _, _, _ = full_simulation(sensor_data, bp, tl, tr, dt) plot!(1:length(x_bad), x_bad, label="bp=$bp, tl=$tl, tr=$tr", linewidth=2, linestyle=:dash) end savefig("experiment3_comparison.png") println("✅ График сравнения сохранён") # Тепловая карта зависимости качества от параметров function create_heatmap(data, x_vals, y_vals, title) matrix = zeros(length(y_vals), length(x_vals)) for (i, xv) in enumerate(x_vals) for (j, yv) in enumerate(y_vals) # Находим среднее качество для этой комбинации scores = [r[9] for r in data if r[1] == xv && r[2] == yv] if !isempty(scores) matrix[j, i] = mean(scores) end end end return heatmap(x_vals, y_vals, matrix, title=title, xlabel="base_power", ylabel="turn_left", c=:viridis) end p_heat = create_heatmap(all_results, base_powers, turn_lefts, "Качество vs (base_power, turn_left) при turn_right=-7") savefig("experiment3_heatmap.png") println("✅ Тепловая карта сохранена") println("\n" * "="^60) println("АНАЛИЗ РЕЗУЛЬТАТОВ") println("="^60) println(""" 📈 КЛЮЧЕВЫЕ ВЫВОДЫ: 1. Оптимальная комбинация параметров: base_power = $best_bp turn_left = $best_tl turn_right = $best_tr 2. Эта комбинация обеспечивает: - Максимальный пройденный путь - Хорошую плавность движения - Приемлемое энергопотребление 3. Что важно для реального робота: - Эти параметры можно сразу загрузить в контроллер - При необходимости - небольшая ручная корректировка """)

📥 Скачать Julia-скрипт к уроку

Полный код симулятора для этого занятия. Запустите в Engee или любой среде Julia.

⬇️ Скачать скрипт (.jl)

Файл: robot_simulation_lessonXX.jl

📚 Домашнее задание

ДЗ #27 📅 Срок сдачи: 21 апреля 2026 🏆 Макс. балл: 6 баллов

Адаптация параметров под разные трассы

Цель: Проверить, насколько универсальны найденные параметры, и подобрать параметры для других конфигураций трассы.

Задание 1: Тест на другой трассе

  1. Создайте 2 новые трассы:
    • Трасса A: длинная прямая (15 шагов, все 1)
    • Трасса B: с двумя поворотами (например, [0,0,1,1,0,0,1,1,0,0])
  2. Протестируйте на каждой трассе оптимальные параметры из урока
  3. Сравните результаты: путь, скорость, плавность

Задание 2: Переобучение под новую трассу

  1. Для трассы B проведите grid search заново
  2. Найдите оптимальные параметры для этой трассы
  3. Сравните с параметрами из урока. Они отличаются? Почему?

Задание 3: Создание "универсального" алгоритма

  1. Предложите, как можно сделать алгоритм, который автоматически подстраивает turn_left/turn_right в зависимости от текущей скорости
  2. Реализуйте упрощённую версию (например, если скорость > 0.8 → turn_left уменьшается)
  3. Протестируйте на обеих трассах

Требования к сдаче:

  • Код для тестирования на разных трассах
  • Сравнительные таблицы результатов
  • Графики траекторий для всех вариантов
  • Текстовый анализ (минимум 7 предложений)

🔧 Полезная информация

💡 Что мы узнали сегодня?

  • Полный перебор параметров (grid search) позволяет найти глобальный оптимум
  • Нужно учитывать несколько критериев качества одновременно
  • Оптимальные параметры зависят от конфигурации трассы
  • Симуляция позволяет быстро адаптировать робота под новые условия

🔬 Для самостоятельного исследования

Что такое многокритериальная оптимизация?

Это поиск компромисса между несколькими целями (максимизировать путь, минимизировать энергию, максимизировать плавность). В реальности часто нет одного "лучшего" решения.

Можно ли улучшить grid search?

Да! Можно использовать генетические алгоритмы, случайный поиск или байесовскую оптимизацию для больших пространств параметров.

Урок 28: Моделирование других технических систем

Урок 28: Моделирование других технических систем

📅 21 апреля 2026 ⏱ 1 академический час (40 минут) Занятие 28

📋 План занятия

  1. 00:05 Объявление итогового теста (12.05): структура, темы, критерии
  2. 05:20 Пример 1: Моделирование нагрева воды (массивы, циклы)
  3. 20:35 Пример 2: Моделирование падения мяча (физика, графики)
  4. 35:40 Итоги. Домашнее задание

📢 Итоговый тест: информация

📅 Дата: 12 мая 2026 (занятие 31)

Длительность: 40 минут

Формат: 5 задач с кодом на Julia в среде Engee

Темы: Массивы, индексация, операции, графики, функции, бинарные массивы, условия, циклы

Максимальный балл: 25 (по 5 баллов за задачу)

⚠️ Критерии оценки

  • 5 баллов: Код полностью рабочий, использованы правильные функции, есть комментарии
  • 4 балла: Код рабочий, но есть небольшие недочёты (стиль, лишние переменные)
  • 3 балла: Код работает, но неэффективно или есть 1-2 ошибки
  • 2 балла: Код частично работает, есть серьёзные ошибки
  • 0-1 балл: Код не работает или не сдан

📊 Пример 1: Моделирование нагрева воды

Техническая система: Чайник с водой. Нужно смоделировать, как меняется температура воды при нагревании.

# Моделирование нагрева воды # Параметры T_room = 20.0 # Начальная температура воды (комнатная), °C T_target = 100.0 # Температура кипения, °C heating_power = 0.5 # Мощность нагревателя, °C в секунду dt = 1.0 # Шаг времени, сек time_max = 200 # Максимальное время симуляции, сек # Массивы для хранения данных time_points = 0:dt:time_max temperature = zeros(length(time_points)) # Начальные условия temperature[1] = T_room # Цикл симуляции for i in 2:length(time_points) # Если температура ниже целевой - нагреваем if temperature[i-1] < T_target temperature[i] = temperature[i-1] + heating_power * dt else temperature[i] = temperature[i-1] # Достигли кипения end end # Визуализация using Plots plot(time_points, temperature, title="Нагрев воды", xlabel="Время (сек)", ylabel="Температура (°C)", linewidth=2, color=:red) hline!([T_target], label="Точка кипения", linestyle=:dash, color=:blue) savefig("water_heating.png")

Что здесь применяется из курса?

  • Создание массивов: zeros(length(time_points))
  • Цикл for для пошагового расчёта
  • Условный оператор if-else для проверки достижения кипения
  • Построение графика plot() и горизонтальной линии hline!()
  • Сохранение графика savefig()

🏀 Пример 2: Моделирование падения мяча

Техническая система: Мяч, падающий с высоты с учётом отскоков.

# Моделирование падения мяча с отскоками using Plots # Параметры h0 = 10.0 # Начальная высота, м g = 9.81 # Ускорение свободного падения, м/с² e = 0.8 # Коэффициент восстановления (упругость) dt = 0.01 # Шаг времени, сек time_max = 5.0 # Максимальное время симуляции, сек # Массивы time_points = 0:dt:time_max height = zeros(length(time_points)) velocity = zeros(length(time_points)) # Начальные условия height[1] = h0 velocity[1] = 0.0 # Цикл симуляции for i in 2:length(time_points) # Обновляем скорость и высоту velocity[i] = velocity[i-1] - g * dt height[i] = height[i-1] + velocity[i-1] * dt # Проверка столкновения с землёй if height[i] <= 0 height[i] = 0 velocity[i] = -velocity[i-1] * e # Отскок с потерей энергии end end # Визуализация plot(time_points, height, title="Падение и отскоки мяча", xlabel="Время (сек)", ylabel="Высота (м)", linewidth=2, color=:green) savefig("ball_bounce.png") # Дополнительный анализ: находим максимальную высоту после первого отскока max_height_after_bounce = maximum(height[findall(height .< h0 .&& height .> 0)]) println("Максимальная высота после первого отскока: $(round(max_height_after_bounce, digits=2)) м")

Что здесь применяется из курса?

  • Цикл for для симуляции во времени
  • Условный оператор if для обнаружения столкновения
  • Бинарная маска: height .< h0 .&& height .> 0
  • Функция findall() для поиска индексов
  • Функция maximum() для нахождения максимума
  • Построение графика plot()

📝 Задания для самостоятельного разбора

Задание 1: Остывание чашки кофе

Закон охлаждения Ньютона: скорость охлаждения пропорциональна разнице температур. dT/dt = -k * (T - T_room)

  1. Напишите цикл для расчёта температуры кофе от 90°C до комнатной (20°C)
  2. Коэффициент охлаждения k = 0.05 1/сек
  3. Постройте график остывания
  4. Найдите, через сколько секунд кофе остынет до 40°C

Задание 2: Зарядка конденсатора

Напряжение на конденсаторе при зарядке: U(t) = U_max * (1 - e^(-t/RC))

  1. Создайте массив времени t = 0:0.1:10
  2. Вычислите напряжение для каждого момента времени
  3. Постройте график U(t)
  4. Найдите, через сколько секунд напряжение достигнет 95% от максимального

📚 Домашнее задание

ДЗ #28 📅 Срок сдачи: 28 апреля 2026 🏆 Макс. балл: 5 баллов

Моделирование колебаний маятника

Цель: Применить навыки моделирования к новой технической системе.

Задание

  1. Смоделируйте движение математического маятника длиной L = 2 м
  2. Начальный угол отклонения θ₀ = 30° (перевести в радианы)
  3. Уравнение движения: θ'' = -(g/L) * sin(θ) (используйте приближение Эйлера)
  4. Постройте график угла от времени для первых 10 секунд
  5. Найдите период колебаний (время между двумя максимумами)

Требования к сдаче

  • Код должен быть полностью рабочим в Engee
  • Добавьте комментарии к каждой строке/блоку
  • Сохраните график в файл
  • Выведите период колебаний в консоль
Урок 29: Тренировочные задачи по функциям

Урок 29: Тренировочные задачи по функциям

📅 28 апреля 2026 ⏱ 1 академический час (40 минут) Занятие 29

📋 План занятия

  1. 00:05 Разбор ДЗ 28 (моделирование маятника)
  2. 10:20 Типы задач в тесте: структура и примеры
  3. 20:35 Решение 3 тренировочных задач вместе с классом
  4. 35:40 Итоги. Домашнее задание: пробный тест

📝 Типы задач в итоговом тесте

5 типов задач (по 5 баллов)

  1. Задача 1: Создание и индексация массивов (3 балла) + интерпретация (2 балла)
  2. Задача 2: Операции с массивами и функции (3 балла) + интерпретация (2 балла)
  3. Задача 3: Бинарные массивы и условия (3 балла) + интерпретация (2 балла)
  4. Задача 4: Циклы и моделирование (3 балла) + интерпретация (2 балла)
  5. Задача 5: Полный анализ данных с графиками (3 балла) + интерпретация (2 балла)

✍️ Что значит "интерпретация применения функций"?

В каждой задаче нужно не только написать код, но и ответить на вопрос (текстом в комментарии или отдельной ячейкой):

  • "Зачем здесь нужна функция findmax?"
  • "Почему мы используем поэлементное умножение .* вместо обычного *?"
  • "Что произойдёт, если убрать точку в операции .>"
  • "Какой физический смысл имеет найденное значение?"

📝 Тренировочная задача 1: Массивы и индексация

# Задача: Дан массив показаний датчика температуры за 10 секунд # Нужно найти максимальную температуру и время, когда она была достигнута # Данные (заполнены, не менять) temperature = [18.5, 19.2, 20.1, 21.3, 22.0, 22.5, 22.8, 23.0, 22.7, 22.1] time = 1:10 # ========== НАПИШИТЕ КОД ЗДЕСЬ ========== # 1. Найдите максимальную температуру и её индекс с помощью findmax # 2. Выведите сообщение: "Максимальная температура X°C была на Y секунде" # 3. (Интерпретация) Ответьте: Почему мы используем findmax, а не maximum? # ОТВЕТ (интерпретация): # findmax возвращает и значение, и индекс. maximum возвращает только значение. # Нам нужен индекс, чтобы знать, когда (на какой секунде) была максимальная температура. # ========================================
▶️ Показать решение
# Решение max_temp, idx = findmax(temperature) println("Максимальная температура $(max_temp)°C была на $(idx) секунде")

📝 Тренировочная задача 2: Операции с массивами

# Задача: Дан массив скоростей автомобиля (м/с) # Нужно перевести скорости в км/ч и найти среднюю скорость в км/ч # Данные speeds_ms = [10, 15, 20, 25, 30, 28, 22, 18, 12, 8] # ========== НАПИШИТЕ КОД ЗДЕСЬ ========== # 1. Переведите все скорости в км/ч (умножить на 3.6) # 2. Найдите среднюю скорость в км/ч # 3. (Интерпретация) Почему здесь нужно использовать поэлементное умножение .*? # ОТВЕТ (интерпретация): # .* применяет умножение к каждому элементу массива отдельно. # Без точки * попытается выполнить матричное умножение, что вызовет ошибку. # ========================================
▶️ Показать решение
# Решение using Statistics speeds_kmh = speeds_ms .* 3.6 avg_speed_kmh = mean(speeds_kmh) println("Средняя скорость: $(round(avg_speed_kmh, digits=1)) км/ч")

📝 Тренировочная задача 3: Бинарные массивы и условия

# Задача: Дан массив показаний датчика движения (1 - движение, 0 - покой) # Нужно найти, сколько времени объект двигался # Данные motion_sensor = [1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1] # ========== НАПИШИТЕ КОД ЗДЕСЬ ========== # 1. Создайте маску для движения (motion_sensor .== 1) # 2. Подсчитайте количество шагов движения с помощью sum # 3. (Интерпретация) Почему sum(маска) даёт количество true? # ОТВЕТ (интерпретация): # В Julia true = 1, false = 0. sum складывает единицы, получая количество true. # ========================================
▶️ Показать решение
# Решение is_moving = motion_sensor .== 1 moving_time = sum(is_moving) println("Объект двигался $(moving_time) единиц времени")

📚 Домашнее задание

ДЗ #29 📅 Срок сдачи: 5 мая 2026 🏆 Макс. балл: 5 баллов

Пробный тест (5 задач)

Задача 1 (Массивы и индексация)

Дан массив: data = [10, 20, 30, 40, 50, 60]

  1. Извлеките последний элемент
  2. Извлеките элементы со 2-го по 4-й
  3. Измените 3-й элемент на 99
  4. Интерпретация: Зачем нужно ключевое слово end?

Задача 2 (Операции с массивами)

Два массива: a = [1, 2, 3, 4], b = [5, 6, 7, 8]

  1. Вычислите поэлементную сумму
  2. Вычислите поэлементное произведение
  3. Найдите среднее значение суммы
  4. Интерпретация: Чем отличается .* от *?

Задача 3 (Бинарные массивы)

Массив: values = [5, 12, 8, 15, 3, 20, 7]

  1. Создайте маску для значений > 10
  2. Используя маску, получите все значения > 10
  3. Подсчитайте количество значений > 10
  4. Интерпретация: Как работает values[mask]?

Задача 4 (Циклы)

Напишите цикл, который вычисляет сумму чисел от 1 до 100

  1. Используйте цикл for
  2. Выведите результат
  3. Интерпретация: Почему циклы полезны для моделирования?

Задача 5 (Графики)

Постройте график функции y = sin(x) для x = 0:0.1:2π

  1. Создайте массивы x и y
  2. Постройте график с заголовком "Синусоида"
  3. Сохраните график в файл
  4. Интерпретация: Зачем нужны графики в моделировании?
Урок 30: Решение пробного варианта теста

Урок 30: Решение пробного варианта теста

📅 5 мая 2026 ⏱ 1 академический час (40 минут) Занятие 30

📋 План занятия

  1. 00:05 Разбор ДЗ 29 (пробного теста)
  2. 10:25 Пошаговое решение полного пробного варианта
  3. 30:38 Ответы на вопросы. Рекомендации перед тестом
  4. 38:40 Итоги. Напоминание о тесте 12.05

📝 Полный пробный вариант итогового теста

⏱️ Время выполнения: 40 минут

Инструкция: Решите 5 задач. В каждой задаче напишите код и ответьте на вопрос по интерпретации. Используйте среду Engee.

Задача 1 (5 баллов): Массивы и индексация

Дан массив результатов измерений расстояния (в метрах) от датчика до препятствия:

distances = [1.5, 2.3, 0.8, 3.1, 2.7, 1.2, 4.0, 2.5, 1.9, 3.5]
  1. Извлеките первое и последнее измерение (1 балл)
  2. Извлеките измерения со 2-го по 5-й элемент (1 балл)
  3. Измените 4-й элемент на 2.0 (1 балл)
  4. Интерпретация (2 балла): Зачем в моделировании нужно уметь извлекать подмассивы (срезы)? Приведите пример из реальной задачи.
▶️ Показать решение
# Решение задачи 1 distances = [1.5, 2.3, 0.8, 3.1, 2.7, 1.2, 4.0, 2.5, 1.9, 3.5] # 1. Первое и последнее first = distances[1] last = distances[end] println("Первое: $first, Последнее: $last") # 2. Со 2-го по 5-й subset = distances[2:5] println("Срез 2-5: $subset") # 3. Изменение 4-го элемента distances[4] = 2.0 println("После изменения: $distances") # Интерпретация: # Извлечение срезов позволяет анализировать отдельные участки данных, # например, только первые 5 секунд эксперимента или только данные до сбоя.

Задача 2 (5 баллов): Операции с массивами

Дан массив скоростей ветра (м/с) за 12 часов:

wind_speed = [3, 5, 7, 6, 4, 8, 10, 9, 6, 5, 4, 3]
  1. Переведите скорости в км/ч (1 м/с = 3.6 км/ч) (1 балл)
  2. Найдите максимальную скорость в км/ч (1 балл)
  3. Найдите среднюю скорость в км/ч (1 балл)
  4. Интерпретация (2 балла): Почему для перевода мы используем .*, а не просто *?
▶️ Показать решение
# Решение задачи 2 using Statistics wind_speed = [3, 5, 7, 6, 4, 8, 10, 9, 6, 5, 4, 3] # 1. Перевод в км/ч wind_kmh = wind_speed .* 3.6 println("Скорости в км/ч: $wind_kmh") # 2. Максимальная скорость max_wind = maximum(wind_kmh) println("Максимальная скорость: $(round(max_wind, digits=1)) км/ч") # 3. Средняя скорость avg_wind = mean(wind_kmh) println("Средняя скорость: $(round(avg_wind, digits=1)) км/ч") # Интерпретация: # .* применяет умножение к каждому элементу массива по отдельности. # * - это матричное умножение, которое требует совместимых размеров.

Задача 3 (5 баллов): Бинарные массивы

Дан массив показаний датчика качества воздуха (0 - норма, 1 - превышение):

air_quality = [0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0]
  1. Создайте маску для моментов превышения (1 балл)
  2. Найдите индексы (номера замеров), когда было превышение (2 балла)
  3. Подсчитайте количество превышений (1 балл)
  4. Интерпретация (1 балл): Что означает выражение sum(air_quality .== 1)?
▶️ Показать решение
# Решение задачи 3 air_quality = [0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0] # 1. Маска превышения is_bad = air_quality .== 1 println("Маска: $is_bad") # 2. Индексы превышений bad_indices = findall(is_bad) println("Превышения на замерах: $bad_indices") # 3. Количество превышений bad_count = sum(is_bad) println("Количество превышений: $bad_count") # Интерпретация: # sum(air_quality .== 1) считает количество true в бинарной маске, # так как true=1, false=0.

Задача 4 (5 баллов): Циклы и моделирование

Напишите симуляцию роста популяции бактерий. Каждый час популяция увеличивается на 20%.

  1. Создайте массивы времени (0-10 часов) и численности (2 балла)
  2. Начальная численность: 100 бактерий (1 балл)
  3. Используйте цикл для расчёта численности каждый час (1 балл)
  4. Интерпретация (1 балл): Почему моделирование с помощью цикла удобнее, чем формула?
▶️ Показать решение
# Решение задачи 4 using Plots # Параметры initial_count = 100 growth_rate = 0.20 # 20% в час hours = 0:10 # Массив для численности population = zeros(length(hours)) population[1] = initial_count # Цикл симуляции for i in 2:length(hours) population[i] = population[i-1] * (1 + growth_rate) end # Вывод результатов println("Час | Численность") println("-" * 20) for i in 1:length(hours) println("$(hours[i]) | $(round(population[i], digits=0))") end # График plot(hours, population, title="Рост популяции бактерий", xlabel="Время (часы)", ylabel="Численность", marker=:circle, linewidth=2) savefig("bacteria_growth.png") # Интерпретация: # Цикл позволяет легко добавлять сложные условия (например, # ограничение ресурсов, случайные события) в отличие от простой формулы.

Задача 5 (5 баллов): Полный анализ данных

Дан массив дневных температур за 30 дней. Выполните полный анализ:

temperatures = [18, 19, 21, 22, 20, 19, 18, 17, 19, 21, 23, 24, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 18, 20, 22, 24, 26, 25, 23, 22]
  1. Постройте график температуры по дням (1 балл)
  2. Найдите максимальную и минимальную температуру и дни, когда они были (2 балла)
  3. Найдите среднюю температуру (1 балл)
  4. Интерпретация (1 балл): Какой практический вывод можно сделать из этих данных?
▶️ Показать решение
# Решение задачи 5 using Plots, Statistics temperatures = [18, 19, 21, 22, 20, 19, 18, 17, 19, 21, 23, 24, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 18, 20, 22, 24, 26, 25, 23, 22] days = 1:30 # 1. График plot(days, temperatures, title="Дневные температуры", xlabel="День", ylabel="Температура (°C)", linewidth=2, marker=:circle, color=:red) savefig("daily_temperatures.png") # 2. Максимум и минимум max_temp, max_day = findmax(temperatures) min_temp, min_day = findmin(temperatures) println("Максимальная температура: $max_temp°C на день $max_day") println("Минимальная температура: $min_temp°C на день $min_day") # 3. Средняя температура avg_temp = mean(temperatures) println("Средняя температура: $(round(avg_temp, digits=1))°C") # Интерпретация: # Данные показывают, что в середине месяца (дни 10-15) температура выше, # а в конце месяца (дни 20-25) наблюдается похолодание. # Это может помочь в планировании мероприятий или работы систем отопления.

✅ Рекомендации перед итоговым тестом (12.05)

  • 📁 Убедитесь, что у вас есть доступ к Engee
  • ⌨️ Потренируйтесь писать код без автодополнения
  • 📊 Вспомните все функции: plot, findmax, mean, sum, findall
  • 🔍 В задачах с интерпретацией пишите развёрнутые ответы (2-3 предложения)
  • ⏰ Распределите время: ~8 минут на задачу
  • 💾 Сохраняйте промежуточные результаты (графики, вывод)
📢 НАПОМИНАНИЕ 📅 Дата теста: 12 мая 2026 🏆 Макс. балл: 25

Итоговый тест по моделированию технических систем

Темы: Массивы, индексация, операции, графики, функции, бинарные массивы, условия, циклы

Формат: 5 задач с кодом + вопросы на интерпретацию

Длительность: 40 минут

Место проведения: Среда Engee

Итоговый тест: Моделирование технических систем

📝 Итоговый тест по курсу
«Моделирование технических систем»

📅 12 мая 2026 ⏱ 40 минут 🏆 25 баллов максимум

ФИО: _______________________________ Группа: _____

⬇️ Скачать шаблон кода для заполнения (.jl)

Файл: test_template.jl — откройте в Engee и заполните пропуски

Задача 1 5 баллов

📊 Массивы и индексация

Дан массив результатов измерения температуры (°C) каждый час в течение 12 часов:

temperature = [15.2, 16.1, 17.3, 18.0, 18.5, 19.2, 20.1, 19.8, 19.0, 18.2, 17.1, 16.0]
  1. Извлеките первое и последнее измерение (1.5 балла)
  2. Извлеките измерения с 3-го по 7-й час (1.5 балла)
  3. Измените значение на 6-м часу на 19.5 (2 балла)
✍️ Место для кода:
first_temp = ________
last_temp = ________
subset_temp = ________
________ = 19.5
Задача 2 5 баллов

📈 Операции с массивами и функции

Дан массив расстояний (в метрах), пройденных роботом за каждую секунду:

distances = [0.5, 0.6, 0.8, 1.0, 1.2, 1.1, 0.9, 0.7, 0.6, 0.5]
  1. Переведите расстояния в сантиметры (1 м = 100 см) (1.5 балла)
  2. Найдите максимальное пройденное расстояние в см (1.5 балла)
  3. Найдите среднее пройденное расстояние в см (2 балла)
✍️ Место для кода:
distances_cm = ________
max_distance = ________
avg_distance = ________
Задача 3 5 баллов

🎯 Бинарные массивы и условия

Дан массив показаний датчика движения (1 - движение, 0 - покой):

motion = [1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0]
  1. Создайте маску для моментов движения (1.5 балла)
  2. Найдите индексы (номера замеров), когда было движение (2 балла)
  3. Подсчитайте общее время движения (количество замеров) (1.5 балла)
✍️ Место для кода:
is_moving = ________
moving_indices = ________
moving_time = ________
Задача 4 5 баллов

🔄 Циклы и моделирование

Смоделируйте заполнение бассейна водой. Каждую минуту уровень воды поднимается на 2 см. Начальный уровень: 0 см. Время симуляции: 30 минут.

  1. Создайте массивы времени (0-30 минут) и уровня воды (2 балла)
  2. Используйте цикл для расчёта уровня воды каждую минуту (3 балла)
✍️ Место для кода:
initial_level = 0.0
rise_rate = 2.0
time_max = 30
time_array = ________
level_array = ________
for i in ________
    ________
end
Задача 5 5 баллов

📉 Полный анализ данных с графиками

Дан массив ежедневных продаж (в тысячах рублей) за 14 дней:

sales = [12, 15, 14, 18, 20, 22, 25, 24, 21, 19, 17, 16, 18, 20] days = 1:14
  1. Постройте график продаж по дням (2 балла)
  2. Найдите максимальные и минимальные продажи и дни, когда они были (1.5 балла)
  3. Найдите средние продажи (1.5 балла)
✍️ Место для кода:
plot(________, ________, title="Динамика продаж", xlabel="День", ylabel="Продажи (тыс. руб.)", linewidth=2, marker=:circle)
savefig("sales_plot.png")
max_sales, max_day = ________
min_sales, min_day = ________
avg_sales = ________

📌 Указание: Скопируйте код из скачанного файла в Engee, заполните все пропуски (________) и выполните ячейки.
После выполнения запустите ячейку с проверкой для автоматического подсчёта баллов.

Made on
Tilda