Saltar al contenido principal
LibreTexts Español

4.8: Control de flujo

  • Page ID
    87581
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    Declaración

    El enunciado if es muy sencillo. La sintaxis general viene dada por

    si expresión lógica_1

    BLOQUE 1

    elseif expresión lógica _2

    BLOQUE 2

    else

    BLOQUE 3

    final

    que es interpretado por Matlab de la siguiente manera:

    si la expresión lógica 1 se evalúa como true, ejecute BLOQUE 1 y vaya al final (y continúe con la siguiente línea en el programa);

    si la expresión lógica 1 se evalúa como false, pero la expresión lógica 2 evalúa como true, ejecuta BLOQUE 2 e ir al final (y continuar);

    si la expresión lógica 1 es falsa y la expresión lógica 2 es falsa, ejecute BLOQUE 3 y vaya al final (y continúe).

    Tenga en cuenta que son posibles varias variantes: podemos incluir múltiples sentencias elseif entre BLOCK 1 y else; y podemos omitir las sentencias else y BLOCK 3.

    En el caso de que de hecho haya muchos casos hay otra declaración de Matlab que sin duda es preferible a la sentencia if: la sentencia switch. No discutimos la declaración switch aquí, sino que aprovechamos esta oportunidad para recordar la muy útil función help: >> help switch le proporcionará una descripción rápida (pero suficiente) de la sintaxis y funcionalidad de la sentencia switch.

    while Declaración

    La sintaxis de la sentencia while es

    inicializar var 1, var 2,.

    mientras que la expresión relacional o lógica while (var 1, var 2,.)

    BLOQUE% nuevos valores asignados a var 1, var 2,...

    final

    Esta declaración es un bucle que es controlado por el valor de la variable lógica que es el resultado de la evaluación de relational_or_logical_expression_while. Lo que hace que la declaración sea poderosa es que relational_or_logical_expression_while puede depender de var 1, var 2,.., los valores de los cuales se cambian en cada paso a través del bucle. En particular, el while se ejecuta de la siguiente manera: si la expresión relacional o lógica while (var 1, var 2,.) es true, ejecutar (las líneas de instrucción en) BLOQUEAR, de lo contrario ir al final y continuar con la siguiente línea de programa de la que el while es parte; repetir. Tenga en cuenta que var 1, var 2,... debe inicializarse antes de ingresar al bucle while

    Como ejemplo, consideramos

    >> i = 0;
    >> sum_of_integers = 0;
    >> while i <= 3
            sum_of_integers = sum_of_integers + i;
            i = i + 1;
        end
    >> sum
    sum_of_integers =
        6
    >>  
    

    Aquí, expresión relacional o lógica while (var 1) es la expresión simple i <= 3, donde i juega el papel de var 1. De hecho, esta suma particular se realiza más fácilmente con una declaración for, como describimos en breve. El verdadero valor del while es cuando la expresión relacional o lógica es una función más complicada de las variables que son cambiadas por el BLOQUE y en particular cuando no sabemos a priori cuántas iteraciones a través del bucle serán necesarias.

    Por ejemplo, creamos la máquina script eps.m

    % script to calculate machine epsilon
    mach_eps = 1;
    while (1 + mach_eps ~= 1)
        mach_eps = mach_eps/2.;
    end
    mach_eps
    

    en el editor. Tenga en cuenta que a medida que comencemos a construir programas un poco más largos comenzaremos a usar el modo script en lugar del modo de línea de comandos. La entrada es más fácil, al igual que la depuración y modificación, y por supuesto la reutilización. Además, el editor dentro de Matlab reconoce varias palabras clave y formatea automáticamente declaraciones para mejorar la legibilidad. Tenga en cuenta también la línea de comentarios: cualquier material en una línea que siga un% será ignorado por el intérprete y solo sirve para educar al autor y usuario en cuanto a la intención del programa o líneas particulares del programa.

    Luego entramos en la ventana de comandos

    >> machine_eps
    mach_eps =
        1.1102e-16
    >>
    

    que ejecuta nuestro guión. Por supuesto, este código solo está calculando para nosotros la precisión de la máquina, lo que concuerda con el eps de Matlab dentro del factor de dos relacionados con nuestra tolerancia de parada.

    Por último, observamos que puede incluir un break en una sentencia BLOCK

    if (ruptura de expresión relacional o lógica) break

    que irá directamente a la sentencia end del bucle while bastante independiente de si relational_or_logical_expression_while (para los valores actuales de var 1, var 2,..) es true o false. Los puristas suelen tratar de evitar declaraciones de ruptura, pero los pragmáticos toleran la declaración ocasional de break. Demasiadas declaraciones de ruptura pueden ser un síntoma de un diseño deficiente del programa o, en general, de tendencias pasivo-agresivas.

    Declaración

    La sintaxis de la sentencia for es

    para VARCOUNTER = LIM 1: INCREMENTO: LIM 2

    BLOQUE% sin reasignación de VARCOUNTER

    final

    Normalmente LIM_1, INCREMENT, LIM_2 serían enteros (aunque sean de tipo de datos double), sin embargo también hay muchos casos en los que estas variables podrían ser (matemáticamente) no enteras. Tenga en cuenta también que INCREMENT puede ser positivo o negativo, y que si no se especifica INCREMENT, entonces MATLAB elige el valor predeterminado INCREMENT\(=1\).

    La ejecución del bucle for es simple: ejecutamos BLOCK for VARCOUNTER = LIM_1; actualizamos VARCOUNTER = VARCOUNTER + INCREMENT; entonces, si VARCOUNTER\(<=\) LIM_ 2, repita. En cuanto a una sentencia while, podemos interrumpir el flujo habitual del bucle for con una sentencia break. Tenga en cuenta que si\(L I M_{-} 1+\) el INCREMENTO es menor que\(L I M_{-} 2\) entonces BLOQUE nunca se ejecutará.

    Repetimos nuestro ejemplo anterior:

    >> sum_of_integers = 0;
    >> for i = 1:3
        sum_of_integers = sum_of_integers + 1;
       end
    >> sum_of_integers
    
    sum_of_integers = 
        3
    >>
    

    Existen muchas situaciones en los métodos numéricos en las que el bucle for es el constructo ideal. Sin embargo, también es cierto que en MATLAB hay una serie de funciones relacionadas con la manipulación de matrices que, aunque implícitamente construidas sobre un for construction, suelen ser más eficientes que un bucle for explícito. Presentamos algunas de estas funciones en la siguiente sección.

    Finalmente, observamos que nuestra sintaxis for aquí no es tan general como la prevista por MATLAB. Sin embargo, la sintaxis más general requiere las nociones de arrays de índice único o multi-índice, que aún no hemos introducido. Siguiendo el tratamiento de las matrices, el lector debería\(\gg>\) ayudar para entender la generalización: en efecto, podemos requerir que VARCOUNTER realice un ciclo a través de cualquier conjunto particular de escalares (definidos en una matriz de índice único) o VARCOUNTER en sí mismo puede ser incluso un solo- matriz de índice que recorre un conjunto particular de matrices de índice único (definidas en una matriz de índice doble).


    This page titled 4.8: Control de flujo is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by Masayuki Yano, James Douglass Penn, George Konidaris, & Anthony T Patera (MIT OpenCourseWare) via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.