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