方程式での条件式の使用
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