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