Main Content

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 un else.

  • 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 expresiones assert 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:

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

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ámetro A

  • Ninguno de los segundos elementos de pred1 o pred2 es verdadero, de modo que el segundo valor es el segundo elemento del parámetro C

  • El tercer elemento de pred2 es verdadero, de modo que el tercer valor es el tercer elemento del parámetro B

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

Consulte también

|

Temas relacionados