Документация Engee

Примечательные отличия от других языков

Если у вас нет опыта работы с языком программирования Julia, рекомендуем посетить страницу с документацией по примечательным отличиям Julia от других языков программирования.

Далее на этой странице будут перечислены примечательные отличия ControlSystems.jl от другого программного обеспечения для проектирования систем управления.

  • Имена функций для расчета полюсов и нулей систем имеют форму множественного числа, то есть poles вместо pole и tzeros вместо tzero.

  • При моделировании с помощью методов lsim, step и impulse возвращаются массивы со временем во втором, а не первом измерении (также относится к freqresp, bode, nyquist и т. д.). В Julia применяется размещение в памяти по столбцам. Такой выбор был обусловлен соображениями производительности.

  • Сигнатуры функций are, lqr и kalman в Julia немного отличаются от других языков. Более сложные функции для работы с ЛКГ содержатся в пакете RobustAndOptimalControl.jl.

  • При моделировании с помощью методов lsim, step, impulse и т. д. возвращается структура, график которой можно построить. Сами по себе эти функции никогда не строят графики.

  • Функции bode, nyquist и т. д. никогда не выдают графики. Вместо этого см. описание функций bodeplot, nyquistplot и т. д.

  • В Julia функциональность часто разделяется на несколько отдельных пакетов. Поэтому, чтобы получить все, что вам нужно, может потребоваться установить и использовать дополнительные пакеты. Коллекция пакетов, связанных с системами управления, представлена на странице Ecosystem.

  • В Julia значения 1 и 1.0 имеют разные типы, и в ControlSystemsBase.jl учитываются типы, выбранные пользователем. Например, tf(1, [1, 1]) — это передаточная функция с целочисленными коэффициентами, а при вызове tf(1.0, [1, 1]) все коэффициенты будут продвинуты до Float64.

  • Матрицы и векторы — это разные типы в Julia, в частности, векторы столбцов и векторы строк не являются взаимозаменяемыми.

  • В Julia код часто допускает автоматическое дифференцирование. При работе с ControlSystems.jl мы рекомендуем попробовать использовать ForwardDiff.jl для автоматического дифференцирования. Пример можно найти в разделе Automatic Differentiation.

  • Исходный код Julia зачастую очень легко читается. Если вы хотите узнать, как реализована функция, найти исходный код могут помочь макросы @edit или @less.

  • Если при работе с пакетом Julia возникла проблема (ошибка), вы можете сообщить о ней на странице пакета в GitHub. Часто ошибки исправляются оперативно. Чтобы сообщить о проблеме в ControlSystems.jl, щелкните здесь. Благодарим за помощь в улучшении нашего программного обеспечения с открытым исходным кодом!

  • Код Julia компилируется непосредственно перед его первым вызовом. Из-за этого могут происходить заметные задержки, а пакеты — долго загружаться. Чтобы ускорить загрузку ControlSystems.jl, можно создать образ системы, включающий пакет ControlSystems.jl, с помощью PackageCompiler.jl. Дополнительные сведения см. ниже в разделе Precompilation for faster load times.

Если вы обнаружили какие-либо еще примечательные отличия ControlSystems.jl от другого программного обеспечения, связанного с системами управления, отправьте запрос на вытягивание, чтобы добавить их в список выше. Чтобы отправить запрос на вытягивание, щелкните значок «Редактировать на GitHub» вверху этой страницы, а затем щелкните значок карандаша над областью просмотра файла. Ниже приводится двухминутное видео, демонстрирующее этот процесс.

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

Чтобы пакет ControlSystems.jl загружался быстрее, можно воспользоваться PackageCompiler.jl.

Если вы планируете принимать участие в разработке пакета ControlSystem.jl, то есть изменять исходный код, не рекомендуется встраивать его в образ системы. Лучше встроить в образ системы пакет OrdinaryDiffEq, так как именно на его загрузку тратится большая часть времени.

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

  • Без образа системы:

julia> @time using ControlSystems
  1.646961 seconds (2.70 M allocations: 173.558 MiB, 1.08% gc time, 2.06% compilation time)
  • С пакетами OrdinaryDiffEq и Plots в образе системы:

julia> @time using ControlSystems
  0.120975 seconds (413.37 k allocations: 27.672 MiB, 1.66% compilation time)

Чтобы выполнить сборку образа системы с помощью ControlSystems, сохраните приведенный ниже скрипт в файле, например precompile_controlsystems.jl (в него можно добавить и любые другие пакеты, которые должны загружаться).

using OrdinaryDiffEq # Включите этот пакет, если вы хотите участвовать в разработке ControlSystems.jl
using ControlSystems # Включите этот пакет, если вы хотите просто использовать ControlSystems.jl
using Plots # Если вы также хотите использовать функции построения графиков

# Добавим несколько операторов, чтобы убедиться в том, что они предварительно компилируются. Не включайте их, если вы хотите участвовать в разработке ControlSystems.jl
for P = StateSpace[ssrand(2,2,2), ssrand(2,2,2, Ts=0.1)]
    bodeplot(P)
    nyquistplot(P)
    plot(step(P, 10))
end

Затем выполните следующий код:

using PackageCompiler
PackageCompiler.create_sysimage(
    [
        :OrdinaryDiffEq,
        :Plots,
        :ControlSystems,
    ];
    precompile_execution_file = "precompile_execution_file",
    sysimage_path = "sys_ControlSystems_$(VERSION).so",
)
exit()

После создания образа системы запустите Julia с указанием флага -J и созданного образа, который имеет имя sys_ControlSystems_<VERSION>.so. Дополнительные сведения см. здесь. После этого пакет должен загружаться очень быстро.

При обновлении установленных пакетов Julia образ системы не изменится, пока вы не выполните его повторную сборку.

Чтобы этот образ системы загружался в vscode, добавьте

"julia.additionalArgs": [
    "-J/path_to_sysimage/sys_ControlSystems_<VERSION>.so"
],

в файл settings.json.