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

Зачем использовать промежуточные условия?

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

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 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 < 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

См. также

Похожие темы