logo

Vibraciones mecánicas en Python

 Articulo 2 de junio de 2025
Gaspar Ernesto Soto Pelaez
Autor: Gaspar Ernesto Soto PelaezIngeniero mecánico, especialista en gerencia de mantenimiento. Coordinador de proyectos en OMC SAS en Colombia.
EmailLinkedIn

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].
Ilustración 1. Transformación de varias señales de vibración del dominio del tiempo al dominio de la frecuencia. Fuente [2].

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]
Ilustración 2. Descomposición de una señal sinusoidal de vibración. Fuente [2]

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]
Ilustración 3. Gráfico de una señal de vibración con un RMS de 0.49. Fuente: [3]

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]
Ilustración 4. Gráfico de una señal de vibración con un RMS afectado por una excitación. Fuente: [3]

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]
Ilustración 8. Gráfico de señal con un pico de amplitud agrandada. Fuente: [3]

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]
Ilustración 6. Gráfico que compara dos señales de vibraciones con factores de cresta diferentes. Fuente: [3]

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].
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].

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].
Ilustración 8. Representación gráfica de velocidad vs desplazamiento de una señal de vibración en Python. Fuente: [4].

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].
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].

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].
Ilustración 10. Gráfico de diferentes respuestas a señales de vibración. Fuente: [4].


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

starstarstarstarstar

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

Publicar artículo