Основы программирования в Engee
Библиотеки
Установка и подключение библиотек
Введение
Библиотеки Julia – это организованный набор готовых функций, классов и объектов для решения различных задач. Библиотеки Julia распространяются в виде пакетов, которые можно установить с помощью менеджера пакетов Pkg и использовать в своих проектах.
В Engee работа с библиотеками Julia также осуществляется через встроенный менеджер пакетов Pkg.
Принцип работы с библиотеками
Найдите точное название интересующей вас библиотеки. Экосистема Julia содержит более 10 000 пакетов, зарегистрированных в общем реестре, что может сильно затруднить поиск нужного пакета. Для оптимизации поиска рекомендуем обратиться к следующим источникам:
- Прикладные применения – раздел документации Engee с описанием большого числа библиотек.
- JuliaHub – сервис для поиска по всей зарегистрированной документации пакетов с открытым исходным кодом с возможностью сортировки по тегам и ключевым словам.
- Julia Packages – онлайн-ресурс, предназначенный для поиска, изучения и просмотра пакетов Julia с возможностью настройки фильтров по категориям, популярности и датам.
- Julia.jl – главный репозиторий пакетов для языка программирования Julia. Этот репозиторий хранится на платформе GitHub и содержит множество полезных пакетов и инструментов, разработанных сообществом для работы с языком Julia.
Инициализируйте работу с пакетами в Julia, добавив менеджер пакетов Pkg.
Добавьте библиотеки с помощью команды add в ваше окружение, чтобы использовать их в своем проекте.
Загрузите библиотеку в пространство имен и получите доступ к ее конкретным элементам с помощью команд using и import. Вы также можете добавить и собственные библиотеки.
При необходимости узнайте статус библиотек через status и удалите ненужные с помощью команд remove или rm.
Работа с библиотеками Julia в редакторе скриптов
Чтобы установить новую библиотеку в интерактивном скрипте Engee, выполните команду Pkg.add("Имя библиотеки"). Например, секция с кодом для добавления библиотеки Example будет выглядеть так:
Pkg.add("Example")
После запуска этой ячейки будет установлена библиотека Example. Информация о ходе установки библиотеки отобразится автоматически:
Resolving package versions...
Installed Example ─ v0.5.3
Updating `/user/start/Project.toml`
[7876af07] + Example v0.5.3
Updating `/user/start/Manifest.toml`
[7876af07] + Example v0.5.3
Как и в случае с командной строкой, вы можете добавить несколько библиотек одновременно, перечисляя их имена через запятую и добавляя квадратные скобки для создания массива строк, например:
Pkg.add(["Example", "Plots"])
Для удаления библиотеки используется команда rm:
Pkg.rm("Example")
Для удаления нескольких библиотек одновременно используется перечисление их имен через запятую и квадратные скобки:
Pkg.rm(["Example", "Plots"])
Команда remove не определяется в редакторе скриптов, хотя и используется в командной строке. Попытка вызвать команду remove в редакторе скриптов выдаст ошибку.
Примечание
Имена библиотек Julia чувствительны к регистру и должны начинаться с заглавной буквы, в противном случае вы получите сообщение об ошибке.
✏️Задание 1
В редакторе скриптов установите библиотеку StatsPlots.jl, предназначенную для построения статистических графиков.
Подсказка
Установите библиотеку с помощью команды Pkg.add("Имя библиотеки"). Имя библиотеки запишите в двойных кавычках. Расширение .jl писать не нужно.
Решение
Pkg.add("StatsPlots")
Узнать, какие библиотеки установлены и готовы к использованию, можно с помощью команды Pkg.status() для получения статуса библиотек:
Pkg.status()
Загрузка библиотек
В Julia для загрузки библиотек и предоставления доступа к их конкретным элементам, таким как функции, типы и переменные, используются операторы import и using.
Оба оператора позволят вам использовать функции из библиотек или загружать их, но есть небольшая разница в том, как они экспортируются в текущее пространство имен:
using– экспортирует все функции.import– требует явного указания, какие функции нужно импортировать.
Например:
import Base.Math.cos
x = cos(0.5)
В случае с import перед вызовом функции необходимо писать название библиотеки и ставить точку ..
Приведенный выше код импортирует функцию cos из библиотеки Base.Math и вызывает эту функцию с аргументом 0.5. Функция cos вычисляет косинус угла в радианах и присваивает это значение переменной x. Таким образом, переменная будет содержать результат вычисления косинуса угла 0.5 радиан, равный 0.8775825618903728.
Оператор using предназначен для загрузки библиотек целиком, а не отдельных функций. Тогда код с использованием оператора using будет иметь вид:
using Base.Math
y = cos(0.5)
Таким образом, using используется для загрузки библиотек и автоматического экспорта всех ее выбранных имен в текущее пространство имен, обеспечивая удобный доступ к функциям и переменным модуля. import также загружает библиотеку, но не экспортирует ее имена автоматически, что позволяет избежать возможных конфликтов имен и явно управлять импортированными элементами. Выбирайте операторы в зависимости от ваших задач.
✏️Задание 2
Загрузите библиотеку StatsPlots.jl. Затем используйте функцию scatter(x,y) из этой библиотеки, чтобы построить точечный график для следующих данных: x=[1 2 3 4 5] и y=[8 10 14 16 20].
Подсказка
Для загрузки библоитеки используйте оператор using. Затем задайте два вектора x и y, записывая их элементы через пробел в квадратных скобках. Затем постройте точечный график с помощью функции scatter(x,y).
Решение
using StatsPlots
x = [1 2 3 4 5]
y = [8 10 14 16 20]
scatter(x, y)
Обзор основных библиотек Julia
Ниже приведен краткий обзор некоторых часто используемых библиотек Julia.
Визуализация
Plots.jl– основная библиотека, предназначенная для визуализации данных (для построения различных видов графиков по числовым данным).PlotlyJS.jl– библиотека для визуализации данных. Предоставляет дополнительные возможности построения интерактивных графиков и сохранения графиков в файлах.
Системные библиотеки
Работа с файловыми форматами
MAT.jl– библиотека предоставляет инструменты для чтения и записи файлов данных формата MATLAB в Julia.JLD2.jl– библиотека позволяет сохранять и загружать структуры данных Julia в формате, представляющем собой подмножество стандарта HDF5.XLSX.jl– библиотека для чтения и записи файлов электронных таблиц Excel.CSV.jl– библиотека для работы с текстовыми данными с разделителями, будь то разделитель-запятая (CSV), разделитель-символ табуляции (TSV) или иной символ.FileIO.jl– библиотека предоставляет общий фреймворк для определения форматов файлов и диспетчеризации в соответствующие методы чтения и записи. Две основные функции в этом пакете называютсяloadиsave. Они обеспечивают высокоуровневую поддержку форматированных файлов, в отличие от низкоуровневых функцийreadиwriteв Julia.
Математические библиотеки
LinearAlgebra.jl– библиотека содержит множество функций для решения задач линейной алгебры.Roots.jl– библиотека содержит функции для решения уравнений вида .DifferentialEquations.jl– библиотека для численного решения обыкновенных дифференциальных уравнений.NumericalIntegration.jl– библиотека для численного интегрирования дискретизированных данных.ControlSystems.jl– библиотека содержит функции для анализа и синтеза систем управления (в первую очередь линейных).Interpolations.jl– библиотека содержит функции для различных методов интерполяции.DynamicalSystems.jl– библиотека содержит функции для решения задач нелинейной динамики и анализа временных рядов.Calculus.jl– библиотека содержит функции для базовых операций дифференцирования и интегрирования.GLPK.jl– библиотека содержит функции линейного програмирования и линейной оптимизации.Ipopt.jl– библиотека для нелинейной оптимизации задач большой размерности.Distributions.jl– библиотека содержит функции для различных распределений вероятности.Polynomials.jl– библиотека обеспечивает основные арифметические действия, интегрирование, дифференцирование, вычисление значений, нахождение корней и аппроксимацию для одномерных многочленов.TaylorSeries.jl– библиотека содержит функции для разложения в ряд Тейлора функций одной или двух переменных.NLSolve.jl– библиотека содержит функции для решения систем нелинейных уравнений.Symbolics.jl– библиотека для символьных вычислений.Flux.jl– библиотека для машинного обучения.
Типы данных
DataFrames.jl– библиотека предоставляет инструментарий для работы с табличными данными.LaTeXStrings.jl– библиотека, упрощающая ввод уравнений LaTeX в переменных и константах строкового типа.
Обработка сигналов и связь
FFTW.jl– библиотека содержит функции для быстрого преобразования Фурье.Noise.jl– библиотека содержит функции для добавления различных видов шума к сигналам и изображениям.DSP.jl– библиотека содержит ряд функций для цифровой обработки сигналов (расчет периодограмм, оконные функции, синтез фильтров и фильтрация, свертка, корреляция, кодирование с линейным прогнозированием).DigitalComm.jl– библиотека предоставляет некоторые полезные инструменты для управления блоками цифровой связи (манипуляция с битами, модуляция и демодуляция, генерация и декодирование сигналов с несколькими несущими).
Обработка изображений
ImageBinarization.jl – библиотека содержит ряд алгоритмов для анализа и бинаризации изображений.
Статистика
StatsBase.jl– библиотека обеспечивает решение базовых задач статистики.HypothesisTests.jl– библиотека содержит различные функции для проверки статистических гипотез.GLM.jl– библиотека для построения линейных и обобщенных линейных моделей.
Теперь рассмотрим более подробно возможности некоторых из этих библиотек.
Библиотека Plots.jl
Библиотека Plots.jl представляет собой интерфейс и набор инструментов для визуализации данных.
Эта библиотека уже предустановлена в Engee, поэтому начать использовать ее можно с помощью следующей команды:
using Plots
Рассмотрим некоторые возможности этого пакета. Наиболее универсальный инструмент, служащий для построения графиков по числовым данным, – функция plot.
Пример. Построим график функции синус. Для координат x можно создать диапазон от 0 до 10, состоящий, скажем, из 100 элементов. Для координат y можно создать вектор, вычислив sin(x) поэлементно. Для этого мы пишем точку сразу после вызова функции. Наконец, мы используем функцию plot для построения линии.
x = range(0, 10, length=100)
y = sin.(x)
plot(x, y)
В Plots.jl каждый столбец представляет собой ряд – набор связанных точек, образующих линии, поверхности или другие примитивы построения графиков. Мы можем построить несколько линий, задав матрицу значений, где каждый столбец интерпретируется как отдельная линия. Ниже [y1 y2] формирует матрицу размером (100 строк, 2 столбца).
x = range(0, 10, length=100)
y1 = sin.(x)
y2 = cos.(x)
plot(x, [y1 y2])
Кроме того, можно добавлять на полотно дополнительные линии, изменяя объект plot. Для этого используется команда plot!, где ! обозначает, что команда изменяет текущий график.
y3 = sin.(x).^2 .- 1/2
plot!(x, y3)
✏️Задание 3
С помощью функций plot и plot! постройте на одном полотне графики функций и , задав значения x в виде диапазона от -10 до 10, состоящего из 100 элеменнтов.
Решение
using Plots
x = range(-10, 10, length=100)
y1 = x.^2
y2 = x.^3
plot(x, y1)
plot!(x, y2)
Сохранение графиков выполняется с помощью команды savefig. Например:
savefig("myplot.png")
Графики в Julia можно стилистически оформить. В Plots.jl модификаторы графиков называются атрибутами. При работе с данными и атрибутами соблюдаются следующите правила: позиционные аргументы соответствуют входным данным, а именованные аргументы соответствуют атрибутам.
Так, например, plot(x, y, z) – это трехмерные данные для трехмерных графиков без атрибутов, а plot(x, y, attribute=value) – это двумерные данные с одним атрибутом, которому присвоено некоторое значение.
В качестве примера рассмотрим изменение ширины линии с помощью linewidth (или его псевдонима lw), изменение надписей условных обозначений с помощью label и добавление названия с помощью title. Применим все это к графикам синуса и косинуса:
x = range(0, 10, length=100)
y1 = sin.(x)
y2 = cos.(x)
plot(x, [y1 y2], title="Trigonometric functions", label=["sin(x)" "cos(x)"], linewidth=3)
Еще одним широко используемым видом графиков является график рассеяния (точки, не соединенные линиями). Он строится с помощью функции scatter. Например, построим график синуса и добавим к синусу случайную составляющую.
x = range(0, 10, length=100)
y = sin.(x)
y_noisy = y .+ 0.1*randn(100)
plot(x, y, label="sin(x)")
scatter!(x, y_noisy, label="data")
Больше о библиотеке Plots.jl вы можете узнать в документации.
Библиотека LinearAlgebra.jl
Библиотека LinearAlgebra.jl содержит реализацию множества часто используемых операций линейной алгебры.
Пример. Для матрицы A вычислим след, определитель и обратную матрицу с помощью функций tr, det и inv соответственно.
using LinearAlgebra
A = [1 2 3; 4 1 6; 7 8 1]
tr(A)
det(A)
inv(A)
Собственные значения и собственные векторы матрицы находятся с помощью функций eigvals и eigvecs соответственно:
A = [-4. -17.; 2. 2.]
eigvals(A)
eigvecs(A)
Кроме того, в библиотеке LinearAlgebra.jl доступно множество разложений матриц. Например, LU-разложение выполняется с помощью функции factorize:
A = [1.5 2 -4; 3 -1 -6; -10 2.3 4]
factorize(A)
✏️Задание 4
Задайте матрицу . С помощью функций библиотеки LinearAlgebra.jl для этой матрицы вычислите след, определитель, обратную матрицу, собственные значения и собственные векторы.
Решение
using LinearAlgebra
A = [1 2 3; 4 5 6; 7 8 10]
tr(A)
det(A)
inv(A)
eigvals(A)
eigvecs(A)
Больше о библиотеке LinearAlgebra.jl вы можете узнать в документации.
Создание собственных библиотек
Для создания собственных библиотек используется команда module. Для этого нужно выполнить следующее:
- Создадим скрипт
moduleи назовем его так, как бы мы хотели назвать свою библиотеку (в нашем случаеTest_lib) и добавим содержимое модуля, например функциюget_value, которая просто возвращает входное значение:
module Test_lib
function get_value(x)
return x
end
end
- Для загрузки созданной библиотеки используем оператор
importилиusing.
import.Test_lib.get_value
или
using.Test_lib
- Далее получим требуемую функцию с помощью оператора
import:
import.Test_lib.get_value
import_value = get_value(7)
или с помощью оператора using:
using.Test_lib
using_value = get_value(7)
Примечание
Добавление точки между import и именем библиотеки обязательно в случае добавления собственной библиотеки из module. Аналогично и для using.
✏️Задание 5
Создайте библиотеку My_lib, содержащую одну функцию opp(x), которая возвращает число, противоположное входному значению. Затем загрузите функцию opp из библиотеки My_lib с помощью оператора import.My_lib.opp. После этого с помощью функции opp найдите число, противоположное числу 5.
Решение
# создаем библиотеку
module My_lib
function opp(x)
return -x
end
end
# используем библиотеку
import.My_lib.opp
opp(5)