Общий синтаксис языка физического моделирования Engee
|
Страница в процессе разработки. |
Форма и тип данных переменных и параметров
По умолчанию переменные и параметры трактуются как вещественные числа (Real), но при необходимости для параметров можно задать тип и форму данных. Так:
-
Для параметров (
@parametersи@structural_parameters) доступна любая типизация; -
Обычные переменные (
@variablesбезevent=true) и промежуточные выражения (@intermediates) всегда имеют типReal; -
Дискретные переменные (
@variablesсevent=true) могут иметь типыReal,Int,Bool.
Типизация позволяет:
-
Явно указать, какой тип данных должен использоваться;
-
Контролировать ввод значений в интерфейсе (например, логическое значение будет чекбоксом, а перечисление — выпадающим списком),
-
Задать структуру данных (скаляр, вектор, матрица),
-
Повысить строгость модели и исключить ошибки еще на этапе объявления.
Поддерживаются следующие типы:
-
Real— вещественные числа (значение по умолчанию, если тип не указан); -
Int— целые числа; -
Bool— логические значения (true/false); -
Массивы (
[:]для вектора,[:, :]для матрицы); -
Перечисления, которые задаются отдельно.
Для @parameters/@variables/@intermediates/@structural_parameters можно указывать размерность (скаляр, вектор, матрица).
@parameters begin
a::Bool = true
b = 1
c[:] = [2, 3] # вектор
d[:, :] = [1 2; 3 4] # матрица
end
Векторы и матрицы
При объявлении массивов важно учитывать правила:
-
a[:]— вектор (одномерный массив). -
b[:,:]— матрица (двумерный массив). -
j[:,:,:]— трехмерный массив. -
Если параметр объявлен без
[:], то он всегда скаляр. -
Размеры массивов можно задавать через структурные параметры.
Пример:
@structural_parameters begin
n1::Int = 5
n2::Int = 3
end
@parameters begin
a[:] = [0.1, 0.2, 0.3] # вектор
b[:] = zeros(n1) # вектор длиной n1
c[:,:] = ones(n1, n2) # матрица n1×n2
j[:,:,:] = zeros(3,3,3) # трехмерный массив
end
@variables begin
x = 0
end
@equations begin
x ~ a[1] + b[2] + c[3,2] + j[1,1,1]
end
Те же приемы объявления массивов и их размеров одинаково работают и для @variables, @intermediates, @parameters и @structural_parameters.
|
Разберем, что делает этот код:
-
В конструкции
@structural_parametersзадаются размеры массивов:n1 = 5,n2 = 3. Эти параметры определяют форму векторов и матриц. -
В конструкции
@parameters:-
a[:] = [0.1, 0.2, 0.3]— создается вектор длиной 4 с фиксированными значениями[0.1, 0.2, 0.3]. -
b[:] = zeros(n1)— создается вектор длинойn1(в данном случае 5), заполненный нулями. -
c[:,:] = ones(n1, n2)— создается матрица размером5×3, заполненная единицами. -
j[:,:,:] = zeros(3,3,3)— создается трехмерный массив размером3×3×3, заполненный нулями.
-
-
В конструкции
@variablesвводится переменнаяx, изначально равная 0. -
В конструкции
@equationsзадается уравнение, в которомxвыражается через элементы всех массивов:-
a[1]— первый элемент вектораa(значение 0.1). -
b[2]— второй элемент вектораb(значение 0, так как вектор заполнен нулями). -
c[3,2]— элемент матрицыcв 3-й строке и 2-м столбце (значение 1, так как матрица заполнена единицами). -
j[1,1,1]— элемент трехмерного массиваj(значение 0).
-
Индексация используется для обращения к отдельным элементам.
Скалярные типы
Пример объявления простых параметров разных типов:
@parameters begin
flag::Bool = true
count::Int = 5
gain::Real = 1.25 # тип Real применяется по умолчанию
end
где:
-
Bool— логический тип, принимает только два значения:true(истина) илиfalse(ложь). В интерфейсе такой параметр отображается как чекбокс, который можно включить или выключить. -
Int— целое число без дробной части. Удобно использовать для счетчиков, индексов, размеров массивов. -
Real— число с дробной частью (вещественное). Подходит для любых физических величин: масса, скорость, напряжение и т.д.
Передача значений в подкомпоненты
Если в подкомпонент передается число без единиц измерения, то используется единица измерения по умолчанию, указанная в его параметрах. Чтобы задать единицу измерения явно, используется NamedTuple. Пример:
@engeemodel A begin
@parameters begin
x = 1, [unit = "mV"]
end
end
@engeemodel B begin
@components begin
a1 = A(x = 2) # трактуется как 2 mV → 0.002 V
a2 = A(x = (value = 2, unit = "V"))
end
end
В этом примере видно, что:
-
a1получает значение2в милливольтах, так как это указано по умолчанию в компонентеA. -
a2получает значение 2 вольта, потому что мы явно задали единицу измерения черезNamedTuple.
Аналогично, если параметр объявлен с единицей измерения "kA", то передача числа 0.8 будет интерпретироваться как 0.8 кА (800 А). Чтобы задать именно 0.8 ампера, нужно написать:
@components begin
a = A(h = (value = 0.8, unit = "A"))
end
Перечисления
Перечисления позволяют задать конечный набор допустимых значений параметра и удобно комбинируются с ветвлениями. Благодаря этому компонент может работать в разных режимах, которые выбираются пользователем через выпадающий список в интерфейсе.
Подробный разбор перечислений, синтаксиса и примеров см. в статье Перечисления, ветвления, циклы и модули языка физического моделирования Engee