Уравнения языка физического моделирования Engee
|
Страница в процессе разработки. |
Объявление уравнений
Уравнения физического компонента объявляются с помощью конструкции @equations. В качестве символа равенства используется тильда ~.
@equations begin
x ~ y * z
y ~ 2 * t
end
Здесь t — это переменная времени, всегда измеряемая в секундах.
Все числа, используемые в уравнениях в явном виде считаются безразмерными (в системе СИ).
Подробнее о сложных случаях, включая условные уравнения и ветвления, см. в статье Перечисления, ветвления, циклы и модули языка физического моделирования Engee.
Векторные уравнения
Уравнения могут быть заданы и в векторной форме, когда сразу приравниваются целые массивы. Более подробно см. в статье Перечисления, ветвления, циклы и модули языка физического моделирования Engee.
Интерполяция и экстраполяция
Для табличной интерполяции и экстраполяции используется функция 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 не заданы, то параметры в портах останутся разными.