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

Уравнения языка физического моделирования Engee

Объявление уравнений

Уравнения физического компонента объявляются с помощью конструкции @equations. В качестве символа равенства используется тильда ~.

@equations begin
    x ~ y * z
    y ~ 2 * t
end

Здесь t — это переменная времени, всегда измеряемая в секундах.

Все числа, используемые в уравнениях в явном виде считаются безразмерными (в системе СИ).

Подробнее о сложных случаях, включая условные уравнения и ветвления, см. в статье Перечисления, ветвления, циклы и модули языка физического моделирования Engee.

Векторные уравнения

Уравнения могут быть заданы и в векторной форме, когда сразу приравниваются целые массивы. Более подробно см. в статье Перечисления, ветвления, циклы и модули языка физического моделирования Engee.

Производные по времени

Для задания производных по времени используется функция der(…​). Например:

@equations begin
    der(x) ~ y
end

Здесь der(x) обозначает производную переменной x по времени t.

Интерполяция и экстраполяция

Для табличной интерполяции и экстраполяции используется функция tablelookup с несколькими методами:

  • tablelookup(x_vector::Vector, y_vector::Vector, x, interpolation, extrapolation) — 1D интерполяция;

  • tablelookup(x1_vector::Vector, x2_vector::Vector, y_matrix::Matrix, x1, x2, interpolation, extrapolation) — 2D интерполяция;

  • tablelookup(x1_vector::Vector, x2_vector::Vector, x3_vector::Vector, y_3d_array::Array, x1, x2, x3, interpolation, extrapolation) — 3D интерполяция.

Поддерживаются режимы:

  • interpolation:

    • "linear" — кусочно-линейная;

    • "smooth" — кусочно-кубическая модифицированная интерполяция Акима.

  • extrapolation:

    • "linear" — линейная (по двум крайним точкам для "linear", по касательной к крайнему полиному для "smooth");

    • "nearest" — по ближайшему крайнему значению.

Аргументы кроме interpolation и extrapolation могут быть как символьными, так и несимвольными. Допустимо задавать несимвольными первую группу (с аргументами-массивами x_vector, …, y_3d_array), а символьными вторую (x, x1, x2, x3).

Проверки

Проверки условий выполняются функцией assert(condition, message, action) внутри конструкции @equations:

@parameters begin
    a = 1
    assert_action::AssertAction = AssertAction.error
end
@equations begin
    assert(a>0, "This is error.", assert_action)
end

Форматы использования:

  • assert(x>0) — обычная проверка, при нарушении расчет остановится;

  • assert(x>0, "Error") — с заданным сообщением об ошибке;

  • assert(x>0, "", AssertAction.none) — без текста, задается только действие.

action может быть символьным параметром и принимать значения:

  • AssertAction.none — ничего не делать;

  • AssertAction.error — остановка расчета (по умолчанию).

Особенности:

  • Если проверка содержит только числа и параметры — выполняется один раз при запуске симуляции;

  • Если есть хотя бы одна переменная — проверяется на каждом шаге симуляции (при включенной опции Run-time assertions в блоке Solver Configuration).

При составных условиях операторы || и && работают только без портов и переменных. Если они есть, следует использовать | и &.

Соединения

Для соединения подкомпонентов и портов используется функция connect, которая при символьных преобразованиях условно эквивалентна двум группам уравнений:

  • Приравнивание потенциальных переменных соединенных портов;

  • Равенство нулю суммы потоковых переменных соединенных портов.

@components begin
    resistor = EngeePhysicalFoundation.Electrical.Elements.Resistor()
    capacitor = EngeePhysicalFoundation.Electrical.Elements.Capacitor()
    reference = EngeePhysicalFoundation.Electrical.Elements.Reference()
end

@equations begin
    connect(resistor.p, capacitor.n)
    connect(capacitor.p, resistor.n, reference.pin)
end

Если использовать функцию connect с аргументом *, то потенциальные переменные в порту будут равны 0.

@engeemodel ground begin
    @nodes begin
        pin = EngeePhysicalFoundation.Electrical.Pin
    end
    @equations begin
        connect(pin, *)
    end
end

Кроме уравнений, параметры соединенных портов также приравниваются.

Использование * в ветвях

Ветви, определяемые в конструкции @branches, связывают переменные физического компонента с потоковыми переменными портов и задают топологию потоков внутри модели. Символ * используется для указания, что потоковая переменная не соединяется с другими портами. Пример:

@engeemodel FloatingReference begin
    @nodes begin
        p = EngeePhysicalFoundation.Electrical.Pin
        n = EngeePhysicalFoundation.Electrical.Pin
        out = EngeePhysicalFoundation.Electrical.Pin
    end
    @variables [access = Private] begin
        i_input = 0, [unit = "A", description = "Input current"]
    end
    @variables begin
        i_output = 0, [unit = "A", description = "Current into output node"]
    end
    @branches begin
        i_input:(p.i, n.i)      # ток i_input протекает между портами p и n
        i_output:(out.i, *)     # ток i_output протекает в порт out, никуда не соединяясь с другой стороны
    end
end

Здесь:

  • i_input:(p.i, n.i) — обозначает, что переменная i_input соответствует потоку из порта p в порт n;

  • i_output:(out.i, *) — указывает, что ток i_output течет в порт out, но не имеет парного порта для замыкания.

Распространение параметров портов

Для распространения параметров между портами внутри компонента используется функция domain_connect:

@equations begin
    domain_connect(port_a, port_b)
end

Эта функция приравнивает параметры между портами, но не затрагивает переменные портов (в отличие от connect). Если ни connect, ни domain_connect не заданы, то параметры в портах останутся разными.