Учебники часто задают определенные условия уравнения в отдельных уравнениях, и затем заменяют этими промежуточными уравнениями в основное. Например, для полностью разработанного потока в каналах, коэффициент трения Дарси может быть использованным для расчета падением давления:
где 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, как описано в Регистрации данных. Однако средние сроки не появляются в:
Переменное средство просмотра
Statistics Viewer
Данные о Рабочей точке
Диалоговые окна блока и 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