Engee для профессионалов
Интеграция внешнего кода
Engee позволяет интегрировать в скрипты, написанные на языке Julia, код на других языках программирования: MATLAB, Python и Fortran.
Интеграция кода MATLAB
Вызов кода MATLAB из Engee
Из Julia можно вызвать произвольную команду или функцию MATLAB, которая вернет результат. Для этого нужно сначала подключить пакет MATLAB.jl. Этот пакет предоставляет интерфейс для работы с MATLAB из Julia. Другими словами, он позволяет пользователям вызывать функции MATLAB в Julia.
using MATLAB
Вызвать MATLAB из Julia можно тремя способами:
- Пользовательский строковый литерал
mat""позволяет писать синтаксис MATLAB внутри Julia и использовать переменные Julia непосредственно из MATLAB. eval_stringвычисляет строку, содержащую выражения MATLAB (обычно используется с вспомогательными макросами@mgetи@mput).- Функция
mxcallвызывает заданную функцию MATLAB и возвращает результат.
Как правило, предпочтительным способом взаимодействия с подсистемой MATLAB является использование пользовательского строкового литерала mat"".
Текст внутри пользовательского строкового литерала mat"" представлен в синтаксисе MATLAB. Переменные из Julia могут быть интерполированы в код MATLAB путем добавления символа $ в качестве префикса.
Например, следующий код вычисляет сумму и разность двух векторов:
x = range(-10.0, stop=0.0, length=500)
y = range(2.0, stop=3.0, length=500)
mat"""
$u = $x + $y
$v = $x - $y
"""
@show u v # u и v доступны из Julia
Для выполнения кода MATLAB можно также использовать функцию eval_string следующим образом:
eval_string("a = sum([1,2,3])")
Можно также вызвать функцию MATLAB напрямую для переменных Julia, используя функцию mxcall:
x = -10.0:0.1:10.0
y = -10.0:0.1:10.0
xx, yy = mxcall(:meshgrid, 2, x, y)
Поскольку поведение функций MATLAB зависит от количества выводов, в mxcall в качестве второго аргумента необходимо указать количество выходных аргументов.
Макрос @mget можно использовать для извлечения значения переменной MATLAB в Julia.
mat"a = 6"
@mget a
Макрос @mput можно использовать для преобразования переменной Julia в MATLAB.
x = [1,2,3]
@mput x
eval_string("y = sum(x)")
@mget y
@show y
Полезные ссылки
Практическая часть
✏️Задание 1
Задайте в окружении MATLAB переменную a и присвойте ей значение, равное квадратному корню из минус единицы. Затем с помощью команды @mget переместите переменную a в рабочую область Engee.
Подсказка
Откройте окружение MATLAB командой mat. Затем в двойных кавычках запишите команду a = sqrt(-1). После этого вызовите переменную a с помощью команды @mget.
Решение
mat"a = sqrt(-1)"
@mget a
✏️Задание 2
Выполните те же действия, что и в предыдущем Задании: задайте в окружении MATLAB переменную a и присвойте ей значение, равное квадратному корню из минус единицы. Затем переместите переменную a в рабочую область Engee. В этом задании воспользуйтесь символом $ перед именем переменной (вместо команды @mget).
Подсказка
Откройте окружение MATLAB командой mat. Затем в двойных кавычках запишите команду $a = sqrt(-1). После этого выведите на экран переменную a с помощью функции Julia print.
Решение
mat"$a = sqrt(-1)"
print(a)
✏️Задание 3
Задайте два массива x=[1 2 3 4 5] и y=[6 7 8 9 10]. С помощью команд MATLAB выполните поэлементное умножение этих массивов. Затем средствами Julia выведите результаты вычислений на экран.
Подсказка
Откройте окружение MATLAB командой mat. Затем в двойных кавычках запишите команду $u = $x .* $y. Затем с помощью функции Julia print выведите на экран переменную u.
Решение
x = [1 2 3 4 5]
y = [6 7 8 9 10]
mat"$u = $x .* $y"
print(u)
✏️Задание 4
С помощью команды mat выполните следующие действия в окружении MATLAB:
- Создайте вектор
tсо значениями от0до10с шагом0.1. - Вычислите вектор
y, равный синусуt. - Вычислите вектор
ynoiseс помощью функцииawgn, которая прибавляет к векторуyаддитивный белый гауссовский шум с отношением сигнал/шум, равным10.
Затем с помощью средств Julia постройте на одном полотне графики зависимости y от t и ynoise от t.
Подсказка
Сначала подключите пакет Plots с помощью команды
using Plots
Затем после команды mat откройте тройные двойные кавычки """. Затем введите команды:
$t = [0:0.1:10]'
$y = sin(\$t)
$ynoise = awgn(\$y, 10)
После этого закройте тройные двойные кавычки """. Затем с помощью функций Julia plot и plot! постройте графики зависимости y от t и ynoise от t.
Решение
using Plots
mat"""
$t = [0:0.1:10]'
$y = sin($t)
$ynoise = awgn($y, 10)
"""
plot(t, y)
plot!(t, ynoise)
✏️Задание 5
Выполните те же действия, что и в предыдущем Задании, но пользуясь функцией eval_string (вместо команды mat).
Подсказка
Трижды вызовите функцию eval_string. В качестве аргумента этой функции в двойных кавычках запишите по очереди каждую из трех команд MATLAB из предыдущего Задания. В этом случае ставить символ $ перед именами переменных не нужно. Затем с помощью команд @mget переместите переменные t, y и ynoise в рабочую область Engee и постройте графики.
Решение
eval_string("t = [0:0.1:10]'")
eval_string("y = sin(t)")
eval_string("ynoise = awgn(sin(y), 10)")
@mget t
@mget y
@mget ynoise
plot(t, y)
plot!(t, ynoise)
Интеграция кода Python
Вызов Python в Engee
Для интеграции языка Python в Julia используется пакет PyCall.jl. Это пакет Julia, который позволяет вызывать функции и объекты из Python напрямую в коде Julia. Он обеспечивает интерфейс между Julia и Python и дает возможность импортировать модули Python, вызывать их функции, создавать объекты и писать с ними код в Julia. Пакет PyCall.jl по умолчанию встроен в Engee, вам не требуется устанавливать или импортировать его.
Вы можете писать код на Python в скриптах Engee с помощью следующих способов:
- Оборачивание кода на Python строковым литералом
py"""…""", основанном на пакетеPyCall. Данный литерал выполняет строку в качестве программного кода Python, не возвращая значения и выполняя переданный код. - Оборачивание кода на Python строковым литералом
py"…", основанном наPyCall. Данный литерал принимает строку в качестве аргумента и выполняет ее как выражение Python. - Использование команд
pyimport,pyeval,pycall,@pycall,pybuiltin,@pywith,@pyinclude,@pysym,@pydef.
Пример. С помощью функции Python zeros создадим одномерный массив из двух элементов, заполненный нулями.
Обернем код на языке Python литералами py"""…""" и py"…":
using PyCall # подключаем пакет PyCall
py""" # оборачиваем в литерал
import numpy as np # импортируем пакет numpy
"""
a = py"np.zeros(2)" # оборачиваем в литерал, в котором создаем одномерный массив из двух элементов, заполненный нулями
Для команды pyimport код будет выглядеть следующим образом:
np = pyimport("numpy") # импортируем пакет numpy
a = np.zeros(2) #создаем одномерный массив из двух элементов, заполненный нулями
В обоих примерах переменные a будут иметь одинаковое значение. Разница между примерами в том, что в случае с командой pyimport в Julia появляется объект np, к которому можно обращаться напрямую.
Вы также можете использовать другие команды вызова Python в Julia:
pyimport— импортирует модуль Python в Julia, позволяя использовать его функции и переменные в коде Julia.pyeval— выполняет строковый код Python в контексте Julia, возвращая результат выполнения.pycall— вызывает функцию Python с указанными аргументами из Julia.@pycall— макрос, который предоставляет удобный синтаксис для вызова функций Python из Julia.pybuiltin— предоставляет доступ к встроенным функциям Python, таким какprint,len,rangeи т.д.@pywith— макрос, который создает контекст выполнения Python, в котором можно работать с блоками кода Python внутри Julia.@pyinclude— макрос, который включает файл с кодом Python в Julia и выполняет его.@pysym— макрос, который преобразует имя символа Julia в соответствующий объект Python.@pydef— создает класс Python, методы которого реализуются в Julia.
Например, команда pybuiltin:
pybuiltin("print")("Hello, world!")
Этот код выводит сообщение Hello, world!.
Для работы с Python в скриптах Engee вам может понадобиться множество пакетов, например, пакет поддержки научных расчетов SciPy. Для его установки используйте менеджер пакетов Pkg и синтаксис Julia:
using Pkg
Pkg.add("SciPy") # установит пакет SciPy в Julia
Для удаления пакетов используйте команду rm. Например:
Pkg.rm("SciPy")
Аналогичным образом вы можете использовать другие пакеты Python вроде NumPy, Matplotlib, Pandas и т.д.
Примечание
Переменные Python не могут быть очищены с помощью встроенных средств Engee, но могут быть перезаписаны. Для удаления переменных требуется перезапуск сессии.
Полезные ссылки
Практическая часть
using Plots
np = pyimport("numpy")
Все функции языка Python, используемые в следующих упражнениях, находятся в пакете numpy, поэтому перед именами функций Python необходимо добавлять префикс np..
✏️Задание 6
С помощью функций библиотеки numpy языка Python задайте вектор t, принимающий значения от 0 до 10 с шагом 0.1. Затем с помощью функции Python sin вычислите вектор y значений синуса t. Затем с помощью средств языка Julia постройте график зависимости y от t.
Подсказка
Сначала задайте вектор t:
t = np.arange(0, 10, 0.1)
и присвойте переменной y значение функции np.sin(t). Затем постройте график зависимости y от t с помощью функции Julia plot.
Решение
t = np.arange(0, 10, 0.1)
y = np.sin(t)
plot(t,y)
✏️Задание 7
С помощью средств языка Python задайте массив чисел [10, 8, 15, 23, 12, 20, 18, 6, 27, 21] и вычислите среднее арифметическое элементов этого массива.
Подсказка
Массив в Python задается с помощью функции np.array, в качестве аргумента записывается перечень элементов массива через запятую, взятый в квадратные скобки. Среднее арифметическое вычисляется с помощью функции np.mean. Вывод на экран значения переменной выполняется с помощью функции Julia print.
Решение
a = np.array([10, 8, 15, 23, 12, 20, 18, 6, 27, 21])
M = np.mean(a)
print(M)
✏️Задание 8
Для массива чисел, определенного в предыдущем Задании, вычислите дисперсию и среднее квадратическое отклонение с помощью средств языка Python.
Подсказка
Дисперсия в Python вычисляется с помощью функции np.var, а среднее квадратическое отклонение — с помощью функции np.std. Вывод на экран значений переменных выполняется с помощью функции Julia print.
Решение
D = np.var(a)
sigma = np.std(a)
print(D)
print(sigma)
✏️Задание 9
С помощью средств языка Python задайте массив из 10 случайных целых чисел в диапазоне от 0 до 100.
Подсказка
Массив случайных целых чисел в Python задается с помощью функции np.random.randint. В качестве первого аргумента этой функции задается верхняя граница диапазона (100), а в качестве второго именованного аргумента — длина массива (size=10).
Решение
X = np.random.randint(100, size=10)
print(X)
Интеграция кода Fortran
Код на языке Fortran может быть интегрирован как в среду технических расчетов, так и в среду моделирования Engee.
Пример интеграции подпрограммы на Fortran в среду технических расчетов и в среду моделирования Engee вы можете найти в Документации: