Un daño local suele reducir la rigidez de un elemento. ¿Cuánto cambian las frecuencias y los modos? Para una perturbación pequeña \(\Delta\mathbf K\) de la rigidez, la teoría de perturbaciones da, a primer orden,
NotaDemostración (con modos normalizados a masa unidad)
Derivando \((\mathbf K+\epsilon\Delta\mathbf K)(\boldsymbol\varphi+\epsilon\boldsymbol\varphi')=(\lambda+\epsilon\lambda')\mathbf M(\boldsymbol\varphi+\epsilon\boldsymbol\varphi')\) respecto de \(\epsilon\) en \(\epsilon=0\) se obtiene \(\Delta\mathbf K\boldsymbol\varphi+\mathbf K\boldsymbol\varphi'=\lambda'\mathbf M\boldsymbol\varphi+\lambda\mathbf M\boldsymbol\varphi'\). Multiplicando por \(\boldsymbol\varphi^{\mathsf T}\) y usando \(\boldsymbol\varphi^{\mathsf T}\mathbf K=\lambda\boldsymbol\varphi^{\mathsf T}\mathbf M\), los términos con \(\boldsymbol\varphi'\) se cancelan y queda \(\boldsymbol\varphi^{\mathsf T}\Delta\mathbf K\boldsymbol\varphi=\lambda'\,\boldsymbol\varphi^{\mathsf T}\mathbf M\boldsymbol\varphi=\lambda'\). \(\square\)
La ecuación 1 dice que el cambio de \(\lambda_j\) es la energía de deformación del modo \(j\)en la parte de la estructura que se ha modificado. Si el entrepiso 2 pierde un \(10\,\%\) de rigidez, \(\Delta\mathbf K=-0{,}1\,k_2\,\mathbf e\mathbf e^{\mathsf T}\) con \(\mathbf e=(1,-1,0)^{\mathsf T}\), y el cambio de cada frecuencia es proporcional al cuadrado de la deriva\(\varphi_{1j}-\varphi_{2j}\) de ese modo entre las plantas 1 y 2.
Tabla 1: Efecto de una pérdida del 10 % de rigidez en el entrepiso 2 (escenario C). Variación relativa de la frecuencia: predicción lineal (ecuación 1) y cálculo exacto; MAC entre la forma del estado de referencia y la del dañado.
La aproximación lineal acierta el signo y el orden de magnitud, con error de décimas de punto porcentual para un cambio del \(10\,\%\); empeora si el cambio crece.
No todos los modos «ven» el daño por igual. El tercer modo tiene mucha deriva entre las plantas 1 y 2 y baja más de un \(3\,\%\); el segundo, que apenas se deforma ahí, baja unas décimas. Elegir qué modos se vigilan es decidir qué daños se pueden ver.
Las formas cambian mucho menos que las frecuencias: con MAC \(\ge0{,}999\), dos formas medidas con ruido se parecen más que el cambio que se quiere detectar. Es lo que se retoma en la comparación de estados de M12.
AdvertenciaMatrices que no son simétricas
Si \(\mathbf A\) no es simétrica, los valores propios pueden ser mucho más sensibles. Ejemplo: \(\mathbf A=\begin{bmatrix}1&1000\\0&1\end{bmatrix}\) tiene el valor propio \(1\) doble. Con un cambio de \(10^{-6}\) en el elemento \((2,1)\), los valores propios pasan a \(1\pm\sqrt{1000\cdot10^{-6}}\approx1\pm0{,}0316\): la perturbación se multiplica por unos \(3\cdot10^{4}\). Para una matriz simétrica, el desplazamiento nunca supera la norma de la perturbación (teorema de Weyl). En la forma de estado de una estructura con amortiguamiento no proporcional, \(\mathbf A\) no es simétrica, y por eso conviene calcular los polos con algoritmos estables y no fiarse de pequeñas diferencias entre ellos.
Simulación 1. Modos de un edificio de tres plantas. Modifica la rigidez de cada entrepiso (como porcentaje del valor de referencia) y la masa de la cubierta. El gráfico compara las formas modales del estado de referencia (línea gris) con las del modificado (línea de color); la tabla da las frecuencias, el MAC y la predicción lineal de ecuación 1.
Ver el código
viewof dk1 = Inputs.range([-30,30], {value:0,step:1,label:"Δk₁ (% de 5·10⁷ N/m)"})viewof dk2 = Inputs.range([-30,30], {value:-10,step:1,label:"Δk₂ (% de 5·10⁷ N/m)"})viewof dk3 = Inputs.range([-30,30], {value:0,step:1,label:"Δk₃ (% de 4·10⁷ N/m)"})viewof dmasa = Inputs.range([-30,30], {value:0,step:1,label:"Δm₃ (% de 2·10⁵ kg)"})
Ver el código
modelo = {const m0 = [2e5,2e5,2e5], k0 = [5e7,5e7,4e7];const m1 = [2e5,2e5,2e5* (1+ dmasa /100)];const k1 = [k0[0] * (1+ dk1 /100), k0[1] * (1+ dk2 /100), k0[2] * (1+ dk3 /100)];const a =edificioCortante(m0, k0), b =edificioCortante(m1, k1);const A =modosPropios(a.K, a.M), B =modosPropios(b.K, b.M);// predicción lineal: Δλ_j = φᵀ (ΔK − λ ΔM) φ con los modos del estado de referenciaconst dK = b.K.map((f, i) => f.map((v, j) => v - a.K[i][j]));const dM = b.M.map((f, i) => f.map((v, j) => v - a.M[i][j]));const lin = [0,1,2].map((j) => {const p = A.Phi.map((f) => f[j]), lam = (2*Math.PI* A.f[j]) **2;const q = (X) => p.reduce((s, pi, i) => s + pi * p.reduce((t, pk, k) => t + X[i][k] * pk,0),0);return (q(dK) - lam *q(dM)) / lam /2; });const col = (X, j) => { const v = X.Phi.map((f) => f[j]);const mx = v.reduce((s, x) =>Math.abs(x) >Math.abs(s) ? x : s,0);return v.map((x) => x / mx); };return {A, B, lin, col};}
Ver el código
Plot.plot({width:700,height:260,marginLeft:50,fx: {label:null,tickFormat: d =>`Modo ${d +1}`},x: {domain: [-1.3,1.3],label:"desplazamiento relativo",ticks:5},y: {domain: [0,3.2],label:"planta",ticks: [0,1,2,3]},marks: [ Plot.ruleX([0], {stroke:"#6B7280",strokeDasharray:"4,4"}),...[0,1,2].flatMap(j => [ Plot.line([0,...modelo.col(modelo.A, j)].map((x, i) => ({x,y: i, j})), {fx:"j",x:"x",y:"y",stroke:"#9CA3AF",strokeWidth:2}), Plot.line([0,...modelo.col(modelo.B, j).map((x) => x *Math.sign(modelo.col(modelo.A, j).reduce((s, a, i) => s + a * modelo.col(modelo.B, j)[i],0) ||1))].map((x, i) => ({x,y: i, j})), {fx:"j",x:"x",y:"y",stroke:"#1B6CA8",strokeWidth:2.5}), Plot.dot([0,...modelo.col(modelo.B, j).map((x) => x *Math.sign(modelo.col(modelo.A, j).reduce((s, a, i) => s + a * modelo.col(modelo.B, j)[i],0) ||1))].map((x, i) => ({x,y: i, j})), {fx:"j",x:"x",y:"y",fill:"#1B6CA8",r:4}) ]) ]})
Ver el código
html`<table class="table" style="max-width:640px"><thead><tr><th>Modo</th><th>f referencia (Hz)</th><th>f modificado (Hz)</th><th>Δf/f exacto</th><th>Δf/f lineal</th><th>MAC</th></tr></thead><tbody>${[0,1,2].map((j) => {const fa = modelo.A.f[j], fb = modelo.B.f[j];const a = modelo.A.Phi.map((f) => f[j]), b = modelo.B.Phi.map((f) => f[j]);const fmt = (x, d) => x.toFixed(d).replace(".",",");return`<tr><td>${j +1}</td><td>${fmt(fa,3)}</td><td>${fmt(fb,3)}</td><td>${fmt(100* (fb / fa -1),2)} %</td><td>${fmt(100* modelo.lin[j],2)} %</td><td>${fmt(mac(a, b),4)}</td></tr>`;}).join("")}</tbody></table>`
Hipótesis y límites de la simulación 1
Modelo: edificio de cortante de tres plantas (masas concentradas, plantas rígidas, entrepisos sin masa); no incluye la cimentación ni el suelo.
Sin amortiguamiento: las frecuencias son las no amortiguadas; el amortiguamiento de un 1 % las cambia en menos de una parte por diez mil.
Cálculo: los modos se obtienen con el método de Jacobi implementado en recursos/js/matematicas.js y contrastado con Julia; es válido para matrices pequeñas.
Predicción lineal: es la ecuación 1, buena para cambios de unos pocos por cien y que empeora al crecer el cambio. Compárala con el cálculo exacto.
Qué se puede concluir y qué no: muestra cómo se mueven las frecuencias y las formas en un modelo ideal. No dice cuánto de este cambio sería detectable con sensores reales, ruido y variaciones de temperatura: eso se estudia con los escenarios B y C en el caso transversal.
Para explorar. (1) Con \(\Delta k_2=-10\,\%\) y el resto en cero, comprueba que se reproduce la Tabla 1. (2) Cambia solo \(\Delta k_3\) y observa qué modos se mueven; ¿es el mismo conjunto que con \(\Delta k_1\)? (3) Sube la masa de la cubierta: ¿qué frecuencia baja más?