Учебники часто задают определенные условия уравнения в отдельных уравнениях, и затем заменяют этими промежуточными уравнениями в основное. Например, для полностью разработанного потока в каналах, фактор трения Дарси может использоваться, чтобы вычислить падение давления:
где P является давлением, f является фактором трения Дарси, L является длиной, ρ является плотностью, V является скоростью потока, и D является гидравлической областью.
Эти условия далее заданы:
где Re является числом Рейнольдса, A является областью, q является объемным расходом, и ν является кинематической вязкостью.
На языке Simscape™ существует два способа, которыми можно задать средние сроки для использования в уравнениях:
Раздел intermediates — Объявляет допускающие повторное использование именованные средние сроки в разделе intermediates в или доменном файле компонента. Можно снова использовать эти средние сроки в любом разделе уравнений в том же файле компонента в составном файле включения компонента, или в любом компоненте, который имеет узлы того доменного типа.
Выражения let в разделе equations — Объявляют средние сроки в пункте объявления и используют их в пункте выражения того же выражения let. Используйте этот метод, если необходимо задать средние сроки ограниченного объема для использования в одной группе уравнений. Таким образом, объявления и уравнения близко друг к другу, который улучшает удобочитаемость кода.
Другое преимущество использования именованных средних терминов вместо выражений let состоит в том, что можно включать названные средние сроки в журналы данных моделирования.
Следующий пример показывает то же уравнение Дарси-Weisbach со средними сроками, выписанными на языке Simscape:
component MyComponent
[...]
parameters
L = { 1, 'm' }; % Length
rho = { 1e3, 'kg/m^3' }; % Density
nu = { 1e-6, 'm^2/s' }; % Kinematic viscosity
end
variables
p = { 0, 'Pa' }; % Pressure
q = { 0, 'm^3/s' }; % Volumetric flow rate
A = { 0, 'm^2' }; % Area
end
intermediates
f = 0.316 / Re_d^0.25; % Darcy friction factor
Re_d = D_h * V / nu; % Reynolds number
D_h = sqrt( 4.0 * A / pi ); % Hydraulic diameter
V = q / A; % Flow velocity
end
equations
p == f * L * rho * V^2 / (2 * D_h); % final equation
end
end
end
После замены всех средних сроков итоговое уравнение становится:
p==0.316/(sqrt(4.0 * A / pi) * q / A / nu)^0.25 * L * rho * (q / A)^2 / (2 * sqrt(4.0 * A / pi));
Когда вы будете использовать этот компонент в модели и регистрировать данные моделирования, журналы будут включать данные для этих четырех средних сроков с их описательными именами (такими как Darcy friction factor) показанный в Проводнике Результатов Simscape.
Раздел intermediates в файле компонента позволяет вам задать названные средние сроки для использования в уравнениях. Думайте об именованных средних сроках с определения псевдонима для выражения. Можно снова использовать его в любом разделе уравнений в том же файле, или включение составляют компонент. Когда средний термин используется в уравнении, им в конечном счете заменяют с выражением, к которому он относится.
Можно также включать раздел intermediates в доменный файл и снова использовать эти средние сроки в любом компоненте, который имеет узлы того доменного типа.
Вы объявляете средний срок путем присвоения уникального идентификатора на левой стороне знака "равно" (=) к выражению на правой стороне знака "равно".
Выражение на правой стороне знака "равно":
Может относиться к другим средним срокам. Например, в уравнении Дарси-Weisbach, идентификатор Re_d (число Рейнольдса) используется в выражении, объявляя идентификатор f (Фактор трения дарси). Единственное требование - то, что эти ссылки являются нециклическими.
Может относиться к параметрам, переменным, входным параметрам, выходным параметрам, членским компонентам и их параметрам, переменным, входным параметрам, и выходным параметрам, а также переменным Across областей, используемых узлами компонента.
Не может относиться к переменным Through областей, используемых узлами компонента.
Можно использовать средние термины в уравнениях, как описано в Использовании в уравнениях. Однако вы не можете получить доступ к средним срокам в функции setup.
Средние сроки могут появиться в журналах данных моделирования и Проводнике Результатов Simscape, как описано в Регистрации данных. Однако средние сроки не появляются в:
Переменное средство просмотра
Средство просмотра статистики
Данные о Рабочей точке
Блокируйте диалоговые окна и Property Inspector
После объявления среднего срока можно обратиться к нему его идентификатором где угодно в разделе уравнений того же компонента. Например:
component A
[...]
parameters
p1 = { 1, 'm' };
end
variables
v1 = { 0, 'm' };
v2 = { 0, 'm^2' };
end
intermediates
int_expr = v1^2 * pi / p1;
end
equations
v2 == v1^2 + int_expr;
end
end
Можно обратиться к общедоступному среднему сроку, объявленному в членском компоненте в уравнениях компонента составного объекта включения. Например:
component B
[...]
components
comp1 = MyPackage.A;
end
variables
v1 = { 0, 'm^2' };
end
[...]
equations
v1 == comp1.int_expr;
end
end
Точно так же можно обратиться к среднему сроку, объявленному в области в разделе уравнений любого компонента, который имеет узлы этого доменного типа. Например:
domain D
[...]
intermediates
int_expr = v1 / sqrt(2);
end
[...]
end
component C
[...]
nodes
n = D;
end
variables
v1 = { 0, 'V' };
end
[...]
equations
v1 == n.int_expr;
end
end
Доступностью средних сроков за пределами файла, где они объявляются, управляет их значение атрибута Access. Дополнительные сведения см. в Списках атрибутов.
Средние сроки со значениями атрибута ExternalAccess modify или observe включены в журналы данных моделирования. Дополнительные сведения см. в Списках атрибутов.
Если вы задаете описательное имя для среднего срока, это имя появляется в панели состояния Проводника Результатов Simscape.
Например, вы объявляете средний срок D_h (гидравлический диаметр) как функция области отверстия:
component E
[...]
intermediates
D_h = sqrt( 4.0 * A / pi ); % Hydraulic diameter
end
[...]
end
Когда вы используете блок на основе этого компонента в модели и регистрируете данные моделирования, выбор D_h в дереве Проводника Результатов Simscape на левых отображениях график значений гидравлического диаметра в зависимости от времени на правой панели и имени Hydraulic diameter в панели состояния в нижней части. Для получения дополнительной информации займитесь Проводником Результатов Simscape.
letВыражения let обеспечивают другой способ задать средние сроки для использования в одном или нескольких уравнениях. Используйте этот метод, если необходимо задать средние сроки ограниченного объема для использования в одной группе уравнений. Таким образом, объявления и уравнения близко друг к другу, который улучшает удобочитаемость файла.
Следующий пример показывает то же уравнение Дарси-Weisbach как в начале этой темы, но со средними сроками, выписанными с помощью выражения let:
component MyComponent
[...]
parameters
L = { 1, 'm' }; % Length
rho = { 1e3, 'kg/m^3' }; % Density
nu = { 1e-6, 'm^2/s' }; % Kinematic viscosity
end
variables
p = { 0, 'Pa' }; % Pressure
q = { 0, 'm^3/s' }; % Volumetric flow rate
A = { 0, 'm^2' }; % Area
end
equations
let
f = 0.316 / Re_d^0.25; % Darcy friction factor
Re_d = D_h * V / nu; % Reynolds number
D_h = sqrt( 4.0 * A / pi ); % Hydraulic diameter
V = q / A; % Flow velocity
in
p == f * L * rho * V^2 / (2 * D_h); % final equation
end
end
end
После замены всех средних сроков итоговое уравнение становится:
p==0.316/(sqrt(4.0 * A / pi) * q / A / nu)^0.25 * L * rho * (q / A)^2 / (2 * sqrt(4.0 * A / pi));
Однако в этом случае эти четыре средних срока не появляются в регистрируемых данных моделирования.
letВыражение let состоит из двух пунктов, пункта объявления и пункта выражения.
equations
[...]
let
declaration clause
in
expression clause
end
[...]
end
Пункт объявления присваивает идентификатор или набор идентификаторов, на левой стороне знака "равно" (=) к выражению уравнения на правой стороне знака "равно":
LetValue = EquationExpression
Пункт выражения задает осциллограф замены. Это запускает с ключевого слова in и может содержать одно или несколько выражений уравнения. Всеми выражениями, присвоенными идентификаторам в пункте объявления, заменяют в уравнения в пункте выражения во время парсинга.
Ключевое слово end требуется в конце оператора let-in-end.
Вот простой пример:
component MyComponent
[...]
variables
x = 0;
y = 0;
end
equations
let
z = y + 1;
in
x == z;
end
end
end
В этом примере пункт объявления выражения let устанавливает значение идентификатора z, чтобы быть выражением y + 1. Таким образом, заменяя y + 1 для z в пункте выражения в операторе let, код выше эквивалентен:
component MyComponent
[...]
variables
x = 0;
y = 0;
end
equations
x == y + 1;
end
end
end
В пункте объявления могут быть многократные объявления. Эти объявления являются независимым порядком. Идентификаторы, объявленные в одном объявлении, могут быть упомянуты выражениями для идентификаторов в других объявлениях в том же пункте объявления. Таким образом, в примере с уравнением Дарси-Weisbach, идентификатор Re_d (число Рейнольдса) используется в выражении, объявляя идентификатор f (Фактор трения дарси). Единственное требование - то, что ссылки выражения являются нециклическими.
Пункт выражения выражения let задает осциллограф замены на пункт объявления. Другие уравнения, которые не требуют этих замен, могут появиться в разделе уравнения за пределами пункта выражения. В следующем примере раздел уравнения содержит выражение уравнения c == b + 2 вне осциллографа выражения let перед ним.
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
end
equations
let
x = a + 1;
in
b == x;
end
c == b + 2;
end
end
Эти выражения обработаны как коллеги. Они - независимый порядок, таким образом, этот пример эквивалентен
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
end
equations
c == b + 2;
let
x = a + 1;
in
b == x;
end
end
end
и, после замены, к
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
end
equations
b == a + 1;
c == b + 2;
end
end
letМожно вложить выражения let, например:
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
end
equations
let
w = a + 1;
in
let
z = w + 1;
in
b == z;
c == w;
end
end
end
end
В случае вложения замены выполняются на основе обоих из пунктов объявления. После замен код выше становится:
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
end
equations
b == a + 1 + 1;
c == a + 1;
end
end
Самые внутренние объявления более приоритетны. Следующий пример иллюстрирует вложенное выражение let, где внутренний пункт объявления заменяет значение, объявленное во внешнем:
component MyComponent
[...]
variables
a = 0;
b = 0;
end
equations
let
w = a + 1;
in
let
w = a + 2;
in
b == w;
end
end
end
end
Выполнение замены относительно этого примера урожаи:
component MyComponent
[...]
variables
a = 0;
b = 0;
end
equations
b == a + 2;
end
end
letМожно использовать операторы if и в описании и в пункте выражения выражений let, например:
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
end
equations
let
x = if a < 0, a else b end;
in
c == x;
end
end
end
Здесь x объявляется как условное выражение на основе . Выполнение замены относительно этого примера урожаи: a < 0
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
end
equations
c == if a < 0, a else b end;
end
end
Следующий пример иллюстрирует, как можно использовать выражения let в условных выражениях. Два выражения let по обе стороны от условного выражения независимы:
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
end
equations
if a < 0
let
z = b + 1;
in
c == z;
end
else
let
z = b + 2;
in
c == z;
end
end
end
end
Этот код эквивалентен:
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
end
equations
if a < 0
c == b + 1;
else
c == b + 2;
end
end
end
Этот пример показывает использование списка идентификаторов, а не одного идентификатора, в декларативном пункте выражения let:
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
d = 0;
end
equations
let
[x, y] = if a < 0, a; -a else -b; b end;
in
c == x;
d == y;
end
end
end
Здесь x и y объявляются как условное выражение на основе . Заметьте, что каждая сторона оператора a < 0if задает список двух выражений. Первый семантический перевод этого примера разделяет оператор if в
if a < 0, a; -a else -b; b end =>
{ if a < 0, a else -b end; if a < 0, -a else b end }затем второй семантический перевод становится
[x, y] = { if a < 0, a else -b end; if a < 0, -a else b end } =>
x = if a < 0, a else -b end; y = if a < 0, -a else b end;и итоговая замена относительно этого примера урожаи:
component MyComponent
[...]
variables
a = 0;
b = 0;
c = 0;
d = 0;
end
equations
c == if a < 0, a else -b end;
d == if a < 0, -a else b end;
end
end