Main Content

方程式での条件式の使用

if ステートメントおよび .if ステートメントを使用して、方程式の条件式や中間値への条件付き代入を指定できます。if ステートメントでは、述語はスカラーでなければなりません。配列型述語を評価するには、.if ステートメントを使用します。

if ステートメントの構文

if ステートメントを使用して条件式を指定できます。

equations
  [...]
  if PredicateExpression1
    [...] % if branch equations
  elseif PredicateExpression2
    [...] % elseif branch equations
  else
    [...] % else branch equations
  end
  [...]
end

それぞれの [...] セクションには、1 つ以上の方程式が含まれます。

if 分岐と elseif 分岐は、述語式で始まります。述語が true の場合、その分岐の方程式はアクティブになります。すべての述語が false の場合、else 分岐の方程式がアクティブになります。

if ステートメントは入れ子にできます。次に例を示します。

equations
  [...]
  if PredicateExpression1
    [...] 
    if PredicateExpression2
       [...]
    else
    [...]
    end
  else
    [...]
  end
  [...]
end

この例では、2 番目の述語式は、最初の述語が true である場合にのみ評価されます。

ルールと制限

  • すべての ifelse が必要です。

  • 等式の総数とその次元および順序は、if-elseif-else ステートメントのすべての分岐で同じでなければなりません。ただし、assert 式については、分岐の式のカウントに含まれないため、このルールは適用されません。

x と y が 1 対 1 の関係の変数として宣言されたコンポーネントについて、次の区分方程式を指定します。

y={xfor 1<= x<=1x2otherwise 

この方程式は、Simscape™ 言語で記述すると次のようになります。

equations
  if x >= -1 && x <= 1
    y == x;
  else
    y == x^2;
  end
end

この方程式を Simscape 言語で記述するもう 1 つの方法は次のとおりです。

equations
  y == if x>=-1 && x<=1, x else x^2 end
end

配列型条件付き述語

.if ステートメントを使用して、配列型述語で要素単位の条件付き演算を実行できます。次に例を示します。

component my_comp
inputs
  pred1 = [1 0 0];
  pred2 = [0 0 1];
end
parameters
    A = [1 2 3];
    B = [4 5 6];
    C = [7 8 9];
end
intermediates
    y = .if pred1, A; .elseif pred2, B; .else C; .end
end
... % Other parameters, variables, equations
end

これらの入力値では、中間値 y[1 8 6] と評価されます。理由は次のとおりです。

  • pred1 の最初の要素は true なので、最初の値はパラメーター A の最初の要素です。

  • pred1pred2 のどちらの 2 番目の要素も true ではないので、2 番目の値はパラメーター C の 2 番目の要素です。

  • pred2 の 3 番目の要素は true なので、3 番目の値はパラメーター B の 3 番目の要素です。

ルールと制限

  • すべての .if.else が必要です。

  • .elseif 分岐はオプションです。後続の .elseif 分岐は、元の .if 分岐述語と同じサイズ、形状の述語をもたなければなりません。

  • .if-.elseif-.else ステートメントの各分岐は、述語のサイズと形状に一致しなければなりません。スカラー拡張が適用されます。

    スカラー拡張が必要かどうかは分岐ごとに決定されるため、ある分岐では配列を使用し、別の分岐ではスカラーを使用することが許可されます。

  • 単位は分岐間で相応するものでなければなりません。

  • .if ステートメントは .end キーワードで終了します。

  • 出力は、.if 分岐述語と同じサイズ、形状の配列です。戻り値が複数の場合、各出力変数は述語と同じサイズ、形状です。

次に対する配列型述語は、サポートされていません。

  • 条件セクション

  • モード チャート

  • assert ステートメント

次のコンポーネントは、ベクトル化された Saturation ブロックを表します。

component vec_saturation
    inputs
        I = zeros([3 3]);
    end
 
    outputs
        ITrue = zeros(size(I));
    end
 
    parameters
        upper_limit = 5;
        lower_limit = 0.7;
    end
 
    equations
        ITrue == .if I>=upper_limit, upper_limit; 
                 .elseif I <= lower_limit, lower_limit; 
                 .else I; 
                 .end
    end
end

参考

|

関連するトピック