Vibraciones mecánicas en Python
Articulo2 de junio de 2025
Introducción
La vibración de un objeto es causada por una fuerza de excitación. Esta fuerza se puede aplicar externamente al objeto o puede tener su origen dentro del objeto. Por eso, un análisis de vibración puede determinar las fuerzas de excitación que actúan en una máquina. Estas fuerzas dependen del estado de la máquina, y el conocimiento de sus características e interacciones permite diagnosticar un problema en la máquina [1].
Actualmente, en los diseños de todo tipo de máquinas rotativas se tienen en cuenta las técnicas de separación y reducción de las vibraciones. En consecuencia, ha aumentado la necesidad de medir y analizar con precisión las vibraciones mecánicas. El proceso de medición y análisis se lleva a cabo cómodamente con la ayuda de la electrónica moderna, utilizando acelerómetros que convierten el movimiento vibratorio en una señal eléctrica [2].
Para determinar los niveles de riesgo y el impacto de las vibraciones mecánicas en las máquinas, la ISO ha definido un estándar que clasifica las máquinas en grupos y que define rangos permisibles de vibración para el diagnóstico de la salud de la maquinaria. La mayoría de la maquinaria rotativa está cobijada en la clasificación general para maquinaria crítica: ISO 10816-3.
El desarrollo de software para análisis de señales es, entonces, una herramienta fundamental para el análisis de vibraciones. Lenguajes de programación de uso libre, como Python, poseen librerías especializadas para la modelación y análisis de estas señales producidas por vibraciones mecánicas, y se convierten en un complemento fundamental cuando solo se dispone de la medición de la vibración y no de las demás etapas del análisis.
Este artículo pretende enfocarse en el uso de una librería de Python llamada “vibration_toolbox”, pero se deja claro al lector que esta herramienta no es la única que ofrece el lenguaje Python para el estudio, análisis y simulación de señales vibratorias, y que no reemplaza un servicio especializado de análisis de vibraciones mecánicas para los activos.
Parámetros de medición y unidades
Desplazamiento: Es la distancia entre la posición de la partícula que vibra y su posición de reposo. Sus unidades son: unidades de longitud (L); in, mm, ft, m, dB.
Velocidad: Es la tasa de cambio de la posición de la partícula que vibra con respecto al tiempo. Sus unidades son: (L/T); in/s, mm/s, ft/s, m/s, dB.
Aceleración: Es la tasa de cambio de la velocidad con respecto al tiempo. Sus unidades son: (L/T²); in/s², mm/s², ft/s², m/s², dB.
Frecuencia: Es el número de veces que se produce un ciclo de movimiento completo durante un periodo de un segundo, y se mide en hercios (Hz). En la práctica, las señales de vibración suelen estar formadas por muchas frecuencias que se producen simultáneamente. Por tanto, solo con observar un patrón de amplitud con respecto al tiempo no podemos saber de forma inmediata cuántos componentes vibran y con qué frecuencias [2].
Para distinguir los distintos componentes, es preciso representar la amplitud de vibración con respecto a la frecuencia. Un análisis en frecuencia es la descomposición de las señales de vibración en componentes de frecuencia individuales. Esta técnica puede considerarse la piedra angular de las medidas de vibración que se realizan con fines de diagnóstico. El gráfico que muestra los niveles de vibración en función de la frecuencia se denomina espectrograma de frecuencia [2].
![Ilustración 1. Transformación de varias señales de vibración del dominio del tiempo al dominio de la frecuencia. Fuente [2].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489600899-1749489600899.png%3Falt%3Dmedia%26token%3D119aa3e2-94ca-4837-a846-b4ced0c15fa6&w=828&q=75)
La amplitud de la vibración, que es la característica que describe su magnitud, puede cuantificarse de varias maneras. El diagrama de más abajo muestra la relación entre el nivel de pico a pico, el nivel pico, el nivel medio y el nivel RMS de una onda sinusoidal.
El valor de pico a pico es particularmente valioso porque indica la amplitud máxima de la onda. Resulta útil, por ejemplo, cuando el desplazamiento vibratorio de un componente de una máquina es un factor crítico a efectos de la tensión máxima que admite o a la hora de dimensionar holguras mecánicas.
El valor pico resulta muy útil para indicar el nivel de los impactos de corta duración. No obstante, como se puede apreciar en el diagrama, los valores pico solo indican cuál es el nivel máximo, sin tener en cuenta el histórico temporal de la onda.
En cambio, el valor medio rectificado sí tiene en cuenta ese histórico temporal, aunque su interés práctico es limitado, porque no guarda una relación directa con ninguna magnitud física útil.
El valor cuadrático medio o RMS es la medida de amplitud más relevante, porque tiene en cuenta el histórico temporal de la onda y, además, da un valor de amplitud que está relacionado directamente con el contenido de energía y, por tanto, con la capacidad destructiva de la vibración [2].
![Ilustración 2. Descomposición de una señal sinusoidal de vibración. Fuente [2]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489602026-1749489602026.png%3Falt%3Dmedia%26token%3Daa651908-971a-4c6a-b492-7bd61446c8e2&w=828&q=75)
Funciones estadísticas de Python aplicadas al modelamiento de vibraciones mecánicas
Root Mean Square (RMS):
La raíz media cuadrada, o RMS, es una forma de medir la intensidad de una vibración mecánica a través de su energía promedio dentro de una ventana de tiempo determinada [3].
Fórmula:
RMS = √(1/n × Σ(xᵢ)²)
En Python, podemos calcular el RMS de la siguiente manera [3]:
import numpy as np # Importamos módulo de cálculos numéricos, vectoriales y matriciales
import matplotlib.pyplot as plt # Importamos el módulo para graficar
np.random.seed(0)
signal = 0.5 * np.random.randn(1000) # Desviación estándar de 0.5
rms = np.sqrt(np.mean(signal**2))
plt.plot(signal, c="indigo")
plt.axhline(y=rms, color='red', linestyle='--', label=f"RMS: {rms:.2f}")
plt.title(f"Signal with RMS: {rms:.2f}")
plt.xlabel("Sample")
plt.ylabel("Amplitude")
plt.legend()
plt.show()
![Ilustración 3. Gráfico de una señal de vibración con un RMS de 0.49. Fuente: [3]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489603116-1749489603117.png%3Falt%3Dmedia%26token%3D8268c290-ca6a-43e3-befa-996334c25889&w=1200&q=75)
Si agregamos a la señal cualquier excitación, veremos en el valor RMS su energía adicional [3]:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
# Ruido blanco con desviación estándar de 0.5
noise = 0.5 * np.random.randn(1000)
# Crear un pulso de 20 muestras con offset DC
spike = np.zeros(1000)
spike[500:520] = 5 # Agrega un offset de 5 durante 20 puntos
# Señal combinada
signal = noise + spike
# Cálculo del valor RMS
rms = np.sqrt(np.mean(signal**2))
# Gráfico de la señal y línea RMS
plt.plot(signal, c="indigo")
plt.axhline(y=rms, color='red', linestyle='--', label=f"RMS: {rms:.2f}")
plt.title(f"Signal with RMS: {rms:.2f}")
plt.xlabel("Sample")
plt.ylabel("Amplitude")
plt.legend()
plt.show()
![Ilustración 4. Gráfico de una señal de vibración con un RMS afectado por una excitación. Fuente: [3]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489604268-1749489604268.png%3Falt%3Dmedia%26token%3D4c02c162-5349-4915-9735-a4129479964c&w=1200&q=75)
Amplitud máxima:
Es simplemente el valor máximo de la magnitud de la vibración dentro de la ventana gráfica. Para determinarla, debemos hacer uso del factor de cresta, definido como:
Cf = max|xᵢ| / RMS(x)
Código en Python para calcular la amplitud máxima y el factor de cresta de una señal [3]:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
# Generación de ruido con desviación estándar de 0.5
noise = 0.5 * np.random.randn(1000)
# Evento transitorio de alta amplitud
spike = np.zeros(1000)
spike[500:520] = 5
# Señal combinada
signal = noise + spike
# Amplitud máxima (valor absoluto)
peak_amplitude = np.max(np.abs(signal))
# Valor RMS
rms = np.sqrt(np.mean(signal**2))
# Factor de cresta
crest_factor = peak_amplitude / rms
# Gráfico
plt.plot(signal, c="indigo")
plt.axhline(y=peak_amplitude, color='r', linestyle='--', label=f"Peak Amplitude: {peak_amplitude:.2f}")
plt.title(f"Signal with Peak Amplitude Highlighted\nCrest Factor: {crest_factor:.2f}")
plt.xlabel("Sample")
plt.ylabel("Amplitude")
plt.legend()
plt.show()
![Ilustración 8. Gráfico de señal con un pico de amplitud agrandada. Fuente: [3]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489605141-1749489605141.png%3Falt%3Dmedia%26token%3D8ba9698b-7eea-4e56-b54e-9c16113c8d36&w=1200&q=75)
El factor de cresta para varias señales se puede calcular de la siguiente manera [3]:
Import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
# Señal sinusoidal con bajo factor de cresta
low_crest_signal = np.sin(2 * np.pi * 5 * np.linspace(0, 1, 1000))
# Copia con un pico agregado para simular un alto factor de cresta
high_crest_signal = low_crest_signal.copy()
high_crest_signal[500] += 5 # Agrega un pico aislado
# Cálculo de los factores de cresta
low_crest_factor = np.max(np.abs(low_crest_signal)) / np.sqrt(np.mean(low_crest_signal**2))
high_crest_factor = np.max(np.abs(high_crest_signal)) / np.sqrt(np.mean(high_crest_signal**2))
# Gráficos comparativos
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(low_crest_signal, c="indigo")
plt.title(f"Low Crest Factor: {low_crest_factor:.2f}")
plt.subplot(1, 2, 2)
plt.plot(high_crest_signal, c="indigo")
plt.title(f"High Crest Factor: {high_crest_factor:.2f}")
plt.show()
![Ilustración 6. Gráfico que compara dos señales de vibraciones con factores de cresta diferentes. Fuente: [3]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489606212-1749489606212.png%3Falt%3Dmedia%26token%3D31a51837-67ec-49e9-ba41-117aa5ac16fa&w=1920&q=75)
Cursos recomendados


%252FImagen%252FRAMPREDYC-1730060420837.webp%3Falt%3Dmedia%26token%3D2634a7f0-988e-4022-b91f-382503e6e9db&w=3840&q=75)





Vibration Toolbox en Python
Antes de adentrarnos en esta librería, conviene revisar un concepto más:
El número de grados de libertad de un sistema vibratorio se puede definir como el número de coordenadas independientes necesarias para especificar su configuración en cualquier instante [4].
Instalación del paquete vibration_toolbox
Para este artículo se hizo uso de la plataforma Google Colaboratory, y en esta basta con ejecutar la siguiente instrucción para instalar la librería: !pip install vibration_toolbox
Importación de los módulos necesarios
import numpy as np
import vibration_toolbox as vtb
%matplotlib inline
Simulación de una señal de vibración de un grado de libertad en Python [4]
Con una simple instrucción, podemos obtener una representación gráfica de una señal vibratoria correspondiente a un sistema de un grado de libertad:
# Grado uno de libertad
vtb.time_plot()
![Ilustración 7. Representación gráfica en Python del desplazamiento de una señal vibratoria de 1 grado de libertad en el dominio del tiempo. Fuente: [4].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489606931-1749489606931.png%3Falt%3Dmedia%26token%3Df43ac4bc-4448-4f47-812f-85f1879f76f8&w=1080&q=75)
En el gráfico anterior podemos observar cómo una señal con magnitud inicial de 1.0 (0-pico) se va disipando en el tiempo hasta alcanzar una magnitud de cero.
Aplicando la siguiente instrucción:
vtb.phase_plot()
se obtiene el siguiente gráfico de fase, el cual representa el comportamiento del sistema en el espacio de estados (posición vs. velocidad), mostrando cómo la oscilación converge al equilibrio.
![Ilustración 8. Representación gráfica de velocidad vs desplazamiento de una señal de vibración en Python. Fuente: [4].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489607946-1749489607946.png%3Falt%3Dmedia%26token%3Da9342ce9-55f0-470d-93bd-079245e4c25f&w=828&q=75)
r, A = vtb.steady_state_response(zs=[0.1, 0.3, 0.8], rmin=0, rmax=2)
![Ilustración 9. Representación gráfica de amplitud normal y Fase vs frecuencia de radio en Python. Como respuesta al estado estable. Fuente: [4].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489608843-1749489608844.png%3Falt%3Dmedia%26token%3D815c7ec7-4ec9-435d-b91f-c72249497d83&w=1080&q=75)
Ahora miremos cómo se representan diferentes tipos de respuestas a señales de vibración.
display(vtb.sdof_interact())
![Ilustración 10. Gráfico de diferentes respuestas a señales de vibración. Fuente: [4].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489609837-1749489609837.png%3Falt%3Dmedia%26token%3D6c94f2b7-596b-4ee9-b950-4b8c79a9e251&w=1200&q=75)
En la imagen superior izquierda tenemos el gráfico a una respuesta tipo impulso, en el eje vertical la posición x(t) y en el eje horizontal el tiempo (t). Podemos observar como la magnitud de la señal se va disipando a medida que el tiempo aumenta, es decir x(t) tiende a cero cuando t tiende a infinito. En la imagen superior derecha tenemos el gráfico de una respuesta a una señal tipo escalón.
En la parte inferior izquierda tenemos dos respuestas una en magnitud y otra en fase. Y en la parte inferior derecha tenemos un gráfico de una respuesta en el plano real o imaginario.
Conclusiones:
- Las señales producidas por las vibraciones mecánicas de la maquinaria rotativa son un insumo muy importante para determinar el nivel de degradación actual de muchos de los componentes críticos de las máquinas rotativas.
- Si cuentas con data de medidores de vibraciones instalados en tu planta y no cuentas con un software de interpretación y análisis, Python te permite tener el primer acercamiento ala caracterización y modelamiento de esos datos de vibración.
- Python por sí solo no reemplaza los servicios especializados de analistas de vibraciones, pero si puede ayudar a comprender el fenómeno físico de la vibración.
- El análisis de vibraciones mecánicas es necesario pero no suficiente para implementar un plan de mantenimiento basado en condición (CbM) o mantenimiento predictivo (PdM).
Cibergrafìa
- Predictiva21 – Artículo sobre vibraciones
- Bruel & Kjaer – Guía completa para la medición de vibraciones
- Reduct.store – Análisis de datos de vibración utilizando Python
- Librería vibration_toolbox en Python – Documentación oficial
Dinos qué te ha parecido el artículo
Artículos recomendados
Vibraciones mecánicas en Python

Vibración, Amplitud, Desplazamiento y Velocidad

10 Modos de Falla en Lubricación que pueden ser detectados por Pruebas de Campo

Modos de falla: efectos y causas

Publica tu artículo en la revista #1 de Mantenimiento Industrial
Publicar un artículo en la revista es gratis, no tiene costo.
Solo debes asegurarte que no sea un artículo comercial.
¿Qué esperas?
O envía tu artículo directo: articulos@predictiva21.com

Vibraciones mecánicas en Python
Articulo 2 de junio de 2025Introducción
La vibración de un objeto es causada por una fuerza de excitación. Esta fuerza se puede aplicar externamente al objeto o puede tener su origen dentro del objeto. Por eso, un análisis de vibración puede determinar las fuerzas de excitación que actúan en una máquina. Estas fuerzas dependen del estado de la máquina, y el conocimiento de sus características e interacciones permite diagnosticar un problema en la máquina [1].
Actualmente, en los diseños de todo tipo de máquinas rotativas se tienen en cuenta las técnicas de separación y reducción de las vibraciones. En consecuencia, ha aumentado la necesidad de medir y analizar con precisión las vibraciones mecánicas. El proceso de medición y análisis se lleva a cabo cómodamente con la ayuda de la electrónica moderna, utilizando acelerómetros que convierten el movimiento vibratorio en una señal eléctrica [2].
Para determinar los niveles de riesgo y el impacto de las vibraciones mecánicas en las máquinas, la ISO ha definido un estándar que clasifica las máquinas en grupos y que define rangos permisibles de vibración para el diagnóstico de la salud de la maquinaria. La mayoría de la maquinaria rotativa está cobijada en la clasificación general para maquinaria crítica: ISO 10816-3.
El desarrollo de software para análisis de señales es, entonces, una herramienta fundamental para el análisis de vibraciones. Lenguajes de programación de uso libre, como Python, poseen librerías especializadas para la modelación y análisis de estas señales producidas por vibraciones mecánicas, y se convierten en un complemento fundamental cuando solo se dispone de la medición de la vibración y no de las demás etapas del análisis.
Este artículo pretende enfocarse en el uso de una librería de Python llamada “vibration_toolbox”, pero se deja claro al lector que esta herramienta no es la única que ofrece el lenguaje Python para el estudio, análisis y simulación de señales vibratorias, y que no reemplaza un servicio especializado de análisis de vibraciones mecánicas para los activos.
Parámetros de medición y unidades
Desplazamiento: Es la distancia entre la posición de la partícula que vibra y su posición de reposo. Sus unidades son: unidades de longitud (L); in, mm, ft, m, dB.
Velocidad: Es la tasa de cambio de la posición de la partícula que vibra con respecto al tiempo. Sus unidades son: (L/T); in/s, mm/s, ft/s, m/s, dB.
Aceleración: Es la tasa de cambio de la velocidad con respecto al tiempo. Sus unidades son: (L/T²); in/s², mm/s², ft/s², m/s², dB.
Frecuencia: Es el número de veces que se produce un ciclo de movimiento completo durante un periodo de un segundo, y se mide en hercios (Hz). En la práctica, las señales de vibración suelen estar formadas por muchas frecuencias que se producen simultáneamente. Por tanto, solo con observar un patrón de amplitud con respecto al tiempo no podemos saber de forma inmediata cuántos componentes vibran y con qué frecuencias [2].
Para distinguir los distintos componentes, es preciso representar la amplitud de vibración con respecto a la frecuencia. Un análisis en frecuencia es la descomposición de las señales de vibración en componentes de frecuencia individuales. Esta técnica puede considerarse la piedra angular de las medidas de vibración que se realizan con fines de diagnóstico. El gráfico que muestra los niveles de vibración en función de la frecuencia se denomina espectrograma de frecuencia [2].
![Ilustración 1. Transformación de varias señales de vibración del dominio del tiempo al dominio de la frecuencia. Fuente [2].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489600899-1749489600899.png%3Falt%3Dmedia%26token%3D119aa3e2-94ca-4837-a846-b4ced0c15fa6&w=828&q=75)
La amplitud de la vibración, que es la característica que describe su magnitud, puede cuantificarse de varias maneras. El diagrama de más abajo muestra la relación entre el nivel de pico a pico, el nivel pico, el nivel medio y el nivel RMS de una onda sinusoidal.
El valor de pico a pico es particularmente valioso porque indica la amplitud máxima de la onda. Resulta útil, por ejemplo, cuando el desplazamiento vibratorio de un componente de una máquina es un factor crítico a efectos de la tensión máxima que admite o a la hora de dimensionar holguras mecánicas.
El valor pico resulta muy útil para indicar el nivel de los impactos de corta duración. No obstante, como se puede apreciar en el diagrama, los valores pico solo indican cuál es el nivel máximo, sin tener en cuenta el histórico temporal de la onda.
En cambio, el valor medio rectificado sí tiene en cuenta ese histórico temporal, aunque su interés práctico es limitado, porque no guarda una relación directa con ninguna magnitud física útil.
El valor cuadrático medio o RMS es la medida de amplitud más relevante, porque tiene en cuenta el histórico temporal de la onda y, además, da un valor de amplitud que está relacionado directamente con el contenido de energía y, por tanto, con la capacidad destructiva de la vibración [2].
![Ilustración 2. Descomposición de una señal sinusoidal de vibración. Fuente [2]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489602026-1749489602026.png%3Falt%3Dmedia%26token%3Daa651908-971a-4c6a-b492-7bd61446c8e2&w=828&q=75)
Funciones estadísticas de Python aplicadas al modelamiento de vibraciones mecánicas
Root Mean Square (RMS):
La raíz media cuadrada, o RMS, es una forma de medir la intensidad de una vibración mecánica a través de su energía promedio dentro de una ventana de tiempo determinada [3].
Fórmula:
RMS = √(1/n × Σ(xᵢ)²)
En Python, podemos calcular el RMS de la siguiente manera [3]:
import numpy as np # Importamos módulo de cálculos numéricos, vectoriales y matriciales
import matplotlib.pyplot as plt # Importamos el módulo para graficar
np.random.seed(0)
signal = 0.5 * np.random.randn(1000) # Desviación estándar de 0.5
rms = np.sqrt(np.mean(signal**2))
plt.plot(signal, c="indigo")
plt.axhline(y=rms, color='red', linestyle='--', label=f"RMS: {rms:.2f}")
plt.title(f"Signal with RMS: {rms:.2f}")
plt.xlabel("Sample")
plt.ylabel("Amplitude")
plt.legend()
plt.show()
![Ilustración 3. Gráfico de una señal de vibración con un RMS de 0.49. Fuente: [3]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489603116-1749489603117.png%3Falt%3Dmedia%26token%3D8268c290-ca6a-43e3-befa-996334c25889&w=1200&q=75)
Si agregamos a la señal cualquier excitación, veremos en el valor RMS su energía adicional [3]:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
# Ruido blanco con desviación estándar de 0.5
noise = 0.5 * np.random.randn(1000)
# Crear un pulso de 20 muestras con offset DC
spike = np.zeros(1000)
spike[500:520] = 5 # Agrega un offset de 5 durante 20 puntos
# Señal combinada
signal = noise + spike
# Cálculo del valor RMS
rms = np.sqrt(np.mean(signal**2))
# Gráfico de la señal y línea RMS
plt.plot(signal, c="indigo")
plt.axhline(y=rms, color='red', linestyle='--', label=f"RMS: {rms:.2f}")
plt.title(f"Signal with RMS: {rms:.2f}")
plt.xlabel("Sample")
plt.ylabel("Amplitude")
plt.legend()
plt.show()
![Ilustración 4. Gráfico de una señal de vibración con un RMS afectado por una excitación. Fuente: [3]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489604268-1749489604268.png%3Falt%3Dmedia%26token%3D4c02c162-5349-4915-9735-a4129479964c&w=1200&q=75)
Amplitud máxima:
Es simplemente el valor máximo de la magnitud de la vibración dentro de la ventana gráfica. Para determinarla, debemos hacer uso del factor de cresta, definido como:
Cf = max|xᵢ| / RMS(x)
Código en Python para calcular la amplitud máxima y el factor de cresta de una señal [3]:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
# Generación de ruido con desviación estándar de 0.5
noise = 0.5 * np.random.randn(1000)
# Evento transitorio de alta amplitud
spike = np.zeros(1000)
spike[500:520] = 5
# Señal combinada
signal = noise + spike
# Amplitud máxima (valor absoluto)
peak_amplitude = np.max(np.abs(signal))
# Valor RMS
rms = np.sqrt(np.mean(signal**2))
# Factor de cresta
crest_factor = peak_amplitude / rms
# Gráfico
plt.plot(signal, c="indigo")
plt.axhline(y=peak_amplitude, color='r', linestyle='--', label=f"Peak Amplitude: {peak_amplitude:.2f}")
plt.title(f"Signal with Peak Amplitude Highlighted\nCrest Factor: {crest_factor:.2f}")
plt.xlabel("Sample")
plt.ylabel("Amplitude")
plt.legend()
plt.show()
![Ilustración 8. Gráfico de señal con un pico de amplitud agrandada. Fuente: [3]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489605141-1749489605141.png%3Falt%3Dmedia%26token%3D8ba9698b-7eea-4e56-b54e-9c16113c8d36&w=1200&q=75)
El factor de cresta para varias señales se puede calcular de la siguiente manera [3]:
Import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
# Señal sinusoidal con bajo factor de cresta
low_crest_signal = np.sin(2 * np.pi * 5 * np.linspace(0, 1, 1000))
# Copia con un pico agregado para simular un alto factor de cresta
high_crest_signal = low_crest_signal.copy()
high_crest_signal[500] += 5 # Agrega un pico aislado
# Cálculo de los factores de cresta
low_crest_factor = np.max(np.abs(low_crest_signal)) / np.sqrt(np.mean(low_crest_signal**2))
high_crest_factor = np.max(np.abs(high_crest_signal)) / np.sqrt(np.mean(high_crest_signal**2))
# Gráficos comparativos
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(low_crest_signal, c="indigo")
plt.title(f"Low Crest Factor: {low_crest_factor:.2f}")
plt.subplot(1, 2, 2)
plt.plot(high_crest_signal, c="indigo")
plt.title(f"High Crest Factor: {high_crest_factor:.2f}")
plt.show()
![Ilustración 6. Gráfico que compara dos señales de vibraciones con factores de cresta diferentes. Fuente: [3]](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489606212-1749489606212.png%3Falt%3Dmedia%26token%3D31a51837-67ec-49e9-ba41-117aa5ac16fa&w=1920&q=75)
Cursos recomendados


%252FImagen%252FRAMPREDYC-1730060420837.webp%3Falt%3Dmedia%26token%3D2634a7f0-988e-4022-b91f-382503e6e9db&w=3840&q=75)





Vibration Toolbox en Python
Antes de adentrarnos en esta librería, conviene revisar un concepto más:
El número de grados de libertad de un sistema vibratorio se puede definir como el número de coordenadas independientes necesarias para especificar su configuración en cualquier instante [4].
Instalación del paquete vibration_toolbox
Para este artículo se hizo uso de la plataforma Google Colaboratory, y en esta basta con ejecutar la siguiente instrucción para instalar la librería: !pip install vibration_toolbox
Importación de los módulos necesarios
import numpy as np
import vibration_toolbox as vtb
%matplotlib inline
Simulación de una señal de vibración de un grado de libertad en Python [4]
Con una simple instrucción, podemos obtener una representación gráfica de una señal vibratoria correspondiente a un sistema de un grado de libertad:
# Grado uno de libertad
vtb.time_plot()
![Ilustración 7. Representación gráfica en Python del desplazamiento de una señal vibratoria de 1 grado de libertad en el dominio del tiempo. Fuente: [4].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489606931-1749489606931.png%3Falt%3Dmedia%26token%3Df43ac4bc-4448-4f47-812f-85f1879f76f8&w=1080&q=75)
En el gráfico anterior podemos observar cómo una señal con magnitud inicial de 1.0 (0-pico) se va disipando en el tiempo hasta alcanzar una magnitud de cero.
Aplicando la siguiente instrucción:
vtb.phase_plot()
se obtiene el siguiente gráfico de fase, el cual representa el comportamiento del sistema en el espacio de estados (posición vs. velocidad), mostrando cómo la oscilación converge al equilibrio.
![Ilustración 8. Representación gráfica de velocidad vs desplazamiento de una señal de vibración en Python. Fuente: [4].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489607946-1749489607946.png%3Falt%3Dmedia%26token%3Da9342ce9-55f0-470d-93bd-079245e4c25f&w=828&q=75)
r, A = vtb.steady_state_response(zs=[0.1, 0.3, 0.8], rmin=0, rmax=2)
![Ilustración 9. Representación gráfica de amplitud normal y Fase vs frecuencia de radio en Python. Como respuesta al estado estable. Fuente: [4].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489608843-1749489608844.png%3Falt%3Dmedia%26token%3D815c7ec7-4ec9-435d-b91f-c72249497d83&w=1080&q=75)
Ahora miremos cómo se representan diferentes tipos de respuestas a señales de vibración.
display(vtb.sdof_interact())
![Ilustración 10. Gráfico de diferentes respuestas a señales de vibración. Fuente: [4].](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fpredyc2023.appspot.com%2Fo%2FArticulos%252FVibraciones%2520mec%25C3%25A1nicas%2520en%2520Python%252Fimage-1749489609837-1749489609837.png%3Falt%3Dmedia%26token%3D6c94f2b7-596b-4ee9-b950-4b8c79a9e251&w=1200&q=75)
En la imagen superior izquierda tenemos el gráfico a una respuesta tipo impulso, en el eje vertical la posición x(t) y en el eje horizontal el tiempo (t). Podemos observar como la magnitud de la señal se va disipando a medida que el tiempo aumenta, es decir x(t) tiende a cero cuando t tiende a infinito. En la imagen superior derecha tenemos el gráfico de una respuesta a una señal tipo escalón.
En la parte inferior izquierda tenemos dos respuestas una en magnitud y otra en fase. Y en la parte inferior derecha tenemos un gráfico de una respuesta en el plano real o imaginario.
Conclusiones:
- Las señales producidas por las vibraciones mecánicas de la maquinaria rotativa son un insumo muy importante para determinar el nivel de degradación actual de muchos de los componentes críticos de las máquinas rotativas.
- Si cuentas con data de medidores de vibraciones instalados en tu planta y no cuentas con un software de interpretación y análisis, Python te permite tener el primer acercamiento ala caracterización y modelamiento de esos datos de vibración.
- Python por sí solo no reemplaza los servicios especializados de analistas de vibraciones, pero si puede ayudar a comprender el fenómeno físico de la vibración.
- El análisis de vibraciones mecánicas es necesario pero no suficiente para implementar un plan de mantenimiento basado en condición (CbM) o mantenimiento predictivo (PdM).
Cibergrafìa
- Predictiva21 – Artículo sobre vibraciones
- Bruel & Kjaer – Guía completa para la medición de vibraciones
- Reduct.store – Análisis de datos de vibración utilizando Python
- Librería vibration_toolbox en Python – Documentación oficial
Dinos qué te ha parecido el artículo
Artículos recomendados
Vibraciones mecánicas en Python

Vibración, Amplitud, Desplazamiento y Velocidad

La importancia de los 5 por qué en el ACR

Entrevista a Annalisa Ferrari

Publica tu artículo en la revista #1 de Mantenimiento Industrial
Publicar un artículo en la revista es gratis, no tiene costo.
Solo debes asegurarte que no sea un artículo comercial.
¿Qué esperas?
O envía tu artículo directo: articulos@predictiva21.com
