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