Модуль 1. Лекция 3 - Школа системного моделирования
Автоматическая сборка и запуск модели
Скрипт освещает тему программного управления моделированием.
Используются публичные методы программного управления, позволяющие собирать блок-схемы (модели) из интерактивных скриптов, задавать параметры отдельных блоков, логировать выходы и запускать динамическую симуляцию в цикле с изменением параметров.
Пример - уже знакомый нам затухающий маятник.

Создание и запуск модели при помощи команд
Установим имя создаваемой модели:
mdlname = "dpend_cmd"
Создадим и откроем её для редактирования:
engee.create(mdlname)
engee.open(mdlname)
Наполним холст блоками с параметрами по-умолчанию:
engee.add_block("/Basic/Sources/Sine Wave", mdlname*"/")
engee.add_block("/Basic/Sources/Ramp", mdlname*"/")
engee.add_block("/Basic/Math Operations/Gain", mdlname*"/")
engee.add_block("/Basic/Math Operations/Product", mdlname*"/")
engee.add_block("/Basic/Sinks/Terminator", mdlname*"/")
Соединим блоки соответствующим образом:
engee.add_line("Генератор синусоиды/1", "Коэффициент усиления/1")
engee.add_line("Коэффициент усиления/1", "Умножение/1")
engee.add_line("Линейный сигнал/1", "Умножение/2")
engee.add_line("Умножение/1", "Заглушка/1")
Автоматически упорядочим модель:
engee.arrange_system(mdlname)
Логируем интересующий нас сигнал:
engee.set_log("Умножение/1");
Сохраним модель в виде файла с расширением *.engee:
engee.save(mdlname * ".engee")
Зададим параметры блоков в модели:
engee.set_param!(mdlname*"/Коэффициент усиления", "Gain" => "gain")
engee.set_param!(mdlname*"/Генератор синусоиды", "Frequency" => "freq")
engee.set_param!(mdlname*"/Линейный сигнал", "slope" => "decay")
engee.set_param!(mdlname*"/Линейный сигнал", "InitialOutput" => 1.0)
Изменим значения переменных рабочего пространства и запустим модель на симуляцию:
freq = pi;
gain = 2.0;
decay = -0.1;
result = engee.run(mdlname)
out = collect(result["Умножение.1"]);
plot(out.time,out.value)
Автоматизируем запуск и сбор данных модели в цикле, изменяя один из параметров:
decvec = 0:-0.025:-0.1;
n = length(decvec);
outmatrix = zeros(length(out.time),n);
for i = 1:n
# engee.set_param!(mdlname*"/Линейный сигнал", "slope" => decvec[i])
decay = decvec[i];
tempresult = engee.run(mdlname);
tempout = collect(tempresult["Умножение.1"]);
outmatrix[:,i] = tempout.value;
end
Визуализируем выходную матрицу на стандартном графике:
plot(out.time,outmatrix,labels=string.(collect(decvec)'))
И в виде трёхмерной поверхности:
surface(outmatrix)