========================================== Ejercicios: Estructuras de Datos en Python ========================================== Introducción ----------- Este conjunto de ejercicios está diseñado para practicar el uso de listas y operaciones con secuencias en Python. Las listas son una de las estructuras de datos más versátiles en Python y son fundamentales para la manipulación de datos en aplicaciones científicas. Los problemas están enfocados en temas relacionados con la física, permitiéndote aplicar tus conocimientos de programación en contextos científicos relevantes. Operaciones Básicas con Listas ----------------------------- Ejercicio 1: Velocidad Media ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Un objeto se mueve a lo largo de una línea recta. Se han tomado 10 mediciones de su posición (en metros) en intervalos regulares de 0.5 segundos. **Datos de posición (metros):** .. code-block:: python posiciones = [0.0, 2.3, 4.8, 8.1, 10.5, 12.0, 12.7, 14.2, 17.5, 22.0] Estas mediciones corresponden a los tiempos t = 0.0s, 0.5s, 1.0s, ..., 4.5s. Se pide: a) Calcular la lista de velocidades instantáneas aproximadas entre mediciones consecutivas. b) Calcular la velocidad media del objeto durante todo el intervalo de tiempo. c) Identificar la velocidad instantánea máxima y mínima, indicando en qué intervalo de tiempo ocurrieron. Recuerda que la velocidad instantánea se puede aproximar como: .. math:: v_i \approx \frac{x_{i+1} - x_i}{\Delta t} donde :math:`\Delta t` es el intervalo de tiempo entre mediciones consecutivas (en este caso, 0.5 segundos). Ejercicio 2: Temperatura y Conversiones ======================================= En este ejercicio trabajarás con datos de temperaturas y realizarás conversiones entre diferentes escalas térmicas. Datos de Ejemplo --------------- Utiliza la siguiente lista de temperaturas medias diarias (en grados Celsius) para dos semanas: .. code-block:: python temperaturas_celsius = [ # Semana 1 [22.5, 25.3, 24.8, 23.2, 26.5, 27.8, 23.4], # Semana 2 [21.5, 24.1, 27.3, 28.4, 25.6, 22.9, 21.8] ] Tareas ------ a) Crea una nueva lista con las temperaturas convertidas a Kelvin. b) Crea otra lista con las temperaturas convertidas a Fahrenheit. c) Calcula la temperatura media semanal para ambas semanas y compáralas. Ecuaciones de conversión: .. math:: T_K = T_C + 273.15 T_F = T_C \times \frac{9}{5} + 32 Donde: - T_K es la temperatura en Kelvin - T_C es la temperatura en Celsius - T_F es la temperatura en Fahrenheit Ejercicio 3: Vectores en el Plano ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Representa dos vectores en el plano :math:`\vec{A}` y :math:`\vec{B}` como listas de dos elementos [x, y]. Luego: a) Calcula el vector suma :math:`\vec{C} = \vec{A} + \vec{B}` b) Calcula el vector diferencia :math:`\vec{D} = \vec{A} - \vec{B}` c) Calcula la magnitud (módulo) de cada vector. d) Calcula el producto escalar :math:`\vec{A} \cdot \vec{B}` Ecuaciones: .. math:: |\vec{V}| = \sqrt{V_x^2 + V_y^2} \vec{A} \cdot \vec{B} = A_x \times B_x + A_y \times B_y Recorrido y Manipulación de Listas --------------------------------- Ejercicio 4: Análisis de Datos Experimentales ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Considera la siguiente lista que representa mediciones de la aceleración de la gravedad (en m/s²) realizadas por estudiantes en un laboratorio: .. code-block:: python mediciones = [9.78, 9.82, 9.7, 10.1, 9.81, 9.79, 9.75, 8.9, 9.83, 9.81, 9.82, 9.8, 10.5, 9.76, 9.77] a) Filtra las mediciones eliminando valores atípicos (aquellos que difieren en más de 0.3 unidades del valor teórico de 9.8 m/s²). b) Calcula la media, mediana y desviación estándar de las mediciones filtradas. c) Determina el porcentaje de valores atípicos respecto al total de mediciones. Ejercicio 5: Movimiento Armónico Simple ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ La posición de una partícula en movimiento armónico simple viene dada por: .. math:: x(t) = A \cos(\omega t + \phi) donde :math:`A` es la amplitud, :math:`\omega` es la frecuencia angular y :math:`\phi` es la fase inicial. Genera una lista de posiciones para 100 instantes de tiempo en el intervalo [0, 5s] con los siguientes parámetros: A = 10 cm, ω = 2π rad/s, φ = 0. a) Crea una lista con las velocidades instantáneas para cada instante, usando: .. math:: v(t) = -A \omega \sin(\omega t + \phi) b) Crea una lista con las aceleraciones instantáneas para cada instante, usando: .. math:: a(t) = -A \omega^2 \cos(\omega t + \phi) c) Identifica los instantes donde la partícula: - Está en equilibrio (posición = 0) - Alcanza su velocidad máxima - Está en los extremos de su oscilación Ejercicio 6: Trayectoria de un Proyectil ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Un proyectil es lanzado con una velocidad inicial de 20 m/s y un ángulo de 45 grados. Las ecuaciones paramétricas del movimiento son: .. math:: x(t) = v_0 \cos(\theta) \cdot t y(t) = v_0 \sin(\theta) \cdot t - \frac{1}{2}gt^2 donde :math:`v_0` es la velocidad inicial, :math:`\theta` es el ángulo de lanzamiento, y :math:`g = 9.8\text{ m/s}^2` es la aceleración de la gravedad. a) Genera listas para las coordenadas x e y del proyectil en intervalos de 0.1 segundos, hasta que el proyectil toque el suelo (y = 0). b) Crea una lista para las velocidades instantáneas en cada punto de la trayectoria. c) Usando los datos generados, encuentra la altura máxima alcanzada y el alcance horizontal. Slicing y Operaciones Avanzadas ------------------------------ Ejercicio 7: Análisis de Ondas ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Para una onda estacionaria en una cuerda de 1 metro, la forma de la onda en diferentes instantes viene dada por: .. math:: y(x, t) = A \sin(kx) \cos(\omega t) donde :math:`k = \pi/L` es el número de onda y :math:`\omega = v \cdot k` es la frecuencia angular. Genera una lista con 200 posiciones x en el intervalo [0, 1] y calcula y(x) para t = 0, con A = 0.1 m, v = 10 m/s. a) Usando slicing, extrae: - La forma de la primera mitad de la onda - La forma de la segunda mitad de la onda - Un punto de cada tres en toda la onda - Los nodos de la onda (posiciones donde y = 0) b) Crea una nueva lista que represente la onda en el instante t = T/4, donde T es el período. c) Compara mediante slicing los valores máximos de la onda en t = 0 y t = T/4. Ejercicio 8: Análisis de Espectro ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ La siguiente lista representa una muestra de la intensidad de luz a diferentes longitudes de onda (en nm) para un espectro de emisión: .. code-block:: python longitudes_onda = [380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750] intensidades = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6, 0.55, 0.5, 0.45, 0.4, 0.35, 0.3, 0.25, 0.2, 0.15, 0.1, 0.05] a) Usando slicing, extrae: - Las longitudes de onda e intensidades del espectro visible (400-700 nm) - La región ultravioleta (<400 nm) - La región infrarroja (>700 nm) - Los datos de cada 50 nanómetros b) Encuentra la longitud de onda de máxima intensidad. c) Calcula la intensidad promedio en cada región del espectro (ultravioleta, visible e infraroja). Ejercicio 9: Cálculo del Momento de Inercia ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Considera una distribución de masas a lo largo de un eje. La posición (en metros) y la masa (en kg) de cada punto se almacenan en dos listas: .. code-block:: python posiciones = [-4, -3, -2, -1, 0, 1, 2, 3, 4] masas = [2, 1, 3, 2, 5, 2, 3, 1, 2] a) Usando slicing, analiza el sistema para: - Las masas en posiciones negativas - Las masas en posiciones positivas - Las masas en posiciones pares - Las masas en posiciones impares b) Calcula el centro de masa del sistema usando: .. math:: x_{CM} = \frac{\sum m_i x_i}{\sum m_i} c) Calcula el momento de inercia respecto al origen y respecto al centro de masa usando: .. math:: I_O = \sum m_i x_i^2 I_{CM} = \sum m_i (x_i - x_{CM})^2 Ejercicios de Listas en Física ------------------------------ Los siguientes ejercicios deben resolverse de dos formas, devolviendo siempre los resultados como listas de Python: 1. Método tradicional: Usando ciclos (for/while) y el método append() 2. Usando comprensiones de lista Ejercicio 10: Ley de Coulomb ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ La fuerza electrostática entre dos cargas puntuales según la ley de Coulomb es: .. math:: F = k \frac{q_1 q_2}{r^2} donde :math:`k = 8.99 \times 10^9 \text{ N}\cdot\text{m}^2/\text{C}^2` es la constante electrostática. Considera una carga de referencia :math:`q_1 = 1 \text{ μC}` y un conjunto de distancias r (en metros): [0.1, 0.2, 0.5, 1, 2, 5, 10]. a) Calcula la fuerza sobre una carga :math:`q_2 = 2 \text{ μC}` a cada distancia y almacena los resultados en una lista de Python. b) Calcula los valores de :math:`q_2` que producirían una fuerza de 1 N a cada distancia y almacena los resultados en una lista de Python. c) Para un conjunto de cargas :math:`q_2 = [-3, -2, -1, 1, 2, 3]` (en μC), calcula las fuerzas a una distancia de 1 m y almacena los resultados en una lista de Python. Ejercicio 11: Caída Libre con Resistencia del Aire ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Para un objeto en caída con resistencia del aire, la velocidad en cada instante viene dada por: .. math:: v(t) = v_t (1 - e^{-t/\tau}) donde :math:`v_t` es la velocidad terminal y :math:`\tau` es la constante de tiempo característica. a) Calcula las velocidades para los primeros 20 segundos (en intervalos de 0.5s) para un objeto con :math:`v_t = 50 \text{ m/s}` y :math:`\tau = 5 \text{ s}` y almacena los resultados en una lista de Python. b) Calcula las distancias recorridas en cada intervalo de 0.5s (no acumulativas) y almacena los resultados en una lista de Python. c) Identifica en qué instantes la velocidad supera el 90% de la velocidad terminal y almacena estos instantes en una lista de Python. Ejercicio 12: Radiación de Cuerpo Negro ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ La ley de Wien establece que la longitud de onda de máxima emisión para un cuerpo negro es: .. math:: \lambda_{max} = \frac{b}{T} donde :math:`b = 2.898 \times 10^{-3} \text{ m}\cdot\text{K}` es la constante de Wien y T es la temperatura absoluta en Kelvin. a) Para un rango de temperaturas desde 1000 K hasta 10000 K en incrementos de 1000 K, calcula las longitudes de onda de máxima emisión (en nanómetros) y almacena los resultados en una lista de Python. b) Clasifica cada longitud de onda según la región del espectro electromagnético y almacena los resultados en una lista de Python con los siguientes valores: - "Infrarrojo" para > 700 nm - "Visible" para 400-700 nm - "Ultravioleta" para < 400 nm c) Determina qué temperaturas producen su máxima emisión en el espectro visible (400-700 nm) y almacena estos valores en una lista de Python. Ejercicio 13: Campo Magnético de un Solenoide ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ El campo magnético en el interior de un solenoide es: .. math:: B = \mu_0 \frac{N}{L} I donde :math:`\mu_0 = 4\pi \times 10^{-7} \text{ T}\cdot\text{m}/\text{A}` es la permeabilidad del vacío, N es el número total de vueltas, L es la longitud del solenoide en metros, e I es la corriente en amperios. Para un solenoide de 20 cm de longitud: a) Calcula el campo magnético (en teslas) para: - Corrientes de 1 a 5 A (en incrementos de 1 A) - Número total de vueltas: 100, 200, 300, 400 y 500 Almacena los resultados como una lista de Python de pares (corriente, vueltas, campo). b) Calcula los valores de corriente necesarios para producir un campo de 0.1 T para cada número de vueltas y almacena los resultados en una lista de Python. c) Identifica las combinaciones de corriente y número de vueltas que producen un campo entre 0.05 T y 0.1 T y almacena estas combinaciones en una lista de Python. Ejercicio 14: Análisis de Circuito RC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ En un circuito RC, la carga en el capacitor durante el proceso de carga viene dada por: .. math:: Q(t) = Q_0 (1 - e^{-t/RC}) donde :math:`Q_0` es la carga máxima, R es la resistencia y C es la capacitancia. a) Para un circuito con R = 1000 Ω, C = 1 μF y :math:`Q_0 = 10 \text{ μC}`, calcula la carga para tiempos de 0 a 10 ms en intervalos de 0.5 ms y almacena los resultados en una lista de Python. b) Calcula la corriente en cada instante usando: .. math:: I(t) = \frac{Q_0}{RC}e^{-t/RC} y almacena los resultados en una lista de Python. c) Identifica los tiempos en que la carga alcanza el 63.2%, 86.5% y 95% de la carga máxima (estos porcentajes corresponden a 1τ, 2τ y 3τ respectivamente, donde τ = RC) y almacena estos tiempos en una lista de Python. Ejercicio 15: Péndulo Simple ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Para un péndulo simple de longitud L, el período de oscilación para pequeñas amplitudes es: .. math:: T_{aprox} = 2\pi \sqrt{\frac{L}{g}} Para amplitudes mayores, una aproximación más precisa del período es: .. math:: T_{real} = 2\pi \sqrt{\frac{L}{g}} \left(1 + \frac{1}{16}\theta_0^2 + \frac{11}{3072}\theta_0^4 + \ldots\right) donde :math:`\theta_0` es la amplitud angular en radianes y g = 9.81 m/s². a) Para un péndulo de 1 metro, calcula los períodos usando ambas fórmulas para amplitudes de 5°, 10°, 15°, ..., 90° (convierte a radianes para los cálculos) y almacena ambos conjuntos de resultados en listas de Python separadas. b) Calcula los errores porcentuales cometidos al usar la fórmula para pequeñas amplitudes y almacena los resultados en una lista de Python. c) Identifica las amplitudes para las cuales el error porcentual supera el 1% y almacena estos valores en una lista de Python.