Учебники часто задают определенные условия уравнений в отдельных уравнениях, а затем подставляют эти промежуточные уравнения в основное. Для примера, для полностью развитого потока в каналах, коэффициент трения Дарси может использоваться для вычисления падения давления:
где P давление, f - коэффициент трения Дарси, L - длина, - плотность, V - скорость потока жидкости, и D является гидравлической областью.
Эти термины далее определяются:
где Re - число Рейнольдса, A является областью, q является объемной скоростью потока жидкости, и
В Simscape™ языке существует два способа определения промежуточных членов для использования в уравнениях:
intermediates section - Объявление переиспользуемых промежуточных членов в intermediates раздел в файле компонента или области. Можно повторно использовать эти промежуточные условия в любом разделе уравнений в том же файле компонента, в составном файле компонента или в любом компоненте, который имеет узлы этого типа области.
let выражения в equations раздел - Объявить промежуточные термины в предложении объявления и использовать их в предложении выражения того же let выражение. Используйте этот метод, если вам нужно задать промежуточные условия ограниченных возможностей для использования в одной группе уравнений. Таким образом, объявления и уравнения близки друг к другу, что улучшает читаемость кода.
Другое преимущество использования названных промежуточных членов вместо let выражения таковы, что вы можете включать именованные промежуточные термины в журналы данных моделирования.
В следующем примере показано то же уравнение Дарси-Вайсбаха с промежуточными терминами, записанными на языке 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 Results Explorer.
The intermediates раздел в файле компонента позволяет вам задать именованные промежуточные члены для использования в уравнениях. Подумайте о именованных промежуточных терминах, как об определении псевдонима для выражения. Можно повторно использовать его в любом разделе уравнений в том же файле или в окружающем составном компоненте. Когда промежуточный термин используется в уравнении, он в конечном счете заменяется выражением, к которому он относится.
Можно также включить intermediates разделить в файле области и повторно использовать эти промежуточные термины в любом компоненте, который имеет узлы этого типа области.
Промежуточный термин объявляется путем назначения уникального идентификатора на левой стороне знака равенства (=) к выражению в правой части знака равенства.
Выражение правой стороны знака равенства:
Может ссылаться на другие промежуточные термины. Для примера в уравнении Дарси-Вайсбаха идентификатор Re_d (число Рейнольдса) используется в выражении, объявляющем идентификатор f (коэффициент трения Дарси). Единственным требованием является то, что эти ссылки являются ациклическими.
Может ссылаться на параметры, переменные, входы, выходы компонентов представителя и их параметры, переменные, входы и выходы, а также переменные Across областей, используемые узлами компонента.
Не удается обратиться к переменным Through областей, используемых узлами компонента.
Можно использовать промежуточные члены в уравнениях, как описано в Use in Equations. Однако вы не можете получить доступ к промежуточным терминам в setup функция.
Промежуточные термины могут появиться в журналах данных моделирования и Simscape Results Explorer, как описано в Логгирование. Однако промежуточные термины не фигурируют в:
Средство просмотра переменных
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 Results Explorer.
Для примера вы объявляете промежуточный термин D_h (гидравлический диаметр) как функцию площади отверстия:
component E
[...]
intermediates
D_h = sqrt( 4.0 * A / pi ); % Hydraulic diameter
end
[...]
end
Когда вы используете блок на основе этого компонента в модели и записываете данные моделирования, выбирая D_h в дереве Simscape Results Explorer слева отображается график значений гидравлического диаметра с течением времени на правой панели и имя Hydraulic diameter в панели состояния внизу. Дополнительные сведения см. в разделе О Simscape Results Explorer.
let Выраженияlet выражения обеспечивают другой способ задать промежуточные члены для использования в одном или нескольких уравнениях. Используйте этот метод, если вам нужно задать промежуточные условия ограниченных возможностей для использования в одной группе уравнений. Таким образом, объявления и уравнения близки друг к другу, что улучшает читаемость файла.
В следующем примере показано то же уравнение Дарси-Вайсбаха, что и в начале этой темы, но с промежуточными терминами, выписанными с помощью 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 ВыраженияA let выражение состоит из двух предложений, предложения объявления и предложения выражения.
equations
[...]
let
declaration clause
in
expression clause
end
[...]
end
Предложение объявления присваивает идентификатор или набор идентификаторов в левой части знака равенства (=) к выражению уравнения в правой части знака равенства:
LetValue = EquationExpression
Предложение выражения определяет возможности замены. Он начинается с ключевого слова in, и может содержать одно или несколько выражений уравнения. Все выражения, присвоенные идентификаторам в предложении объявления, подставляются в уравнения в предложении выражения во время анализа.
Примечание
The 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
В предложении объявления может быть несколько объявлений. Эти объявления являются независимыми от порядка. Идентификаторы, объявленные в одном объявлении, могут ссылаться выражениями для идентификаторов в других объявлениях в том же предложении объявления. Таким образом, в примере с уравнением Дарси-Вайсбаха, идентификатор 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