11 класс
Компьютерное моделирование технических систем
Урок: Работа с массивами в Engee

14. Работа с векторами и матрицами в Engee

📅 13 января 2025 ⏱ 40 минут

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

  1. 0:05 Обзор темы "Векторы и матрицы"
  2. 0:10 Создание массивов в Engee
  3. 0:10 Индексация и модификация массивов
  4. 0:10 Практическая работа
  5. 0:05 Домашнее задание и вопросы

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

Оглавление разделов по работе с массивами:

Раздел 1: Векторы и матрицы

  • Введение в массивы: скаляры, векторы, матрицы
  • Создание массивов вручную
  • Разные способы задания элементов
  • Типы разделителей: пробел, запятая, точка с запятой
  • Создание матриц из нескольких строк
  • Использование математических выражений в массивах
  • Задание арифметических последовательностей
  • Оператор диапазона ( : )
  • Функция LinRange для равномерного распределения
  • Транспонирование векторов (оператор ')
  • Функция reshape для изменения размерности
  • Функции для создания стандартных матриц:
    • rand() - случайные числа
    • zeros() - матрица нулей
    • ones() - матрица единиц
  • Определение размера матрицы (функция size)

Раздел 2: Индексы и модификация массивов

  • Основы индексации элементов
  • Доступ к элементам по индексам
  • Использование слова end для последнего элемента
  • Одномерная индексация матриц
  • Выбор нескольких элементов массива
  • Оператор : для выбора диапазонов
  • Выбор целых строк и столбцов
  • Изменение значений в массивах
  • Замена элементов по индексам
  • Копирование значений между элементами

Ключевые понятия:

  • Массив (Array): Коллекция элементов одного типа, расположенных в памяти последовательно
  • Вектор (Vector): Одномерный массив, может быть строкой или столбцом
  • Матрица (Matrix): Двумерный массив с строками и столбцами
  • Индексация: Механизм доступа к элементам массива по их позиции
  • Диапазон (Range): Последовательность чисел с определенным шагом
Открыть Engee для практики →

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

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

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

Инструкция:

  1. Работаем по курсу "Добро пожаловать в Engee"
  2. Выполняем блоки 3 и 4, что не успели на занятии идёт в ДЗ
Пример кода:
// Создание вектора
v = [1, 3, 5, 7, 9];

// Создание матрицы
M = [1 2 3; 4 5 6];

// Получение элемента
element = M[2, 3]; // Вернет 6

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

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

Практика работы с массивами в Engee

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

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

  1. Создайте вектор A, содержащий числа от 15 до 25 включительно
  2. Создайте матрицу B размером 4×4, заполненную случайными числами от 0 до 1
  3. Создайте матрицу C размером 3×5, полностью состоящую из единиц
  4. Используя функцию LinRange, создайте вектор D с 8 элементами равномерно распределенными от 0 до 2π (≈6.283)
  5. Для матрицы B выполните:
    • Получите элемент в третьей строке и втором столбце
    • Замените все элементы в первом столбце на значение 0.5
    • Создайте новый вектор, содержащий только вторую строку матрицы B
  6. Создайте матрицу E как транспонированную версию матрицы C
  7. Объедините все созданные массивы в один отчет в Engee с комментариями к каждому шагу

Требования к выполнению:

  • Использовать разные способы создания массивов (вручную, оператор :, функции)
  • Добавить комментарии к каждой операции на русском языке
  • Проверить правильность размеров создаваемых массивов
  • Экспортировать код в виде текстового файла с расширением .txt или .jl

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

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

Чем отличается вектор-строка от вектора-столбца?

Вектор-строка имеет размерность 1×n (одна строка, n столбцов), а вектор-столбец - n×1 (n строк, один столбец). В Engee при создании через [1,2,3] получится вектор-столбец, а через [1 2 3] - вектор-строка.

Что делает оператор ' (апостроф)?

Оператор ' выполняет транспонирование - превращает строки в столбцы и наоборот. Для вектора-столбца он создаст вектор-строку, для матрицы поменяет строки и столбцы местами.

Как получить несколько несмежных элементов массива?

Можно использовать список индексов: array[[1, 3, 5]] вернет первый, третий и пятый элементы. Обратите внимание на двойные квадратные скобки!

Что означает data[:, end]?

Двоеточие (:) означает "все строки", а end - "последний столбец". Таким образом, эта команда вернет весь последний столбец матрицы data.

🔗 Полезные материалы

💡 Советы по работе:

  • Всегда проверяйте размерности массивов перед операциями
  • Используйте функцию size() для отладки
  • Комментируйте сложные операции индексации
  • Проверяйте индексы на выход за границы массива
Урок: Операции с массивами в Engee

15. Операции с массивами в технических расчётах

📅 14 января 2025 ⏱ 40 минут

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

  1. 0:05 Повторение: индексация массивов
  2. 0:10 Операции с массивами (поэлементные)
  3. 0:10 Статистические функции
  4. 0:10 Практика: технические примеры
  5. 0:05 Домашнее задание

🎯 Основной материал: Блок 5 "Операции с массивами"

📝 Подготовительный код для урока:

// Загружаем данные из файла (как в блоке 5) using CSV, DataFrames; cd(@_DIR_); data = CSV.read("datafile.csv", DataFrame, header=0) // Создаём переменные для работы density = data[:,2]; // плотности материалов v1 = data[:,3]; // объёмы v2 = data[:,4]; // прочности

📈 Задача 1: Прибавление скаляра к массиву

Код из блока 5: r = v1 .+ 1

Технический пример: Калибровка датчиков давления
Датчики на трубопроводе показывают давление в барах. Нужно добавить систематическую погрешность +0.5 бара.
// Показания 4 датчиков давления (бары) pressure = [3.2, 4.1, 3.8, 4.3]; // Калибровка: добавляем погрешность 0.5 бара calibrated = pressure .+ 0.5; // Результат: [3.7, 4.6, 4.3, 4.8] бар

📊 Задача 2: Сложение двух векторов

Код из блока 5: vs = v1 + v2

Технический пример: Расчёт суммарной нагрузки на опоры моста
Нужно сложить нагрузку от транспорта и постоянную нагрузку от конструкции.
// Нагрузка от транспорта (тонны) на 4 опоры vehicle_load = [12.5, 10.3, 14.2, 11.8]; // Постоянная нагрузка от конструкции (тонны) structure_load = [8.0, 8.0, 8.0, 8.0]; // Общая нагрузка на каждую опору total_load = vehicle_load + structure_load; // Результат: [20.5, 18.3, 22.2, 19.8] тонн

📑 Задача 3: Деление массива на скаляр

Код из блока 5: va = vs / 2

Технический пример: Перевод единиц измерения
Переводим измерения длины из сантиметров в метры.
// Измерения длины в сантиметрах (от лазерного дальномера) length_cm = [150.0, 230.0, 185.0, 210.0]; // Переводим в метры (1 м = 100 см) length_m = length_cm / 100; // Результат: [1.5, 2.3, 1.85, 2.1] метров

📈 Задача 4: Поиск максимального значения

Код из блока 5: vm = maximum(v1)

Технический пример: Анализ температуры двигателя
Находим самый горячий цилиндр двигателя после теста.
// Температура 6 цилиндров двигателя (°C) temps = [85.3, 92.1, 87.4, 95.6, 88.9, 91.2]; // Находим самый горячий цилиндр hottest = maximum(temps); // Проверяем, не превышает ли безопасный предел (100°C) if hottest > 100 println("Перегрев! Температура: ", hottest, "°C"); else println("В норме. Максимальная температура: ", hottest, "°C"); end // Результат: "В норме. Максимальная температура: 95.6°C"

📊 Задача 5: Применение функции к каждому элементу

Код из блока 5: vr = round.(v1)

Технический пример: Округление показаний для панели управления
Округляем точные измерения напряжения для вывода на дисплей.
// Точные измерения напряжения с мультиметра (вольты) voltage_precise = [12.347, 11.892, 12.056, 11.734]; // Округляем для вывода на дисплей (до десятых) voltage_display = round.(voltage_precise, digits=1); // Результат: [12.3, 11.9, 12.1, 11.7] вольт

📊 Задача 6: Поэлементное умножение массивов

Код из блока 5: mass = density .* v1

Технический пример: Расчёт энергии в аккумуляторах
Рассчитываем энергию = ёмкость × напряжение для каждого аккумулятора.
// Ёмкость аккумуляторов (А·ч) capacity = [2.5, 3.0, 1.8, 2.2]; // Напряжение каждого аккумулятора (В) voltage = [3.7, 3.7, 3.7, 3.7]; // Энергия = ёмкость × напряжение (Вт·ч) energy = capacity .* voltage; // Результат: [9.25, 11.1, 6.66, 8.14] Вт·ч // Суммарная энергия батареи: total_energy = sum(energy); // 35.15 Вт·ч

📝 Домашнее задание (5 задач)

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

Практика операций с массивами

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

Задачи для самостоятельного решения:

Задача 1: Калибровка анемометра

У вас есть массив скоростей ветра: [5, 7, 12, 9] м/с

Задание: Добавьте 2 м/с к каждому значению (поправка на высоту установки)

Используйте: ветер_скорректированный = ветер .+ 2

Задача 2: Расчёт выработки электроэнергии

Дневная выработка: [100, 120, 90] кВт·ч

Ночная выработка: [80, 70, 85] кВт·ч

Задание: Найдите суточную выработку для каждого дня

Используйте: суммарная = дневная + ночная

Задача 3: Перевод температур

Температуры пациентов: [36.6, 37.2, 36.8] °C

Задание: Переведите их в Кельвины по формуле: K = C + 273.15

Используйте: кельвины = цельсии .+ 273.15

Задача 4: Поиск пикового напряжения

Напряжения в цепи: [12.1, 11.8, 12.5, 11.9, 12.3] В

Задание: Найдите максимальное напряжение в цепи

Используйте: пиковое = maximum(напряжения)

Задача 5: Расчёт массы груза

Плотности материалов: [2.7, 7.8, 11.3] г/см³ (алюминий, сталь, свинец)

Объёмы деталей: [10, 5, 3] см³

Задание: Рассчитайте массу каждой детали

Используйте: масса = плотности .* объёмы

Требования к выполнению:

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

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

❓ Частые вопросы по блоку 5

Чем отличается .+ от +?

.+ - поэлементное сложение (добавляет число к КАЖДОМУ элементу массива). + - обычное сложение (складывает два массива целиком, если они одинакового размера).

Что делать, если массивы разного размера?

Julia выдаст ошибку DimensionMismatch. Проверяйте размеры массивов функцией size() перед операциями.

Как умножить матрицу на число?

Используйте обычное умножение: A * 2 или поэлементное A .* 2 - оба варианта работают.

Какие ещё статистические функции есть?

minimum() - минимум, mean() - среднее, sum() - сумма, std() - стандартное отклонение.

🔗 Полезные материалы

💡 Советы для ДЗ:

  • Начинайте с создания массива данных
  • Проверяйте каждую операцию сразу с println()
  • Используйте одинаковые названия переменных, как в примерах
  • Не забывайте про точку в поэлементных операциях
Урок 16: Вызов функций для анализа в Engee

16. Вызов функций для анализа

📅 27 января 2025 ⏱ 40 минут

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

  1. 0:05 Повторение ДЗ, вопросы
  2. 0:10 Изучение Блока 6: size(), findmax()
  3. 0:15 Технические примеры
  4. 0:05 Домашнее задание
  5. 0:05 Итоги

🎯 Основной материал: Блок 6 "Вызов функций"

📝 Подготовительный код:

// Подключение библиотек using CSV, DataFrames; // Загружаем данные (предположим, есть файл beam_data.csv) cd(@_DIR_); beam_data = CSV.read("beam_data.csv", DataFrame, header=0); // Создаём вектор прогибов из данных beam_deflection = beam_data[:, "Deflection_mm"];

📈 Пример 1: Определение размеров системы

Код из блока 6: s = size(x)

Технический пример: Анализ матрицы напряжений
Определить размеры матрицы напряжений с 3-х датчиков за 24 часа.
// Матрица напряжений: 3 датчика × 24 часа voltage_matrix = rand(3, 24) * 12; // случайные данные 0-12В // Определяем размеры matrix_size = size(voltage_matrix); println("Размер матрицы: ", matrix_size); // (3, 24) println("Количество датчиков: ", matrix_size[1]); // 3 println("Количество измерений: ", matrix_size[2]); // 24

📊 Пример 2: Поиск максимального прогиба балки

Код из блока 6: (xMax, idx) = findmax(x)

Технический пример: Анализ конструкции
Найти максимальный прогиб балки и точку, где он происходит.
// Вектор прогибов балки в 100 точках (мм) beam_deflection = rand(100) * 10; // случайные прогибы 0-10 мм // Находим максимальный прогиб и его позицию (max_deflection, point_of_max) = findmax(beam_deflection); println("Максимальный прогиб: ", max_deflection, " мм"); println("Точка максимального прогиба: №", point_of_max); // Проверяем, не превышает ли допустимый предел (8 мм) if max_deflection > 8 println("⚠️ Превышен допустимый прогиб!"); else println("✓ Прогиб в пределах нормы"); end

📑 Пример 3: Анализ энергопотребления

Новые функции: sum(), mean()

Технический пример: Мониторинг цеха
Рассчитать общее и среднее энергопотребление за смену.
// Потребление тока 6 станков за смену (А) using Statistics // для функции mean() current_consumption = [15.2, 22.5, 18.7, 12.3, 25.1, 19.8]; // Суммарный ток total_current = sum(current_consumption); println("Суммарный ток: ", total_current, " А"); // Средний ток на станок avg_current = mean(current_consumption); println("Средний ток на станок: ", round(avg_current, digits=2), " А"); // Проверка на перегрузку (сумма > 100 А) if total_current > 100 println("⚠️ Перегрузка! Суммарный ток превышает 100 А"); else println("✓ Нагрузка в пределах нормы"); end

📝 Домашнее задание (4 задачи)

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

Функции для анализа технических систем

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

Задача 1: Анализ температуры

Температура 5 термопар: [215, 198, 230, 205, 222] °C

Задание: Найдите максимальную и минимальную температуру и их индексы

Используйте: findmax() и findmin()

Задача 2: Анализ мощности

Создайте матрицу мощности: power = [100 110 95; 120 105 98; 115 108 102] кВт

Задание: Определите размеры матрицы (сколько агрегатов и периодов)

Используйте: size()

Задача 3: Расход воды на ТЭЦ

Суточный расход: [1200, 1150, 1300, 1100] м³

Задание: Найдите суммарный расход за 4 дня и среднесуточный

Используйте: sum() и mean()

Задача 4: Вибрация подшипника

Вектор вибрации: [2.1, 3.5, 2.8, 4.2, 3.1, 2.9] мм/с

Задание: Найдите максимальный уровень и выведите: "Пик вибрации: [значение] на замере №[индекс]"

Используйте: findmax()

Требования к выполнению:

  • Для каждой задачи создайте отдельную ячейку в Engee
  • Добавьте комментарии на русском языке
  • Выведите результаты с помощью println()
  • Используйте правильные названия переменных
  • Сохраните код
Урок 17: Визуализация данных в технике

17. Визуализация данных в технике

📅 3 февраля 2025 ⏱ 40 минут

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

  1. 0:05 Проверка ДЗ, вопросы
  2. 0:10 Блок 7: plot(), scatter(), histogram()
  3. 0:15 Технические графики и аннотации
  4. 0:05 Домашнее задание
  5. 0:05 Итоги урока

🎯 Основной материал: Блок 7 "Построение графиков"

📝 Подготовительный код:

// Подключаем библиотеку для графиков using Plots // Данные для примеров time = 9:1:18 // время с 9 до 18 часов temperature = [65, 72, 78, 82, 85, 87, 89, 90, 88, 85] // температура двигателя pressure = [2.1, 2.3, 2.5, 2.7, 2.8, 2.9, 3.0, 3.1, 3.0, 2.9] // давление масла

📈 Пример 1: График температуры двигателя

Код из блока 7: plot(x, y)

Технический пример: Мониторинг температуры
Построить график изменения температуры двигателя во время тестового цикла.
// Простой график температуры plot(time, temperature) // График с настройками plot(time, temperature, title = "Температура двигателя", xlabel = "Время, ч", ylabel = "Температура, °C", label = "Температура", linewidth = 2, color = :red )
График температуры двигателя
Время → Температура

📊 Пример 2: Точечная диаграмма КПД

Код из блока 7: scatter(x, y, ...)

Технический пример: Зависимость КПД от нагрузки
Визуализация экспериментальных данных КПД солнечной панели.
// Данные эксперимента illumination = [200, 400, 600, 800, 1000] // Вт/м² efficiency = [12.1, 14.5, 15.8, 16.0, 15.5] // % // Точечная диаграмма scatter(illumination, efficiency, title = "Зависимость КПД панели от освещения", xlabel = "Освещенность, Вт/м²", ylabel = "КПД, %", label = "Измерения", markershape = :circle, markercolor = :blue, markersize = 8 ) // Добавляем заголовок (альтернативный способ) title!("КПД солнечной панели") xlabel!("Интенсивность освещения") ylabel!("Эффективность, %")

📑 Пример 3: Гистограмма распределения размеров

Код из блока 7: histogram(x)

Технический пример: Контроль качества деталей
Анализ распределения диаметров валов после обработки.
// Измерения диаметров 50 валов (мм) using Random Random.seed!(123) // для воспроизводимости diameters = randn(50) * 0.1 .+ 15.0 // нормальное распределение вокруг 15 мм // Гистограмма распределения histogram(diameters, title = "Распределение диаметров валов", xlabel = "Диаметр, мм", ylabel = "Количество", label = "Измерения", bins = 10, // количество столбцов color = :green, alpha = 0.7 // прозрачность ) // Добавляем линии допусков vline!([14.95, 15.05], // нижний и верхний допуск label = ["Нижний допуск" "Верхний допуск"], linewidth = 2, linestyle = :dash )

📊 Пример 4: Сравнение параметров системы

Технический пример: Мониторинг двух параметров
Построение температуры и давления на одном графике.
// Первый график - температура plot(time, temperature, title = "Параметры двигателя", xlabel = "Время, ч", label = "Температура", linewidth = 2, color = :red, legend = :topleft ) // Добавляем второй график - давление plot!(time, pressure, label = "Давление масла", linewidth = 2, color = :blue, ylabel = "Температура (°C) / Давление (бар)" ) // Добавляем сетку для удобства чтения grid!(:both, alpha=0.3)

📝 Домашнее задание (4 задачи)

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

Визуализация технических данных

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

Задача 1: График нагрузки сети

Данные: time = [9, 12, 15, 18, 21] ч
load = [80, 120, 110, 95, 70] МВт

Задание: Постройте график с заголовком "Суточный график нагрузки"

Используйте: plot(), title!()

Задача 2: Точечная диаграмма

Экспериментальные данные: x = [1,2,3,4,5]
y1 = [2,4,5,4,5]

Задание: Постройте график с маркерами в виде кругов и линией

Используйте: scatter() и plot!()

Задача 3: Гистограмма дефектов

Данные дефектов: defects = [0,1,0,2,1,1,3,0,1,2]
(количество дефектов в 10 партиях)

Задание: Постройте гистограмму распределения

Используйте: histogram()

Задача 4: Два графика на одном

Синус и косинус: x = range(0, 2π, 50)
y1 = sin.(x), y2 = 0.5*cos.(x)

Задание: Постройте оба графика с легендой

Используйте: plot() и plot!()

Требования к выполнению:

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

Советы по работе с графиками:

  • plot() - создаёт новый график
  • plot!() - добавляет на существующий график
  • Цвета можно задавать как :red, :blue, :green
  • Маркеры: :circle, :square, :cross
  • Для добавления сетки используйте grid!(:both)
Урок 18: Импорт и обработка табличных данных

18. Импорт и обработка табличных данных

📅 10 февраля 2025 ⏱ 40 минут

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

  1. 0:05 Проверка графиков ДЗ
  2. 0:10 Блок 8: CSV.read(), DataFrame
  3. 0:15 Работа с таблицами техданных
  4. 0:05 Домашнее задание
  5. 0:05 Практика в Engee

🎯 Основной материал: Блок 8 "Импорт данных"

📝 Подготовка файла данных:

Создайте файл pump_log.csv с содержимым:

TimePressure_BarFlowRate_lmin
9:002.1120
10:002.3125
11:002.5130
12:002.7135
13:002.8140

📥 Пример 1: Импорт данных насоса

Код из блока 8: CSV.read("file.csv", DataFrame)

Технический пример: Загрузка логов оборудования
Импорт данных о работе насосной станции из CSV-файла.
// Подключаем библиотеки using CSV, DataFrames // Загружаем данные из файла cd(@_DIR_); pump_data = CSV.read("pump_log.csv", DataFrame); // Просматриваем данные println("Размер таблицы: ", size(pump_data)); println("Первые 3 строки:"); display(pump_data[1:3, :]); // Получаем информацию о столбцах println("Столбцы таблицы:"); for col in names(pump_data) println(" - ", col); end

📊 Пример 2: Работа со столбцами данных

Код из блока 8: dataframe.column_name

Технический пример: Анализ параметров насоса
Извлечение и анализ давления и расхода из таблицы.
// Способ 1: Через точку (если имя столбца без пробелов) pressure = pump_data.Pressure_Bar; flow_rate = pump_data.FlowRate_lmin; println("Среднее давление: ", mean(pressure), " бар"); println("Средний расход: ", mean(flow_rate), " л/мин"); // Способ 2: Через строку с именем столбца using Statistics max_pressure = maximum(pump_data[!, "Pressure_Bar"]); min_flow = minimum(pump_data[!, "FlowRate_lmin"]); println("Максимальное давление: ", max_pressure, " бар"); println("Минимальный расход: ", min_flow, " л/мин"); // Создаём простой график using Plots plot(1:length(pressure), pressure, label = "Давление", xlabel = "Измерение", ylabel = "Бар", title = "Изменение давления насоса" )

📊 Пример 3: Расчёт мощности насоса

Новая операция: Создание столбца с расчётами

Технический пример: Расчёт мощности по формуле
Добавление в таблицу столбца с расчётной мощностью насоса.
// Формула: Мощность (кВт) = (Давление × Расход) / 600 // Создаём новый столбец pump_data.Мощность_кВт = (pump_data.Pressure_Bar .* pump_data.FlowRate_lmin) ./ 600; // Выводим обновлённую таблицу println("Таблица с расчётной мощностью:"); display(pump_data); // Анализ результатов total_power = sum(pump_data.Мощность_кВт); avg_power = mean(pump_data.Мощность_кВт); println("Суммарная мощность за период: ", round(total_power, digits=2), " кВт"); println("Средняя мощность: ", round(avg_power, digits=2), " кВт"); // Добавляем ещё один столбец - КПД (предположим, номинальная мощность 0.8 кВт) pump_data.КПД = pump_data.Мощность_кВт ./ 0.8 .* 100; // в процентах println("Столбцы после добавления КПД:"); display(names(pump_data));

📊 Пример 4: Сортировка по параметрам

Код из блока 8: sort(dataframe, "column")

Технический пример: Сортировка материалов по прочности
Создание и сортировка таблицы свойств материалов.
// Создаём таблицу материалов materials = DataFrame( Название = ["Алюминий", "Сталь", "Медь", "Титан"], Плотность = [2.7, 7.8, 8.9, 4.5], // г/см³ Прочность = [90, 250, 210, 240], // МПа Стоимость = [150, 80, 300, 500] // руб/кг ); println("Исходная таблица материалов:"); display(materials); // Сортировка по прочности (по возрастанию) materials_sorted_by_strength = sort(materials, "Прочность"); println("Сортировка по прочности (возрастание):"); display(materials_sorted_by_strength); // Сортировка по стоимости (по убыванию) materials_sorted_by_cost = sort(materials, "Стоимость", rev=true); println("Сортировка по стоимости (убывание):"); display(materials_sorted_by_cost); // Сортировка по двум параметрам materials_sorted_complex = sort(materials, ["Прочность", "Плотность"], rev=[true, false]); println("Сначала по прочности (убыв.), потом по плотности (возр.):"); display(materials_sorted_complex);

📝 Домашнее задание (4 задачи)

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

Работа с табличными данными

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

Создайте файл materials.csv со следующими данными:

NameDensity_gcm3YoungModula_GPaCost_rub_kg
Алюминий2.770150
Сталь7.820080
Медь8.9110300
Титан4.5116500

Задача 1: Импорт данных

Задание: Загрузите таблицу materials.csv

Используйте: CSV.read("materials.csv", DataFrame)

Выведите: Размер таблицы и названия столбцов

Задача 2: Перевод единиц

Задание: Создайте новый столбец "Density_kgm3"

Формула: кг/м³ = г/см³ × 1000

Используйте: materials.Density_kgm3 = ...

Задача 3: Сортировка

Задание: Отсортируйте таблицу по стоимости (по возрастанию)

Используйте: sort(materials, "Cost_rub_kg")

Выведите: Отсортированную таблицу

Задача 4: Выбор данных

Задание: Выведите названия и модули упругости 3 самых дешёвых материалов

Используйте: materials[1:3, ["Name", "YoungModula_GPa"]]

Требования к выполнению:

  • Создайте файл materials.csv с данными выше
  • Для каждой задачи создайте отдельную ячейку в Engee
  • Добавьте комментарии на русском языке
  • Выводите результаты с помощью println() или display()
  • Сохраните код с табличными операциями
💡 Важные моменты

Работа с DataFrame:

  • names(df) - получить имена столбцов
  • size(df) - размеры таблицы (строки, столбцы)
  • df.column_name - доступ к столбцу через точку
  • df[!, "column"] - доступ через строку
  • sort(df, "col") - сортировка по столбцу
  • Для создания нового столбца просто присвойте значения

Совет: Всегда проверяйте размеры таблицы после операций!

Урок 19: Логические массивы и фильтрация

19. Логические массивы и фильтрация

📅 17 февраля 2025 ⏱ 40 минут

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

  1. 0:05 Проверка работы с таблицами
  2. 0:10 Блок 9: Логические операторы .>, .<
  3. 0:15 Фильтрация технических данных
  4. 0:05 Домашнее задание
  5. 0:05 Практика фильтрации

🎯 Основной материал: Блок 9 "Бинарные массивы"

📝 Подготовительный код:

// Данные температуры с 10 датчиков (°C) temperatures = [85.3, 92.1, 87.4, 95.6, 88.9, 91.2, 96.8, 89.5, 93.7, 90.1]; // Данные диаметров деталей (мм) diameters = [14.97, 15.03, 14.99, 15.08, 14.92, 15.01, 14.96, 15.05, 14.98, 15.02]; // Показания датчика напряжения (В) - возможны сбои voltages = [12.3, 11.9, -0.5, 12.1, 11.8, 12.4, -0.2, 11.7, 12.0, 11.6];

📈 Пример 1: Поиск аварийных температур

Код из блока 9: y = v1 .< 4

Технический пример: Мониторинг перегрева
Найти все датчики с температурой выше аварийного порога 95°C.
// Создаём логический массив (маску) overheat_mask = temperatures .> 95; println("Маска перегрева:", overheat_mask); println("Количество перегревов: ", sum(overheat_mask)); // Получаем фактические температуры перегрева overheat_temps = temperatures[overheat_mask]; println("Температуры перегрева: ", overheat_temps); // Получаем номера датчиков с перегревом sensor_numbers = 1:length(temperatures); overheat_sensors = sensor_numbers[overheat_mask]; println("Датчики с перегревом: №", overheat_sensors); // Формируем сообщение if any(overheat_mask) println("⚠️ ВНИМАНИЕ: Обнаружен перегрев!"); for (sensor, temp) in zip(overheat_sensors, overheat_temps) println(" Датчик №", sensor, ": ", temp, "°C"); end else println("✓ Все температуры в норме"); end

📊 Пример 2: Контроль качества деталей

Код из блока 9: z = v1[v1 .< 4]

Технический пример: Отбор бракованных деталей
Найти детали с диаметром вне допуска 15.00±0.05 мм.
// Допуски: от 14.95 до 15.05 мм lower_limit = 14.95; upper_limit = 15.05; // Маска для бракованных деталей (вне допуска) defective_mask = (diameters .< lower_limit) .| (diameters .> upper_limit); ok_mask = (diameters .>= lower_limit) .& (diameters .<= upper_limit); println("Бракованные детали: ", defective_mask); println("Годные детали: ", ok_mask); // Статистика println("Всего деталей: ", length(diameters)); println("Годных: ", sum(ok_mask)); println("Бракованных: ", sum(defective_mask)); // Диаметры бракованных деталей defective_diameters = diameters[defective_mask]; ok_diameters = diameters[ok_mask]; println("Диаметры бракованных деталей: ", defective_diameters); println("Диаметры годных деталей: ", ok_diameters); // Вычисляем процент брака defect_percentage = sum(defective_mask) / length(diameters) * 100; println("Процент брака: ", round(defect_percentage, digits=2), "%"); // Проверка на соответствие стандарту (брак ≤ 5%) if defect_percentage > 5 println("⚠️ Превышен допустимый процент брака!"); else println("✓ Качество соответствует стандарту"); end

📊 Пример 3: Очистка данных датчика

Код из блока 9: v1[v1.<4] .= 0

Технический пример: Исправление сбоев датчика
Заменить все отрицательные (ошибочные) показания напряжения на 0.
// Исходные данные с ошибками println("Исходные напряжения:", voltages); // Находим ошибочные показания (отрицательные) error_mask = voltages .< 0; println("Маска ошибок:", error_mask); println("Количество ошибок: ", sum(error_mask)); // Исправляем ошибки voltages[error_mask] .= 0; println("Исправленные напряжения:", voltages); // Проверяем, остались ли ошибки if any(voltages .< 0) println("⚠️ Остались неисправленные ошибки!"); else println("✓ Все ошибки исправлены"); end // Вычисляем среднее напряжение (без ошибок) valid_mask = voltages .> 0; valid_voltages = voltages[valid_mask]; if length(valid_voltages) > 0 avg_voltage = mean(valid_voltages); println("Среднее напряжение (по исправленным): ", round(avg_voltage, digits=2), " В"); else println("⚠️ Нет валидных данных для расчёта"); end

📊 Пример 4: Анализ рабочего диапазона

Технический пример: Отбор данных в рабочем диапазоне
Найти все температуры в рабочем диапазоне 85-93°C.
// Рабочий диапазон температур working_temp_min = 85; working_temp_max = 93; // Маска для температур в рабочем диапазоне working_mask = (temperatures .>= working_temp_min) .& (temperatures .<= working_temp_max); println("Температуры в рабочем диапазоне (85-93°C): ", working_mask); // Температуры в диапазоне working_temps = temperatures[working_mask]; println("Значения в диапазоне: ", working_temps); // Температуры вне диапазона outside_mask = .!working_mask; // инвертируем маску outside_temps = temperatures[outside_mask]; println("Значения вне диапазона: ", outside_temps); // Статистика println("Всего измерений: ", length(temperatures)); println("В рабочем диапазоне: ", length(working_temps)); println("Вне рабочего диапазона: ", length(outside_temps)); // Визуализация using Plots scatter(1:length(temperatures), temperatures, group=working_mask, // автоматическая группировка по маске title = "Температуры: рабочий диапазон 85-93°C", xlabel = "Номер измерения", ylabel = "Температура, °C", label = ["Вне диапазона" "В диапазоне"], markersize = 8 ) // Добавляем линии рабочего диапазона hline!([working_temp_min, working_temp_max], label = ["Нижняя граница" "Верхняя граница"], linestyle = :dash, linewidth = 2 )

📝 Домашнее задание (4 задачи)

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

Фильтрация технических данных

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

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

Дан вектор напряжений:
u = [12.3, 0.5, 11.9, 12.1, -0.1, 12.0] В

Задание: Создайте маску для значений от 11.5 до 12.5 В

Используйте: mask = (u .>= 11.5) .& (u .<= 12.5)

Задача 2: Фильтрация корректных значений

Тот же вектор напряжений

Задание: Получите вектор "корректных" напряжений по маске

Используйте: correct_u = u[mask]

Выведите: Среднее корректное напряжение

Задача 3: Исправление ошибок

Тот же вектор напряжений

Задание: Замените все значения меньше 0 на 0

Используйте: u[u .< 0] .= 0

Выведите: Исправленный вектор

Задача 4: Анализ оборотов

Обороты двигателя: rpm = [1450, 0, 1500, 1550, 10, 1520] об/мин

Задание: Найдите все ненулевые значения

Используйте: mask = rpm .!= 0

Выведите: Только рабочие обороты и их среднее

Требования к выполнению:

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

Операторы для фильтрации:

  • .> - больше (поэлементно)
  • .< - меньше (поэлементно)
  • .>= - больше или равно
  • .<= - меньше или равно
  • .== - равно
  • .!= - не равно
  • .& - И (логическое умножение)
  • .| - ИЛИ (логическое сложение)
  • .! - НЕ (инверсия)

Пример сложного условия:
mask = (x .> 5) .& (x .< 10) .& (x .!= 7)

Урок 20: Основы программирования: условия и циклы

20. Основы программирования: условия и циклы

📅 24 февраля 2025 ⏱ 40 минут

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

  1. 0:05 Проверка фильтрации данных
  2. 0:10 Блок 10: if-else, for-циклы
  3. 0:15 Автоматизация технических расчётов
  4. 0:05 Домашнее задание
  5. 0:05 Подготовка к финальному проекту

🎯 Основной материал: Блок 10 "Программирование"

📝 Подготовительный код:

// Данные для примеров boiler_pressure = 105; // давление в котле (бар) critical_temperature = 95; // критическая температура (°C) temperatures = [85, 90, 92, 96, 88]; // температуры 5 датчиков // Для моделирования разряда конденсатора initial_voltage = 10.0; // начальное напряжение (В) discharge_factor = 0.9; // коэффициент разряда

📈 Пример 1: Контроль давления в котле

Код из блока 10: if условие ... else ... end

Технический пример: Система безопасности
Проверка давления и вывод соответствующих сообщений.
// Простая проверка давления if boiler_pressure > 100 println("⚠️ АВАРИЯ: Давление превышено! ", boiler_pressure, " бар"); else println("✓ Давление в норме: ", boiler_pressure, " бар"); end // Проверка с несколькими условиями if boiler_pressure > 120 println("???? КРИТИЧЕСКОЕ ДАВЛЕНИЕ! Немедленно остановить систему!"); elseif boiler_pressure > 100 println("???? ПРЕДУПРЕЖДЕНИЕ: Давление接近 предела: ", boiler_pressure, " бар"); elseif boiler_pressure > 80 println("???? Нормальное давление: ", boiler_pressure, " бар"); else println("⚪ Слишком низкое давление: ", boiler_pressure, " бар"); end // Проверка температуры датчиков for (i, temp) in enumerate(temperatures) if temp > critical_temperature println("Датчик №", i, ": ПЕРЕГРЕВ! ", temp, "°C"); elseif temp > critical_temperature - 5 println("Датчик №", i, ": Внимание, высокая температура: ", temp, "°C"); else println("Датчик №", i, ": Норма: ", temp, "°C"); end end

📊 Пример 2: Моделирование разряда конденсатора

Код из блока 10: for переменная in диапазон ... end

Технический пример: Пошаговое моделирование
Рассчитать напряжение на конденсаторе в течение 10 шагов разряда.
// Простой цикл для моделирования разряда voltage = initial_voltage; println("Моделирование разряда конденсатора:"); println("Начальное напряжение: ", voltage, " В"); for step in 1:10 voltage = voltage * discharge_factor; // напряжение уменьшается println("Шаг ", step, ": Напряжение = ", round(voltage, digits=2), " В"); // Проверка критического уровня if voltage < 3.0 println(" ⚠️ Напряжение ниже минимального!"); end end println("Конечное напряжение: ", round(voltage, digits=2), " В"); // Более сложный пример с сохранением результатов n_steps = 15; voltage_history = zeros(n_steps); // создаём массив для истории voltage_history[1] = initial_voltage; for step in 2:n_steps voltage_history[step] = voltage_history[step-1] * discharge_factor; end println("История напряжений: ", round.(voltage_history, digits=2));

📊 Пример 3: Проверка серии датчиков

Технический пример: Система пожарной сигнализации
Проверить 10 датчиков пламени и включить тревогу при обнаружении.
// Симуляция показаний 10 датчиков пламени (true = пламя обнаружено) using Random Random.seed!(42); // для воспроизводимости flame_sensors = rand(Bool, 10); // случайные true/false println("Показания датчиков пламени: ", flame_sensors); // Проверка датчиков в цикле fire_detected = false; fire_sensors = Int[]; // массив для номеров сработавших датчиков for (sensor_num, has_fire) in enumerate(flame_sensors) if has_fire fire_detected = true; push!(fire_sensors, sensor_num); // добавляем номер датчика println(" Датчик №", sensor_num, ": ОБНАРУЖЕНО ПЛАМЯ!"); else println(" Датчик №", sensor_num, ": норма"); end end // Итоговый вывод if fire_detected println("???? ПОЖАРНАЯ ТРЕВОГА! Сработали датчики: №", fire_sensors); println("Действия: 1. Включить пожарную сигнализацию"); println(" 2. Активировать систему пожаротушения"); println(" 3. Эвакуировать персонал"); else println("✓ Пожарная обстановка в норме"); end // Статистика println("Всего датчиков: ", length(flame_sensors)); println("Сработало: ", length(fire_sensors)); println("Процент срабатывания: ", length(fire_sensors)/length(flame_sensors)*100, "%");

📊 Пример 4: Моделирование заполнения бака

Технический пример: Контроль уровня жидкости
Моделирование заполнения бака с контролем переполнения.
// Параметры системы tank_capacity = 1000; // литров current_level = 200; // начальный уровень fill_rate = 150; // литров в минуту max_safe_level = 900; // максимальный безопасный уровень // Моделирование заполнения println("Моделирование заполнения бака:"); println("Начальный уровень: ", current_level, " л"); println("Ёмкость бака: ", tank_capacity, " л"); println("Скорость заполнения: ", fill_rate, " л/мин"); for minute in 1:10 // моделируем 10 минут current_level += fill_rate; // Проверка условий if current_level >= tank_capacity println("Минута ", minute, ": ???? БАК ПЕРЕПОЛНЕН! ", current_level, " л"); println(" Действие: Немедленно остановить насос!"); break; // прерываем цикл elseif current_level >= max_safe_level println("Минута ", minute, ": ⚠️ Приближение к максимуму: ", current_level, " л"); elseif current_level >= tank_capacity * 0.8 println("Минута ", minute, ": ???? 80% заполнения: ", current_level, " л"); else println("Минута ", minute, ": Нормальное заполнение: ", current_level, " л"); end end // Итоговый отчёт println("\nИтоговый отчёт:"); println("Финальный уровень: ", current_level, " л"); println("Заполнено: ", current_level/tank_capacity*100, "%"); if current_level > max_safe_level println("⚠️ Внимание: уровень превысил безопасный предел!"); end

📝 Домашнее задание (4 задачи)

ДЗ #8 📅 Срок сдачи: 3 марта 2025 🏆 Макс. балл: 4 балла

Автоматизация технических расчётов

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

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

Задание: Напишите цикл for, который выводит квадраты чисел от 1 до 5

Используйте: for i in 1:5 ... end

Формат: "Квадрат числа X = Y"

Задача 2: Цикл с фильтрацией

Дан вектор: signal = [0.1, 1.5, 0.3, 2.0, 0.4]

Задание: Напишите цикл, который выводит только значения больше 1

Используйте: if value > 1 ... end

Задача 3: Условия температуры

Температура системы: t = 35 (°C)

Задание: Напишите условия:

  • если t > 40 → "Перегрев"
  • если t между 20 и 40 → "Норма"
  • иначе → "Низкая"

Задача 4: Моделирование заполнения

Начальный уровень бака: 0 литров

Задание: Смоделируйте 5 шагов заполнения

Шаг: каждый шаг +10% от ёмкости (1000 л)

Выведите: Уровень на каждом шаге

Требования к выполнению:

  • Для каждой задачи создайте отдельную ячейку в Engee
  • Добавьте комментарии на русском языке
  • Используйте правильные отступы в циклах
  • Выводите результаты на каждом шаге
  • Сохраните код с программами
💡 Следующий урок: Финальный проект

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

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

  • Данные: Импорт или создание массивов
  • Анализ: Функции size(), findmax(), mean()
  • Фильтрация: Логические массивы для отбора
  • Программирование: Циклы и условия
  • Визуализация: Графики для результатов

Примерные темы проектов:

  1. Тепловой баланс помещения
  2. Анализ эффективности станков
  3. Система контроля качества
  4. Мониторинг энергопотребления

Подумайте, какую систему вы хотели бы смоделировать!

Made on
Tilda