方程式での条件式の使用
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 である場合にのみ評価されます。
ルールと制限
すべての
if
にelse
が必要です。等式の総数とその次元および順序は、
if-elseif-else
ステートメントのすべての分岐で同じでなければなりません。ただし、assert
式については、分岐の式のカウントに含まれないため、このルールは適用されません。
例
x と y が 1 対 1 の関係の変数として宣言されたコンポーネントについて、次の区分方程式を指定します。
この方程式は、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
の最初の要素です。pred1
とpred2
のどちらの 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