2.2 Bucles iterativos: while, for, emulación de do-while y control de flujo

Enunciado del ejercicio

1. El bucle while para procesos de convergencia numérica La estructura while reitera un bloque mientras su condición lógica permanezca verdadera: \(\text{while } \text{condición:}\) $$\text{cuerpo_del_bucle}$$ \(\text{actualización_variable}\) Ejemplo: Para calcular cuántas vidas medias transcurren hasta que la actividad decae por debajo del umbral de seguridad: \(\text{actividad} = 100.0; \text{ciclos} = 0\) $$\text{while actividad > 1.0:}$$ $$\text{actividad} = \text{actividad} / 2.0$$ \(\text{ciclos} = \text{ciclos} + 1\) 2. El bucle for y la función generadora range() El bucle for recorre colecciones iterables o secuencias aritméticas generadas por range(inicio, fin, paso): \(\text{range(inicio, fin, paso)} \quad \longrightarrow \quad [\text{inicio}, \text{fin}) \text{ excluyendo el límite superior}\) Ejemplo: Para iterar diez valores de potencial eléctrico espaciados en pasos discretos de 1 a 10 voltios: \(\text{for v in range(1, 11):}\) \(\text{print(f"Potencial de barrido: \{v\} V")}\) 3. Control de flujo en bucles: break, continue y cláusula else Las sentencias de interrupción alteran el flujo habitual del ciclo: \(\text{break (salida inmediata)}, \quad \text{continue (salto a siguiente iteración)}, \quad \text{else (ejecución si no hubo break)}\) Ejemplo: Para ignorar valores nulos durante la integración de una señal espectral: \(\text{for senal in mediciones:}\) $$\text{if senal == 0.0:}$$ $$\text{continue}$$ \(\text{procesar_senal(senal)}\) 4. Emulación de bucles do-while y algoritmos de aproximación Python no posee do-while nativo, pero se emula mediante un bucle infinito while True con break interno: \(\text{while True:}\) $$\text{calcular_aproximacion()}$$ \(\text{if residuo < tolerancia: break}\) Ejemplo: Para iterar un refinamiento numérico hasta alcanzar una tolerancia menor de 1e-6: \(\text{while True:}\) $$\text{x_nuevo} = 0.5 * (\text{x} + \text{a} / \text{x})$$ $$\text{if abs(x_nuevo - x) < 1.0e-6: break}$$ \(\text{x} = \text{x_nuevo}\) Ejemplo 1: Cálculo del número de iteraciones requeridas para el decaimiento radiactivo de un trazador nanoscópico.

PASO 1

Inicialización de actividad inicial y umbral de parada.

Asignamos la actividad al 100% y el criterio de parada en 0.5%:

$$\text{actividad} = 100.0; \text{umbral} = 0.5$$
$$\text{vida_media_dias} = 3.8; \text{periodos} = 0$$
PASO 2

Ejecución del bucle iterativo while.

Reiteramos la desintegración mientras la actividad sea superior al umbral:

$$\text{while actividad > umbral:}$$
$$\text{actividad} = \text{actividad} * 0.5$$
$$\text{periodos} = \text{periodos} + 1$$
Conclusión

Se requieren 8 vidas medias (30.4 días) para que la actividad decaiga por debajo del 0.5%.

Ejemplo 2:

Generación de una rampa lineal de potenciales de barrido para voltamperometría cíclica con for y range().

PASO 1

Configuración de límites y paso discreto.

Deseamos barrer de -500 mV a +500 mV en pasos de 100 mV:

$$\text{v_inicio} = -500; \text{v_fin} = 500; \text{paso} = 100$$
PASO 2

Recorrido iterativo con range incluyendo el límite superior.

Generamos los puntos sumando el paso al límite superior:

$$\text{for v_mv in range(v_inicio, v_fin + paso, paso):}$$
$$\text{v_voltios} = \text{v_mv} / 1000.0$$
$$\text{print(f"Potencial de electrodo: \{v_voltios:+.2f\} V")}$$
Conclusión

El bucle for genera exactamente 11 puntos de muestreo equidistantes entre -0.50 V y +0.50 V.

Ejemplo 3:

Filtrado selectivo de señales ruidosas con continue en una serie de mediciones de espesor de capa.

PASO 1

Definición de una secuencia de lecturas con valores físicos y aberrantes.

Declaramos una tupla con valores en nanómetros:

$$\text{lecturas} = (12.4, -999.0, 12.8, 0.0, 13.1, -999.0, 12.6)$$
PASO 2

Recorrido saltando mediciones espurias.

Ignoramos lecturas negativas o no físicas mediante continue:

$$\text{suma_validas} = 0.0; \text{conteo} = 0$$
$$\text{for valor in lecturas:}$$
$$\text{if valor <= 0.0:}$$
$$\text{continue}$$
$$\text{suma_validas} = \text{suma_validas} + \text{valor}$$
$$\text{conteo} = \text{conteo} + 1$$
Conclusión

Se procesan 4 valores válidos con un espesor medio de 12.73 nm sin contaminación de valores centinela.

Ejemplo 4:

Búsqueda lineal del umbral de percolación eléctrica con interrupción anticipada mediante break.

PASO 1

Serie de fracciones volumétricas de nanotubos en una matriz polimérica.

Asignamos concentraciones ensayadas y sus conductividades eléctricas asociadas:

$$\text{fracciones} = (0.001, 0.005, 0.010, 0.020, 0.050)$$
$$\text{conductividades} = (1.0\text{e-}12, 5.0\text{e-}12, 8.0\text{e-}11, 2.5\text{e-}3, 1.2\text{e-}1)$$
PASO 2

Detección del primer salto conductor con break.

Buscamos el punto donde la conductividad supera 1e-4 S/m:

$$\text{umbral_percolacion} = \text{None}$$
$$\text{for i in range(len(fracciones)):}$$
$$\text{if conductividades[i] > 1.0e-4:}$$
$$\text{umbral_percolacion} = \text{fracciones[i]}$$
$$\text{break}$$
Conclusión

El umbral de percolación se detecta tempranamente en una fracción volumétrica de 0.020 (2.0%).

Ejemplo 5:

Algoritmo iterativo de Newton-Raphson para aproximar la raíz de una ecuación de estado nanológica.

PASO 1

Parámetros del método iterativo.

Deseamos hallar la solución de f(x) = x³ - 2 = 0 (raíz cúbica de 2):

$$\text{x} = 1.0; \text{tolerancia} = 1.0\text{e-}7; \text{max_iter} = 50$$
$$\text{iteracion} = 0$$
PASO 2

Ejecución del ciclo iterativo de convergencia.

Actualizamos x = x - f(x)/f'(x) hasta que el cambio sea menor que la tolerancia:

$$\text{while iteracion < max_iter:}$$
$$\text{fx} = \text{x} ** 3 - 2.0$$
$$\text{dfx} = 3.0 * (\text{x} ** 2)$$
$$\text{delta_x} = \text{fx} / \text{dfx}$$
$$\text{x} = \text{x} - \text{delta_x}$$
$$\text{iteracion} = \text{iteracion} + 1$$
$$\text{if abs(delta_x) < tolerancia: break}$$
Conclusión

En tan solo 5 iteraciones el método converge a x = 1.25992105 con precisión de siete cifras decimales.