exponenta event banner

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

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

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

P = f· L· start· V22D

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

Эти термины далее определяются следующим образом:

f = 0,316Re1/4

Re = D· V

D = 4Aδ

V = qA

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

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

  • intermediates раздел - Объявление повторно используемых именованных промежуточных терминов в 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.

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

intermediates раздел в файле компонента позволяет определить именованные промежуточные термины для использования в уравнениях. Подумайте об именованных промежуточных терминах как об определении псевдонима для выражения. Его можно повторно использовать в любом разделе уравнений в том же файле или во вложенном составном компоненте. Когда в уравнении используется промежуточный термин, он в конечном итоге заменяется выражением, на которое он ссылается.

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

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

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

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

  • Может относиться к другим промежуточным терминам. Например, в уравнении Дарси-Вайсбаха идентификатор Re_d (число Рейнольдса) используется в выражении, объявляющем идентификатор f(коэффициент трения Дарси). Единственное требование состоит в том, что эти ссылки являются ациклическими.

  • Может относиться к параметрам, переменным, входам, выходам, компонентам-членам и их параметрам, переменным, входам и выходам, а также к переменным по доменам, используемым узлами-компонентами.

  • Не удается сослаться на переменные Through доменов, используемых узлами компонентов.

Можно использовать промежуточные члены в уравнениях, как описано в разделе Использование в уравнениях. Однако вы не можете получить доступ к промежуточным условиям в setup функция.

Промежуточные термины могут отображаться в журналах данных моделирования и обозревателе результатов Simscape, как описано в разделе Ведение журнала данных. Однако промежуточные термины не фигурируют в:

  • Средство просмотра переменных

  • Средство просмотра статистики

  • Данные операционной точки

  • Диалоговые окна «Блок» и инспектор свойств

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

После объявления промежуточного члена можно ссылаться на него по его идентификатору в любом месте раздела уравнений того же компонента. Например:

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 Results Explorer слева отображается график значений гидравлического диаметра с течением времени на правой панели и имя Hydraulic diameter на панели состояния внизу. Дополнительные сведения см. в разделе Сведения о обозревателе результатов Simscape.

Использование 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

Предложение expression определяет область подстановки. Начинается с ключевого слова 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

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

См. также

Связанные темы