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

Общий синтаксис языка физического моделирования 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