ejemplos de ciclos repetitivos del libro essential matlab(2).pdf

9
UNMSM-EAP INGENIERÍA QUÍMICA COMPUTACIÓN APLICADA A LA INGENIERÍA PROF. HEBER HELFER C. 1 8.1 Determinar la repetición con for 8.1.1 Coeficiente binomial El coeficiente binomial es ampliamente usado en matemática y estadística. Se define como el número de formas de escoger r objetos de n sin importar el orden y está dada por ! !! (8.1) Si se usa esta forma, los factoriales pueden ser muy grandes, causando un desborde [un número más grande que el admitido por MATLAB]. Sin embargo, una idea revela que podemos simplificar la Ecuación (8.1) tal como sigue: ! (8.2) por ejemplo, 10 3 ! !! Usar la Ecuación (8.2) es, computacionalmente, mucho más eficiente: ncr = 1; n = 10; r = 3; for k = 1:r ncr = ncr * (n - k + 1) / k; end disp(ncr) El coeficiente binomial es, a veces, llamado 'ene-ce-erre' [nCr]. Use el programa para hacer cambios con algunos valores de muestra. 8.1.2 Procesos de Actualización Muchos problemas en ciencia e ingeniería involucran el modelamiento de un proceso donde la variable principal es repetidamente actualizada en un periodo de tiempo. Este es un ejemplo sobre tal proceso de actualización. Un lata de jugo de naranja a una temperatura de 25°C se coloca en un refrigerador, donde la temperatura F es 10°C. Queremos saber cómo cambia la temperatura del jugo de naranja en un periodo de tiempo. Una forma estándar de aproximarse a este tipo de problema es dividir el periodo de tiempo en un número de pequeños pasos, cada uno de longitud m. Si Ti es la temperatura en el inicio, con paso i, podemos usar el siguiente modelo para obtener Ti+1 a partir de Ti: (8.3)

Upload: brian-williams

Post on 29-Sep-2015

21 views

Category:

Documents


4 download

TRANSCRIPT

  • UNMSM-EAP INGENIERA QUMICA

    COMPUTACIN APLICADA A LA INGENIERA

    PROF. HEBER HELFER C.

    1

    8.1 Determinar la repeticin con for 8.1.1 Coeficiente binomial El coeficiente binomial es ampliamente usado en matemtica y estadstica. Se define como el nmero de formas de escoger r objetos de n sin importar el orden y est dada por

    !

    !! (8.1)

    Si se usa esta forma, los factoriales pueden ser muy grandes, causando un desborde [un nmero ms grande que el admitido por MATLAB]. Sin embargo, una idea revela que podemos simplificar la Ecuacin (8.1) tal como sigue:

    ! (8.2)

    por ejemplo,

    103 !!!

    Usar la Ecuacin (8.2) es, computacionalmente, mucho ms eficiente:

    ncr = 1; n = 10; r = 3; for k = 1:r ncr = ncr * (n - k + 1) / k; end disp(ncr)

    El coeficiente binomial es, a veces, llamado 'ene-ce-erre' [nCr]. Use el programa para hacer cambios con algunos valores de muestra.

    8.1.2 Procesos de Actualizacin Muchos problemas en ciencia e ingeniera involucran el modelamiento de un proceso donde la variable principal es repetidamente actualizada en un periodo de tiempo. Este es un ejemplo sobre tal proceso de actualizacin.

    Un lata de jugo de naranja a una temperatura de 25C se coloca en un refrigerador, donde la temperatura F es 10C. Queremos saber cmo cambia la temperatura del jugo de naranja en un periodo de tiempo. Una forma estndar de aproximarse a este tipo de problema es dividir el periodo de tiempo en un nmero de pequeos pasos, cada uno de longitud m. Si Ti es la temperatura en el inicio, con paso i, podemos usar el siguiente modelo para obtener Ti+1 a partir de Ti:

    (8.3)

  • UNMSM-EAP INGENIERA QUMICA

    COMPUTACIN APLICADA A LA INGENIERA

    PROF. HEBER HELFER C.

    2

    donde K es un parmetro constante que depende de la propiedades de aislamiento de la lata y las propiedades trmicas del jugo de naranja. Asuma que las unidades se escogen de modo tal que el tiempo se mida en minutos.

    El siguiente programa implementa este esquema. Para que la solucin sea ms general tome el tiempo inicial como a y el tiempo final como b. Si dt es muy pequeo sera inconveniente hacer que la presentacin se haga en cada paso, de modo que el programa tambin le pregunta por el intervalo de salida opint. ste es el tiempo (en minutos) entre las filas sucesivas de la salida. Chequea que este intervalo es un entero mltiplo de dt. Corra este programa con algunos valores de muestra, por ejemplo, dt = 0.2 minutos y opint = 5 minutos (estos son los valores usados para la salida de este programa).

    K = 0.05; F = 10; a = 0; % tiempo inicial b = 100; % tiempo final tiempo = a; % se inicializa el tiempo T = 25; % se inicializa la temperatura load train % se prepara para tocar el silbato dt = input( 'dt: ' ); opint = input( 'intervalo de salida (minutos): '); if opint/dt ~= fix(opint/dt) sound(y, Fs) % suena el silbato! disp( 'el intervalo de salida no es un mltiplo de dt!'); break end clc format bank disp( ' Tiempo Temperatura' ); disp( [tiempo T] ) % despliega los valores iniciales for tiempo = a+dt:dt:b T = T - K * dt * (T - F); if abs(rem(tiempo, opint)) < 1e-6 % prcticamente cero! disp( [tiempo T] ) end end

    Salida: Tiempo Temperatura

    0 25.00 5.00 21.67 ...

    95.00 10.13 100.00 10.10 Nota: 1. La funcin rem es usada para desplegar los resultados cada opint minutos: cuando tiempo es un entero mltiplo de opint, su residuo, cuando es dividido por opint deber ser cero. Sin embargo, debido al error de redondeo, el residuo no siempre es exactamente cero. Por consiguiente, es mejor probar si el valor absoluto es menor que algun valor muy pequeo.

  • UNMSM-EAP INGENIERA QUMICA

    COMPUTACIN APLICADA A LA INGENIERA

    PROF. HEBER HELFER C.

    3

    2. Puesto que esta es, probablemente la forma ms obvia de escribir el programa, no podemos graficar fcilmente la temperatura contra el tiempo porque tiempo y T son escalares que son actualizados repetidamente. Para graficar, ambos deben ser vectores

    3. Note cmo se implementa el sonido (sound). Vea help audio por otros sonidos suministrados por MATLAB. 4. En el caso que usted quiera saber cmo coloqu los encabezados en el lugar correcto, les dir el secreto. Corra el programa sin encabezados pero con la salida numrica como la desea. Luego, simplemente pegue la sentencia disp con los encabezados en la ventana de comandos y edtela hasta que los encabezados queden en el lugar correcto. Pegue la versin final de la sentencia disp en el programa. 5. Note el uso de break para detener el programa prematuramente si el usuario escribe una entrada mala.

    8.2.1 Un juego de adivinanza El problema es fcil de enunciar. MATLAB 'piensa' un entero entre 1 y 10 (genera uno al azar). Usted tiene que adivinarlo. Si su eleccin es ms alta o ms baja, el programa debe decirlo. Si su eleccin es correcta, se debe desplegar un mensaje de felicitaciones Aqu se requiere un poco ms de idea as que podra ser til un plan estructurado: 1. Genera un nmero entero 2. Pide que adivine el nmero 3. Mientras el nmero elegido sea incorrecto:

    Si la eleccin es muy baja Dgale que es muy baja

    Sino Dgale que es muy alta

    Pdale al usuario otro nmero

    4. Felicitaciones formales 5. Detenerse.

    Aqu est el programa: clc clear all matnum = floor(10 * rand + 1); eleccion = input('Su eleccin por favor: '); load splat while eleccion ~= matnum sound(y, Fs) if eleccion > matnum disp('Demasiado alto') else disp('Demasiado bajo') end eleccion = input('Su eleccin por favor: '); end disp( 'Al fin!' ) load handel sound(y, Fs) % aleluya!

  • UNMSM-EAP INGENIERA QUMICA

    COMPUTACIN APLICADA A LA INGENIERA

    PROF. HEBER HELFER C.

    4

    Crralo varias veces. Note que el ciclo while se repite mientras que matnum es diferente de eleccion. No hay manera, en principio, de saber cuntos ciclos sern necesarios hasta que el usuario adivine correctamente. El problema es verdaderamente indeterminado. Note que eleccion tiene que ser leido dos veces: primero, para hacer que el ciclo while se inicie y, segundo, durante la ejecucin de while.

    8.2.3 Duplicando el dinero de una inversin Suponga que ha invertido algo de dinero que rinde el 10 por ciento de inters anual, compuesto. Nos gustara saber cunto tiempo se debe invertir para que se duplique. Ms especficamente, queremos una sentencia que cuente cada ao, hasta que el balance se haya duplicado. La sentencia del problema da a entender muy fuertemente que deberamos usar un ciclo repetitivo indeterminado con el siguiente plan de estructura:

    1. Inicialice balance, ao, tasa de inters 2. Despliegue los encabezados 3. Repita

    Actualizar el balance de acuerdo a la tasa de inters Despliegue el ao y balance

    Hasta que el balance sea mayor que dos veces el balance original 4. Detenerse.

    Un programa para implementar este plan sera

    clc clear all a = 1000; r = 0.1; bal = a; agno = 0; disp( 'Ao Balance' ) while bal < 2 * a bal = bal + r * bal; agno = agno + 1; fprintf('%3d %6.2f\n',agno, bal) end

    Note que la frase ms natural en el plan de estructura, 'hasta que el balance exceda dos veces el balance original', debe ser codificado como

    while bal < 2 * a ... Esta condicin es chequeada cada vez, antes que otro ciclo contine. La repeticin ocurre solo si la condicin es cierta. Aqu vemos algo del despliegue (para un balance de apertura de $1000): Ao Balance 1 1100.00 2 1210.00 3 1331.00 4 1464.10 5 1610.51 6 1771.56 7 1948.72

  • UNMSM-EAP INGENIERA QUMICA

    COMPUTACIN APLICADA A LA INGENIERA

    PROF. HEBER HELFER C.

    5

    8 2143.59

    Note que, cuando el ltimo ciclo se ha completado, la condicin de repetir es falsa por primera vez, puesto que el nuevo balance ($2143.59) es mayor que $2000. Note tambin que un ciclo repetitivo determinado for no puede ser usado porque no se sabe cuntos ciclos son necesarios sino hasta despus que se corra el programa (aunque, en este ejemplo particular, probablemente, usted podra ejercitarse de antemano en cuntas repeticiones son necesarias?). Si usted quiere escribir el nuevo balance solo mientras es menor que $2000, todo lo que tiene que hacer es mover la sentencia fprintf('%3d %6.2f\n',agno, bal) para que sea la primera sentencia en el ciclo repetitivo while. Note que ahora se desplegara el balance inicial de $1000.

    8.2.4 Nmeros primos Mucha gente est obsesionada con los nmeros primos, y muchos libros de programacin tiene que incluir un algoritmo para probar si un nmero dado es primo. As que aqu est el mo. Un nmero es primo si no es un mltiplo exacto de cualquier otro nmero excepto a s mismo y 1, es decir, no tiene factores excepto a s mismo y 1. El plan ms fcil de atacar es entonces el que sigue. Suponga que P es el nmero que va a ser probado. Vea si cualesquiera nmeros N pueden encontrarse de tal modo que dividan a P sin residuo. Si no hay ninguno, P es primo. Qu nmeros N deberamos probar? Bien, podemos acelerar las cosas restringiendo los P a nmeros impares de modo que solo tenemos que probar divisores N impares. Cundo detenemos la prueba? Cuando N = P? No, no podemos parar mucho antes. De hecho, podemos parar una vez que N alcance , puesto que, si hay un factor ms grande que , debe haber uno correspondiente menor que , que habramos encontrado. Y dnde comenzamos? Bien, puesto que N=1 ser un factor de cualquier P, deberamos comenzar en N=3. El plan de estructura es como sigue: 1. Leer P 2. Inicializar N a 3 3. Encontrar el residuo R cuando P es dividido por N 4. Mientras R 0 y N < , repita:

    Incremente N por 2 Encuentre R cuando P es dividido por N

    5. Si R 0 entonces Escribir 'P es primo'

    Sino Escribir 'P no es primo'

    6. Parar.

    Note que podran no haber repeticiones -R podra ser cero la primera vez. Note tambin que hay dos condiciones por las cuales el ciclo repetitivo podra detenerse. En consecuencia, se requiere un if despus de terminar el ciclo para determinar qu condicin lo detuvo. Vea si puede escribir un programa. A continuacin pruebe los siguientes valores: 4058879 (no es primo), 193707721 (es primo) y 2147483647 (es primo). En el caso de que le interese, el nmero primo conocido ms grande, en el momento de escribir esto fue

    269725931 (descubierto en junio de 1999). Tiene 2098960 cifras y ocupara alrededor de 70 pginas si fuera impreso en un peridico. Obviamente nuestro algoritmo no puede probar nmero tan grande

  • UNMSM-EAP INGENIERA QUMICA

    COMPUTACIN APLICADA A LA INGENIERA

    PROF. HEBER HELFER C.

    6

    puesto que es inimaginablemente ms grande que el nmero ms grande que pudiera ser representado por MATLAB. Las formas de probar tales nmeros inmensos fueron descritas en D.E. Knuth, The Art of Computer Programming. Volumen 2. Seminumerical Alghorithms (Addison-Wesley, 1981). Este gigante en particular fue encontrado por GIMPS (Great Internet Mersenne Prime Search). Vea http://www.utm.edu/research/primes/largest.html para obtener mayor informacin sobre los nmeros primos ms grandes conocidos.

    8.2.5 Trayectoria de un proyectil En el captulo 3 consideramos el vuelo de un proyectil, dadas las ecuaciones usuales de movimiento (asumiendo que no hay resistencia del aire). Nos gustara saber cundo y dnde caer a tierra. A pesar de que este problema puede resolverse con ciclo repetitivo determinado [for] (si usted sabe suficiente matemtica aplicada), tambin es de inters ver cmo resolverlo con un ciclo while indeterminado. La idea es calcular la trayectoria repetidamente con el aumento del tiempo, mientras el desplazamiento vertical (y) permanece positivo. Aqu est el programa.

    dt = 0.1; g = 9.8; u = 60; ang = input( 'ngulo de lanzamiento en grados: ' ); ang = ang * pi / 180; % convierte a radianes x = 0; y = 0; t = 0; % para inicializar more(15) while y >= 0 disp( [t x y] ) t = t + dt; y = u * sin(ang) * t - g * t^2 / 2; x = u * cos(ang) * t; end

    El comando more(n) nos entrega n lneas de salida antes de hacer una pausa. Esto es llamado paginado. Para obtener otra lnea de salida presione Enter. Para obtener la siguiente pgina presione la barra espaciadora. Para salir presione q. Pruebe el programa con diferentes ngulos de lanzamiento. Puede encontrar el ngulo de lanzamiento con el que se obtenga el rango horizontal mximo? Qu ngulo de lanzamiento permite mantener el proyectil en el aire por el mayor tiempo?

    Note que cuando, finalmente, termina el ciclo, el valor de y ser negativo (chequee esto desplegando y). Sin embargo, la posicin de la sentencia disp asegura que solo valores positivos de y sean presentados. Si, por alguna razn, usted necesita el registro del ltimo valor de t, digamos, antes que y se haga negativo, necesitar una sentencia if dentro de while, por ejemplo:

    if y >= 0 tmax = t; end

    Cambie el programa para que despliegue el ltimo valor positivo de y (tmax), despus que termin el ciclo repetitivo while.

  • UNMSM-EAP INGENIERA QUMICA

    COMPUTACIN APLICADA A LA INGENIERA

    PROF. HEBER HELFER C.

    7

    Ahora suponga que queremos graficar la trayectoria, tal como se muestra en la Figura 8.1. Note en particular cmo la trayectoria se detiene por encima del eje x. Ahora necesitamos usar vectores.

    Aqu est el programa:

    Figura 8.1 Trayectoria del proyectil

    dt = 0.1; g = 9.8; u = 60; ang = input( 'Ingrese el ngulo de lanzamiento en grados:' ); ang = ang * pi / 180; % convierte a radianes xp = zeros(1); yp = zeros(1); % inicializa y = 0; t = 0; i = 1; % valor inicial del vector while y >= 0 t = t + dt; i = i + 1; y = u * sin(ang) * t - g * t^2 / 2; if y >= 0 xp(i) = u * cos(ang) * t; yp(i) = y; end end plot(xp, yp),grid

    Note que la funcin zeros es usada para inicializar los vectores. Esto tambin borra cualquier vector del mismo nombre que merodee en los alrededores del espacio de trabajo proveniente de anteriores corridas. Note tambin el uso de un if dentro de del ciclo while para asegurar que solo las coordenadas de los puntos por encima del suelo se agreguen a los vectores xp y yp. Si quiere el ltimo punto por encima del suelo, pruebe un valor ms pequeo de dt, por ejemplo, 0.01.

    8.2.6 break y continue

    Cualquier estructura repetitiva que pudiera encontrar en la programacin cientfica puede ser codificada ya sea por ciclos for o while "puros", tal como se ilustra en los ejemplos de este captulo.

  • UNMSM-EAP INGENIERA QUMICA

    COMPUTACIN APLICADA A LA INGENIERA

    PROF. HEBER HELFER C.

    8

    Sin embargo, haciendo una concesin a la flojera intelectual me siento obligado a hacer mencin de las sentencias break y continue. Si hay un nmero de diferentes condiciones para detener un ciclo while, usted estara tentado de usar un ciclo for con el nmero de repeticiones de acuerdo a un valor de finalizacin aceptado (an inclusive Inf) pero, con la inclusin de sentencias if que incluyan break que permitan salir del ciclo for cuando las diversas condiciones se cumplan. Porqu esto no se considera el mejor estilo de programacin? La razn es, simplemente, que cuando lea la codificacin meses despus, usted tendr que leer a travs de todo el ciclo repetitivo, todas las condiciones para terminarlo, en vez de verlos todos al comienzo del ciclo en la clusula while. !Si va a insistir en usar break tendr que buscar en la ayuda de MATLAB por su cuenta! La sentencia continue es algo menos virulenta que break

    EJERCICIOS

    8.1 Una persona depsita $1000 en un banco, el inters es compuesto mensual, a la tasa de inters de 1 por ciento al mes. Escriba un programa que calcule el balance mensual, pero escrbalo solo anualmente por 10 aos (use ciclos for anidados, con el ciclo externo para 10 aos y el interno por 12 meses). Note que despus de 10 aos el balance es $3300.39, mientras que, si el inters ha sido compuesto anualmente, a una tasa de retorno de 12 por ciento por ao, el balance solo habra sido $3105.85. Vea si puede vectorizar su solucin.

    8.2 Hay muchas frmulas para calcular (la razn de la circunferencia del crculo respecto a su dimetro). La ms simple es

    !" 1

    #

    $

    #

    (8.4)

    la cual proviene de hacer x = 1 en la serie

    arctan * * +,

    #+-$

    +. #

    +/ (8.5)

    (a) Escriba un programa que calcule usando la Ecuacin (8.4). Use tantos trminos de la serie como su computadora permita razonablemente (comience modestamente, digamos con 100 trminos y vuelva a correr el programa con ms y ms trminos cada vez). Encontrar que la serie converge muy lentamente, es decir, se debe usar muchos trminos para obtener un valor suficientemente cercano a .

    (b) Rearreglando, la serie acelera su convergencia. 08

    11 3 #

    15 7 #

    19 11

    Escriba un programa que calcule usando esta serie en vez de la anterior. Encontrar que necesita menos trminos para alcanzar el mismo nivel de exactitud que obtuvo en (a).

    (c) Una de las series ms rpidas para es 04 6 arctan

    18 #2 arctan

    157 #arctan

    1239

  • UNMSM-EAP INGENIERA QUMICA

    COMPUTACIN APLICADA A LA INGENIERA

    PROF. HEBER HELFER C.

    9

    Use esta frmula para calcular . No use la funcin atan de MATLAB para calcular los arcotangentes, porque sera hacer trampa. En vez de ello use la Ecuacin (8.5).

    8.4 Escriba un programa para calcular una tabla de la funcin

    8* * :;< =!+ >

    sobre el intervalo cerrado [-1, 1] usando incrementos de (a) 0.2 (b) 0.1 y (c) 0.01. Use su tabla para hacer una grfica de f(x) para los tres casos (a mano) y observe que las tablas de (a) y (b) dan una presentacin completamente errnea de f(x). Use su programa para dibujar la grfica de f(x) para los tres casos, superimpuestas.

    Traducido y adaptado del libro: ESSENTIAL MATLAB for Engineers and Scientists por Brian Hahn y Daniel T. Valentine Ed. Elsevier, 2007. Pgs. 205-.