Использование средних терминов в уравнениях

Почему используют средние термины?

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

P=f·L·ρ·V22D

где P давление, f коэффициент трения Дарси, L длина, ρ является плотностью, V скорость потока и D гидравлическая область.

Эти условия далее заданы:

f=0.316Re1/4

Re=D·Vν

D=4Aπ

V=qA

где Re число Рейнольдса, A область, q объемный расход, и ν является кинематической вязкостью.

На языке Simscape™ существует два способа, которыми можно задать средние сроки для использования в уравнениях:

  • intermediates раздел — Объявляет допускающие повторное использование именованные средние сроки в intermediates разделите в или доменном файле компонента. Можно снова использовать эти средние сроки в любом разделе уравнений в том же файле компонента в составном файле включения компонента, или в любом компоненте, который имеет узлы того доменного типа.

  • let выражения в equations раздел — Объявляет средние сроки в пункте объявления и использует их в пункте выражения того же let выражение. Используйте этот метод, если необходимо задать средние сроки ограниченного объема для использования в одной группе уравнений. Таким образом, объявления и уравнения близко друг к другу, который улучшает удобочитаемость кода.

Другое преимущество использования именованных средних терминов вместо let выражения - то, что можно включать названные средние сроки в журналы данных моделирования.

Следующий пример показывает то же уравнение Darcy-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 разделите в доменном файле и снова используйте эти средние сроки в любом компоненте, который имеет узлы того доменного типа.

Синтаксические правила и ограничения

Вы объявляете средний срок путем присвоения уникального идентификатора на левой стороне знака "равно" (=) к выражению на правой стороне знака "равно".

Выражение на правой стороне знака "равно":

  • Может относиться к другим средним срокам. Например, в уравнении Darcy-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 выражения обеспечивают другой способ задать средние сроки для использования в одном или нескольких уравнениях. Используйте этот метод, если необходимо задать средние сроки ограниченного объема для использования в одной группе уравнений. Таким образом, объявления и уравнения близко друг к другу, который улучшает удобочитаемость файла.

Следующий пример показывает то же уравнение Darcy-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

В пункте объявления могут быть многократные объявления. Эти объявления являются независимым порядком. Идентификаторы, объявленные в одном объявлении, могут быть упомянуты выражениями для идентификаторов в других объявлениях в том же пункте объявления. Таким образом, в примере уравнением Darcy-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

Смотрите также

Похожие темы