このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
方程式での条件式の使用
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