Utilizar expresiones condicionales en ecuaciones
Puede especificar expresiones condicionales en ecuaciones o asignaciones condicionales a valores intermedios utilizando instrucciones if
e .if
. En una instrucción if
, los predicados deben ser escalares. Para evaluar predicados de tipo arreglo, utilice instrucciones .if
.
Sintaxis de instrucciones if
Puede especificar ecuaciones condicionales utilizando instrucciones if
.
equations [...] if PredicateExpression1 [...] % if branch equations elseif PredicateExpression2 [...] % elseif branch equations else [...] % else branch equations end [...] end
Cada sección [...]
contiene una o más expresiones de ecuación.
Las ramificaciones if
y elseif
empiezan con una expresión de predicado. Si un predicado es verdadero, se activan las ecuaciones de esa ramificación. Cuando todos los predicados son falsos, se activan las ecuaciones de la ramificación else
.
Puede anidar instrucciones if
, por ejemplo:
equations [...] if PredicateExpression1 [...] if PredicateExpression2 [...] else [...] end else [...] end [...] end
En este ejemplo, la expresión del segundo predicado solo se evalúa si el primer predicado es verdadero.
Reglas y restricciones
Cada
if
requiere unelse
.El número total de expresiones de ecuaciones, su dimensionalidad y su orden deben ser los mismos para cada ramificación de la instrucción
if-elseif-else
. Sin embargo, esta regla no se aplica a las expresionesassert
porque no se incluyen en el recuento de expresiones para la ramificación.
Ejemplo
En el caso de un componente donde x e y se declaran como variables de 1x1, especifique la siguiente ecuación definida por partes:
Esta ecuación, escrita en el lenguaje de Simscape™, presentaría el siguiente aspecto:
equations if x >= -1 && x <= 1 y == x; else y == x^2; end end
Otra forma de escribir esta ecuación en el lenguaje de Simscape es la siguiente:
equations y == if x>=-1 && x<=1, x else x^2 end end
Predicados condicionales de tipo arreglo
Puede realizar operaciones condicionales elemento por elemento con predicados de tipo arreglo, utilizando instrucciones .if
. Por ejemplo:
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
Con estos valores de entrada, el valor intermedio y
evalúa [1 8 6]
porque:
El primer elemento de
pred1
es verdadero, de modo que el primer valor es el primer elemento del parámetroA
Ninguno de los segundos elementos de
pred1
opred2
es verdadero, de modo que el segundo valor es el segundo elemento del parámetroC
El tercer elemento de
pred2
es verdadero, de modo que el tercer valor es el tercer elemento del parámetroB
Reglas y restricciones
Cada
.if
requiere un.else
.Las ramificaciones
.elseif
son opcionales. Cualquier ramificación.elseif
posterior debe tener un predicado del mismo tamaño y forma que el predicado de la ramificación.if
original.Cada una de las ramificaciones de la instrucción
.if-.elseif-.else
debe coincidir con el tamaño y forma de los predicados. La expansión escalar es aplicable.La necesidad de expansión escalar se determina caso por caso en función de la ramificación, por lo que se puede utilizar un arreglo en una ramificación y un escalar en otra.
Las unidades deben ser proporcionales entre las ramificaciones.
Las instrucciones
.if
deben terminar con la palabra clave.end
.La salida es un arreglo del mismo tamaño y forma que el predicado de la ramificación
.if
. Para múltiples valores de retorno, cada variable de salida debe ser del mismo tamaño y forma que el predicado.
No se admiten predicados de tipo arreglo para:
Secciones condicionales
Gráficos de modo
Instrucciones ASSERT
Ejemplo
Este componente representa un bloque de saturación vectorizado:
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