Учебники часто определяют определённые члены уравнений в отдельных уравнениях, а затем подставляют эти промежуточные уравнения в основное. Например, для полностью развитого потока в трубопроводах коэффициент трения Дарси может использоваться для вычисления потери давления:
V22D
где P - давление, f - коэффициент трения Дарси, L - длина, start- плотность, V - скорость потока, и D - гидравлическая зона.
Эти термины далее определяются следующим образом:
0,316Re1/4
V
4Aδ
qA
где Re - число Рейнольдса, A - площадь, q - объёмный расход, а start- кинематическая вязкость.
В Simscape™ языке существует два способа определения промежуточных терминов для использования в уравнениях:
intermediates раздел - Объявление повторно используемых именованных промежуточных терминов в 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.
intermediates раздел в файле компонента позволяет определить именованные промежуточные термины для использования в уравнениях. Подумайте об именованных промежуточных терминах как об определении псевдонима для выражения. Его можно повторно использовать в любом разделе уравнений в том же файле или во вложенном составном компоненте. Когда в уравнении используется промежуточный термин, он в конечном итоге заменяется выражением, на которое он ссылается.
Также можно включить intermediates в файле домена и повторно использовать эти промежуточные термины в любом компоненте, имеющем узлы этого типа домена.
Вы объявляете промежуточный срок, присваивая уникальный идентификатор в левой части знака равенства (=) к выражению в правой части знака равенства.
Выражение в правой части знака равенства:
Может относиться к другим промежуточным терминам. Например, в уравнении Дарси-Вайсбаха идентификатор Re_d (число Рейнольдса) используется в выражении, объявляющем идентификатор f(коэффициент трения Дарси). Единственное требование состоит в том, что эти ссылки являются ациклическими.
Может относиться к параметрам, переменным, входам, выходам, компонентам-членам и их параметрам, переменным, входам и выходам, а также к переменным по доменам, используемым узлами-компонентами.
Не удается сослаться на переменные Through доменов, используемых узлами компонентов.
Можно использовать промежуточные члены в уравнениях, как описано в разделе Использование в уравнениях. Однако вы не можете получить доступ к промежуточным условиям в setup функция.
Промежуточные термины могут отображаться в журналах данных моделирования и обозревателе результатов Simscape, как описано в разделе Ведение журнала данных. Однако промежуточные термины не фигурируют в:
Средство просмотра переменных
Средство просмотра статистики
Данные операционной точки
Диалоговые окна «Блок» и инспектор свойств
После объявления промежуточного члена можно ссылаться на него по его идентификатору в любом месте раздела уравнений того же компонента. Например:
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 Results Explorer слева отображается график значений гидравлического диаметра с течением времени на правой панели и имя Hydraulic diameter на панели состояния внизу. Дополнительные сведения см. в разделе Сведения о обозревателе результатов Simscape.
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
Предложение expression определяет область подстановки. Начинается с ключевого слова 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
В предложении объявления может быть несколько объявлений. Эти объявления не зависят от порядка. На идентификаторы, объявленные в одном объявлении, могут ссылаться выражения для идентификаторов в других объявлениях в том же самом предложении объявления. Таким образом, в примере с уравнением Дарси-Вайсбаха идентификатор 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