Ejercicios: Funciones en Python¶
Introducción¶
Las funciones son bloques fundamentales de código reutilizable que permiten organizar programas complejos en componentes más pequeños y manejables. En el contexto de la física y otras ciencias, las funciones son especialmente útiles para modelar fenómenos, realizar cálculos repetitivos y analizar datos de manera eficiente.
Trabajaremos con funciones básicas, parámetros avanzados, documentación, type hints y manejo de errores, aplicando estos conceptos a problemas físicos relevantes.
Funciones Básicas¶
Ejercicio 1: Conversión de Unidades¶
Escribe una función llamada convertir_temperatura que convierta una temperatura de una escala a otra. La función debe aceptar tres parámetros: el valor de la temperatura, la unidad de origen y la unidad de destino.
Las unidades válidas son: “C” (Celsius), “F” (Fahrenheit) y “K” (Kelvin).
Incluye las siguientes conversiones:
Ejemplo de uso:
temp_celsius = convertir_temperatura(32, 'F', 'C')
print(temp_celsius) # Debería imprimir: 0.0
temp_kelvin = convertir_temperatura(100, 'C', 'K')
print(temp_kelvin) # Debería imprimir: 373.15
Ejercicio 2: Cálculo de la Energía Cinética¶
Escribe una función llamada energia_cinetica que calcule la energía cinética de un objeto dada su masa y velocidad:
La función debe retornar la energía cinética en joules.
Luego, escribe otra función llamada velocidad_desde_energia que calcule la velocidad de un objeto a partir de su masa y energía cinética:
Usa la primera función dentro de un programa que pida al usuario la masa y velocidad de varios objetos, y muestre su energía cinética.
Ejercicio 3: Distancia entre Dos Puntos¶
Escribe una función llamada distancia_euclidiana que calcule la distancia entre dos puntos en un espacio bidimensional:
La función debe aceptar cuatro parámetros: x1, y1, x2, y2.
Extiende tu solución escribiendo una función distancia_3d que calcule la distancia en un espacio tridimensional:
Ejercicio 4: Cálculo de Movimiento Armónico Simple¶
Escribe una función llamada posicion_mas que calcule la posición de una partícula en movimiento armónico simple en un tiempo específico:
La función debe aceptar los siguientes parámetros:
A: amplitud (metros)
omega: frecuencia angular (radianes/segundo)
phi: fase inicial (radianes)
t: tiempo (segundos)
Además, escribe dos funciones adicionales:
velocidad_mas: para calcular la velocidad instantáneaaceleracion_mas: para calcular la aceleración instantánea
Parámetros Avanzados¶
Ejercicio 5: Caída Libre con Resistencia del Aire¶
Escribe una función llamada caida_con_resistencia que calcule la posición y velocidad de un objeto en caída libre considerando la resistencia del aire.
Las ecuaciones diferenciales para este sistema son:
donde:
g es la aceleración de la gravedad
b es el coeficiente de resistencia del aire
m es la masa del objeto
v es la velocidad
x es la posición
Método de Euler para la Resolución Numérica
El método de Euler es una técnica numérica para resolver ecuaciones diferenciales ordinarias. Consiste en aproximar la solución usando pequeños pasos de tiempo (Δt), donde el valor de una variable en el siguiente paso se calcula a partir de su valor actual y su tasa de cambio.
Dada una ecuación diferencial de la forma dy/dt = f(t,y), el método de Euler aproxima la solución como:
Para nuestro problema de caída libre con resistencia, aplicamos el método de Euler a ambas ecuaciones:
Para actualizar la velocidad, usamos la aceleración instantánea:
Para actualizar la posición, usamos la velocidad actual:
Este proceso se repite para cada paso de tiempo hasta alcanzar el tiempo final de simulación.
La función debe aceptar los siguientes parámetros:
tiempo_final: tiempo total de simulación (segundos)
dt: paso de tiempo para la simulación (segundos)
altura_inicial: posición inicial (metros, valor por defecto: 0)
velocidad_inicial: velocidad inicial (metros/segundo, valor por defecto: 0)
masa: masa del objeto (kg, valor por defecto: 1)
coef_resistencia: coeficiente de resistencia del aire (kg/m, valor por defecto: 0.1)
g: aceleración de la gravedad (metros/segundo², valor por defecto: 9.8)
La función debe retornar dos listas: una con los valores de posición y otra con los valores de velocidad para cada paso de tiempo.
Ejercicio 6: Simulación de Trayectoria de Proyectil¶
Escribe una función llamada simular_proyectil que calcule la trayectoria de un proyectil considerando la resistencia del aire.
Las ecuaciones diferenciales para este sistema son:
donde:
\(v_x\) y \(v_y\) son las componentes de la velocidad
x e y son las coordenadas de posición
g es la aceleración de la gravedad
b es el coeficiente de resistencia del aire
m es la masa del proyectil
Para resolver numéricamente estas ecuaciones, aplicaremos el método de Euler.
Para actualizar las componentes de la velocidad:
Para actualizar las posiciones:
Este proceso se repite en cada paso de tiempo hasta que el proyectil toque el suelo (y ≤ 0).
La función debe aceptar los siguientes parámetros:
velocidad_inicial: velocidad inicial (metros/segundo)
angulo: ángulo de lanzamiento (grados)
altura_inicial: altura inicial (metros, valor por defecto: 0)
masa: masa del proyectil (kg, valor por defecto: 1)
coef_resistencia: coeficiente de resistencia del aire (kg/m, valor por defecto: 0)
g: aceleración de la gravedad (metros/segundo², valor por defecto: 9.8)
dt: paso de tiempo para la simulación (segundos, valor por defecto: 0.01)
La función debe retornar tres listas:
Lista de posiciones en x
Lista de posiciones en y
Lista de tiempos
La simulación debe detenerse cuando el proyectil toque el suelo (y ≤ 0).
Ejercicio 7: Calculadora de Estadísticas¶
Escribe una función llamada calcular_estadisticas que calcule varias estadísticas para una lista de números.
La función debe aceptar como parámetro una lista de números y un parámetro booleano opcional detallado (por defecto: False).
La función debe retornar:
Si
detalladoes False: una tupla con (media, mediana, desviación estándar)Si
detalladoes True: un diccionario con las siguientes estadísticas:“media”: media aritmética
“mediana”: valor mediano
“desviacion_estandar”: desviación estándar
“minimo”: valor mínimo
“maximo”: valor máximo
“rango”: diferencia entre máximo y mínimo
“suma”: suma de todos los valores
“cuenta”: cantidad de elementos
Implementa los cálculos manualmente, sin usar módulos como statistics.
Documentación y Anotaciones¶
Ejercicio 8: Campo Eléctrico de una Distribución de Cargas¶
Escribe una función llamada campo_electrico que calcule el campo eléctrico en un punto del espacio debido a una distribución de cargas puntuales.
La función debe seguir la ley de Coulomb:
donde:
\(\varepsilon_0\) es la permitividad del vacío (8.85 × 10⁻¹² F/m)
\(q_i\) es la carga de la i-ésima partícula
\(r_i\) es la distancia desde la carga hasta el punto de interés
\(\hat{r}_i\) es el vector unitario en la dirección desde la carga hasta el punto
La función debe incluir:
Docstring completo con descripción, parámetros y retorno
Type hints para todos los parámetros y valor de retorno
Parámetros:
cargas: lista de tuplas, donde cada tupla contiene (carga, posición_x, posición_y)
punto: tupla con las coordenadas (x, y) donde se calculará el campo
Retorno:
Una tupla con las componentes (Ex, Ey) del campo eléctrico resultante
Ejercicio 9: Simulación de Circuito RLC¶
Escribe una función llamada respuesta_rlc que simule la respuesta de un circuito RLC (Resistor-Inductor-Capacitor) a un voltaje de entrada.
Descripción física del sistema
Un circuito RLC está compuesto por una resistencia (R), un inductor (L) y un capacitor (C) conectados en serie o en paralelo. La ecuación diferencial que gobierna el sistema en serie es:
donde:
i es la corriente en el circuito
V(t) es el voltaje de entrada como función del tiempo
R es la resistencia en ohms
L es la inductancia en henrios
C es la capacitancia en faradios
Formulación matemática
Para facilitar la simulación numérica, reescribimos la ecuación como un sistema de ecuaciones diferenciales de primer orden, introduciendo q como la carga en el capacitor (donde i = dq/dt):
Método de Euler para la solución numérica
Para resolver este sistema, aplicaremos el método de Euler, que nos permite aproximar la solución mediante pasos discretos en el tiempo. Partiendo de las condiciones iniciales (i₀, q₀), en cada paso de tiempo calculamos:
Donde dt es el paso de tiempo para la simulación.
Voltajes en los componentes
En cada paso de tiempo, también calculamos los voltajes en cada componente:
Lo cual en la simulación se puede expresar como:
Algoritmo para la simulación
La simulación seguirá los siguientes pasos:
Inicializar todas las variables y arreglos para almacenar los resultados
Establecer las condiciones iniciales para t, i y q
Para cada paso de tiempo hasta alcanzar el tiempo final:
Guardar los valores actuales (t, i, q) en sus respectivos arreglos
Calcular los voltajes en cada componente (R, L, C)
Calcular las derivadas di/dt y dq/dt
Actualizar i y q usando el método de Euler
Avanzar al siguiente paso de tiempo
Construir y retornar un diccionario con todos los resultados
La función debe usar type hints y tener una docstring completa explicando su funcionamiento.
Parámetros:
R: resistencia (ohms)
L: inductancia (henrios)
C: capacitancia (faradios)
V_func: función que describe el voltaje de entrada en función del tiempo
tiempo_final: tiempo total de simulación (segundos)
dt: paso de tiempo para la simulación (segundos, valor por defecto: 0.001)
i_inicial: corriente inicial (amperios, valor por defecto: 0)
q_inicial: carga inicial en el capacitor (coulombs, valor por defecto: 0)
Retorno: - Un diccionario con las siguientes listas:
“tiempo”: lista de tiempos
“corriente”: lista de valores de corriente
“carga”: lista de valores de carga
“voltaje_r”: lista de voltajes en la resistencia
“voltaje_l”: lista de voltajes en el inductor
“voltaje_c”: lista de voltajes en el capacitor
Ejercicio 10: Cálculo de Energía Potencial¶
Escribe una función llamada energia_potencial que calcule la energía potencial de diferentes sistemas físicos.
La función debe incluir type hints completos y documentación exhaustiva.
Parámetros:
sistema: string que indica el tipo de sistema (“gravitacional”, “elastico”, “coulomb”)
parámetros: diccionario con los parámetros específicos de cada sistema
Parámetros específicos para cada sistema:
Sistema gravitacional: {“masa”: float, “altura”: float, “g”: float (opcional)}
Sistema elástico: {“k”: float, “x”: float}
Sistema coulombiano: {“q1”: float, “q2”: float, “r”: float}
Retorno:
La energía potencial calculada (joules)
Las ecuaciones para cada sistema son:
Manejo de Errores en Funciones¶
Ejercicio 11: Calculadora de Divisiones Segura¶
Escribe una función llamada division_segura que realice la división entre dos números, manejando adecuadamente posibles errores:
División por cero
Tipos de datos incorrectos
La función debe aceptar dos parámetros: numerador y denominador.
Si la división no puede realizarse, la función debe retornar un valor por defecto (por ejemplo, None) y mostrar un mensaje explicativo.
Ejercicio 12: Raíz Cuadrada con Validación¶
Escribe una función llamada raiz_cuadrada que calcule la raíz cuadrada de un número, validando que el parámetro de entrada sea adecuado:
El número debe ser no negativo
El parámetro debe ser numérico
La función debe usar try-except para manejar excepciones y validar cuidadosamente la entrada.
Ejercicio 13: Calculadora de la Ley de Ohm con Validación¶
Escribe una función calcular_ley_ohm que implemente la ley de Ohm:
La función debe aceptar tres parámetros: voltaje (V), corriente (I) y resistencia (R), pero sólo dos deben proporcionarse (el tercero debe ser None).
La función debe calcular el parámetro faltante basándose en los dos proporcionados, verificando:
Que exactamente un parámetro sea None
Que los valores proporcionados sean positivos
Que los valores proporcionados sean numéricos
Utiliza manejo de excepciones para validar las entradas y proporcionar mensajes de error claros.
Ejercicio 14: Calculadora de Fuerza con Manejo de Unidades¶
Escribe una función llamada calcular_fuerza que calcule la fuerza según la segunda ley de Newton:
La función debe aceptar los siguientes parámetros:
masa: la masa del objeto
aceleracion: la aceleración del objeto
unidad_masa: la unidad en que se proporciona la masa (“kg”, “g”, etc.)
unidad_aceleracion: la unidad de la aceleración (“m/s²”, “cm/s²”, etc.)
unidad_resultado: la unidad deseada para el resultado (“N”, “dyn”, etc.)
La función debe:
Validar que todas las unidades sean válidas y compatibles
Convertir las unidades correctamente
Manejar posibles errores con try-except
Retornar el resultado en la unidad solicitada
Ejercicio 15: Calculadora de Momento de Inercia¶
Escribe una función llamada momento_inercia que calcule el momento de inercia de diferentes formas geométricas.
La función debe aceptar los siguientes parámetros:
forma: string que indica la forma (“cilindro”, “esfera”, “anillo”, etc.)
parámetros: diccionario con los parámetros específicos de cada forma
La función debe verificar:
Que la forma especificada esté soportada
Que todos los parámetros necesarios se hayan proporcionado
Que los valores sean físicamente posibles (positivos, no nulos, etc.)
Utiliza try-except para manejar todos los posibles errores y proporcionar mensajes claros.
Las ecuaciones para algunos momentos de inercia son:
Funciones con Aplicaciones Avanzadas¶
Ejercicio 16: Análisis de Datos Experimentales¶
Escribe una función llamada analizar_experimento que procese los datos de un experimento físico y calcule resultados relevantes.
La función debe aceptar:
datos_x: lista de valores independientes (por ejemplo, tiempo)
datos_y: lista de valores dependientes (por ejemplo, posición)
tipo_analisis: string que indica el tipo de análisis (“ajuste_lineal”, “ajuste_cuadratico”, etc.)
parametros: diccionario con parámetros adicionales para el análisis
La función debe implementar:
Validación de que las listas de datos tienen la misma longitud
Manejo de diferentes tipos de análisis
Cálculo de estadísticas relevantes (incertidumbre, coeficiente de correlación, etc.)
Retorno de resultados en un formato estructurado (diccionario)
Ejercicio 17: Simulación de Lanzamiento de Dado¶
Implementa una función llamada simular_dados que simule el lanzamiento de dados y calcule estadísticas sobre los resultados.
La función debe aceptar:
num_dados: número de dados a lanzar en cada experimento
num_caras: número entero que indica cuántas caras tiene cada dado (valor por defecto: 6). Todos los dados tendrán el mismo número de caras.
num_lanzamientos: número de lanzamientos a simular (valor por defecto: 1000)
calcular_probabilidad: función opcional que evalúa si un lanzamiento cumple cierta condición
Sobre el parámetro calcular_probabilidad:
Es una función que tú defines y pasas como argumento
Esta función debe aceptar como parámetro una lista de enteros (resultados de un lanzamiento)
Debe retornar un valor booleano: True si el lanzamiento cumple cierta condición, False si no la cumple
La función
simular_dadosusará esta función para calcular la probabilidad empírica de la condición
Por ejemplo, si quieres calcular la probabilidad de obtener una suma mayor que 10 con dos dados, podrías definir:
def es_mayor_que_diez(resultados):
return sum(resultados) > 10
# La pasarías a tu función así:
resultado = simular_dados(2, 6, 1000, calcular_probabilidad=es_mayor_que_diez)
La función debe usar el módulo random para simular los lanzamientos y retornar:
Un diccionario con la distribución de frecuencia de las sumas obtenidas
Si se proporciona calcular_probabilidad, también incluir la probabilidad empírica del evento
La probabilidad empírica se calcula como:
Implementación:
Usa
random.randint(1, num_caras)para simular el lanzamiento de un dadoPara cada lanzamiento, genera num_dados resultados aleatorios
Lleva un registro de la frecuencia de cada suma posible
Si se proporciona una función calcular_probabilidad, aplícala a cada lanzamiento y cuenta cuántos retornan True
Incluye manejo de errores para validar que:
num_dados, num_caras y num_lanzamientos sean enteros positivos
calcular_probabilidad, si se proporciona, sea realmente una función
Ejemplo de retorno:
{
'distribucion': {
2: 28, # La suma 2 apareció 28 veces
3: 56, # La suma 3 apareció 56 veces
# ... otras sumas y sus frecuencias
12: 27 # La suma 12 apareció 27 veces
},
'probabilidad_evento': 0.167 # Solo si se proporcionó calcular_probabilidad
}
Esta simulación ilustra el concepto de la Ley de los Grandes Números: a medida que aumentas el número de lanzamientos, las frecuencias relativas observadas tienden a acercarse a las probabilidades teóricas.
Ejercicio 18: Calculadora de Órbitas¶
Implementa una función llamada calcular_orbita que determine los parámetros orbitales de un cuerpo celeste a partir de su posición y velocidad instantáneas.
La función debe aceptar:
posicion: tupla (x, y, z) con la posición del cuerpo (metros)
velocidad: tupla (vx, vy, vz) con la velocidad del cuerpo (metros/segundo)
masa_central: masa del cuerpo central (kilogramos, valor por defecto: masa solar)
G: constante de gravitación universal (valor por defecto: 6.67430 × 10⁻¹¹ m³ kg⁻¹ s⁻²)
Sugerencias para la solución:
Para calcular los parámetros orbitales, puedes utilizar directamente las ecuaciones de la mecánica orbital. Aunque estas ecuaciones parecen complejas, se pueden implementar paso a paso:
Vector de momento angular (h):
\[\vec{h} = \vec{r} \times \vec{v}\]donde \(\vec{r}\) es el vector de posición y \(\vec{v}\) es el vector de velocidad.
Excentricidad (e):
\[\vec{e} = \frac{\vec{v} \times \vec{h}}{\mu} - \frac{\vec{r}}{|\vec{r}|}\]donde \(\mu = GM\) es el parámetro gravitacional y la magnitud de \(\vec{e}\) da la excentricidad.
Semieje mayor (a):
\[a = \frac{h^2}{\mu(1-e^2)}\]Para órbitas parabólicas (e=1) o hiperbólicas (e>1), esta fórmula debe ajustarse.
Período orbital (T):
\[T = 2\pi\sqrt{\frac{a^3}{\mu}}\]Esta fórmula solo aplica para órbitas elípticas (e<1).
Energía mecánica total (E):
\[E = \frac{v^2}{2} - \frac{\mu}{|\vec{r}|} = -\frac{\mu}{2a}\]
Implementación recomendada:
Primero calcula el producto vectorial y las normas de los vectores implementando las funciones necesarias
Identifica qué tipo de órbita es (elíptica, parabólica o hiperbólica) basándote en la excentricidad
Para órbitas elípticas, calcula todos los parámetros; para otros tipos, calcula lo que tenga sentido físico
Asegúrate de manejar casos especiales (como e ≈ 0 para órbitas casi circulares)
La función debe calcular y retornar:
Semieje mayor de la órbita (metros)
Excentricidad (adimensional)
Período orbital (segundos, solo para órbitas elípticas)
Energía mecánica total (joules por kilogramo)
Tipo de órbita (“elíptica”, “parabólica”, “hiperbólica”)
Incluye validación de datos, documentación completa y type hints.
Ejemplo de uso:
# Para la Tierra orbitando alrededor del Sol
# Valores aproximados
posicion_tierra = (1.496e11, 0, 0) # 1 UA en metros
velocidad_tierra = (0, 29800, 0) # m/s
parametros = calcular_orbita(posicion_tierra, velocidad_tierra)
print(parametros)
# Debería dar aproximadamente:
# {'semieje_mayor': 1.496e11, 'excentricidad': cercano a 0,
# 'periodo_orbital': cercano a 365.25 días en segundos,
# 'energia': valor negativo, 'tipo_orbita': 'elíptica'}
Ejercicio 19: Resolución Numérica de Ecuaciones¶
Implementa una función llamada encontrar_cero que encuentre una raíz de una función utilizando diferentes métodos numéricos.
La función debe aceptar:
f: función cuya raíz se busca
metodo: string que indica el método a utilizar (“biseccion”, “newton”, “secante”)
x0: valor inicial para los métodos de Newton y secante; no usado en bisección
a, b: límites del intervalo para el método de bisección; no usados en Newton o secante
tolerancia: precisión deseada (valor por defecto: 1e-6)
max_iter: número máximo de iteraciones (valor por defecto: 100)
- h: incremento para la aproximación numérica de la derivada en Newton o
para generar el segundo punto en el método de la secante (valor por defecto: 1e-5)
Aclaraciones importantes sobre los métodos:
Método de bisección: Requiere un intervalo [a, b] donde f(a) y f(b) tengan signos opuestos.
\[c = \frac{a + b}{2}\]En cada iteración, se reemplaza a o b por c, manteniendo la condición de que f(a) y f(b) tengan signos opuestos.
Método de Newton: Requiere un valor inicial x0 y aproxima la derivada numéricamente:
\[f'(x) \approx \frac{f(x+h) - f(x)}{h}\]La iteración de Newton se define como:
\[x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}\]Método de la secante: Requiere un valor inicial x0, y utiliza x1 = x0 + h como segundo valor.
\[x_{n+1} = x_n - f(x_n) \frac{x_n - x_{n-1}}{f(x_n) - f(x_{n-1})}\]donde inicialmente x₀ = x0 y x₁ = x0 + h.
La función debe:
Validar los parámetros de entrada según el método elegido
Implementar los diferentes métodos numéricos
Manejar casos de no convergencia
Retornar la raíz encontrada y el número de iteraciones realizadas
Ejemplo de uso:
def f(x):
return x**2 - 2 # Buscamos la raíz de f(x) = x² - 2 (solución: √2)
# Método de bisección
raiz1, iter1 = encontrar_cero(f, metodo='biseccion', a=0, b=2)
# Método de Newton
raiz2, iter2 = encontrar_cero(f, metodo='newton', x0=1.0)
# Método de la secante
raiz3, iter3 = encontrar_cero(f, metodo='secante', x0=1.0) # x1 será 1.0 + 1e-5
print(f"Bisección: {raiz1} en {iter1} iteraciones")
print(f"Newton: {raiz2} en {iter2} iteraciones")
print(f"Secante: {raiz3} en {iter3} iteraciones")
Conclusión¶
Estos ejercicios te permiten practicar la creación y uso de funciones en Python aplicadas a problemas de física. Las funciones son componentes esenciales en la programación científica, ya que permiten modularizar el código, hacerlo más legible y reutilizable, y encapsular la lógica de cálculos complejos.
Al resolver estos problemas, estarás desarrollando habilidades cruciales para:
Diseñar funciones con interfaces claras y bien definidas
Documentar adecuadamente el código para facilitar su comprensión y uso
Implementar validación de parámetros y manejo de errores robusto
Aplicar conceptos físicos a través de implementaciones computacionales
Recuerda seguir las buenas prácticas:
Nombres de funciones descriptivos y en minúsculas con palabras separadas por guiones bajos
Docstrings claras que expliquen el propósito, parámetros y valores de retorno
Type hints para mejorar la legibilidad y facilitar la detección de errores
Manejo adecuado de casos especiales y validación de entradas
Código limpio y bien organizado
¡Buena suerte con los ejercicios!