# Importing Python modules required for this notebook
# (this cell must be executed with "shift+enter" before any other Python cell)
import numpy as np
import matplotlib.pyplot as plt
import pickle as pk
import scipy.linalg as sc
from MRPy import *
def vibration_modes(K, M):
# Uses scipy to solve the standard eigenvalue problem
w2, Phi = sc.eig(K, M)
# Ensure ascending order of eigenvalues
iw = w2.argsort()
w2 = w2[iw]
Phi = Phi[:,iw]
# Eigenvalues to vibration frequencies
wk = np.sqrt(np.real(w2))
fk = wk/2/np.pi
return fk, wk, Phi
O sistema estrutural abaixo, com 2 g.d.l., representa um pórtico plano dotado de um amortecedor de massa sintonizada. Calcule os coeficientes de rigidez k1 e k2, e as respectivas formas modais, correspondentes às frequências naturais dadas.
As matrizes de massa e de rigidez são:
K=[k1+k2−k2−k2k2]Lembrando agora o problema de autovalores e autovetores:
K→φi=ω2iM→φiConsiderando que as formas modais são normalizadas pela sua coordenada em M1:
[k1+k2−k2−k2k2]⋅[1φi]=ω2i[M100M2]⋅[1φi]Isso resulta em um par de equações:
(k1+k2)−k2φi=ω2iM1−k2+k2φi=ω2iM2φipara i=1 e i=2. Portanto, tem-se um sistema com 4 equações para 4 incógnitas (k1, k2, φ1, φ2). A dificuldade está na não-linearidade.
Somando-se as duas equações:
k1=ω2i(M1+M2φi)Isolando-se k2 na primeira equação:
k2=ω2iM1−k11−φiInicialmente vamos atribuir um valor inicial às rigidezes para se obter as formas modais e então tentar iterar.
M1 = 10000.
M2 = 500.
w1_2 = (2*np.pi*1.00)**2
w2_2 = (2*np.pi*1.00)**2
k1 = w1_2*M1
k2 = w2_2*M2
KG = np.array([[ k1+k2, -k2 ],[-k2, k2]])
MG = np.array([[ M1, 0 ],[ 0, M2]])
fk, wk, Phi = vibration_modes(KG, MG)
ph1 = Phi[:,0]/Phi[0,0] # normalizando pela coordenada da massa M1
ph2 = Phi[:,1]/Phi[0,1]
print('Frequência no primeiro modo: {0:6.2f} Hz'.format(fk[0]))
print('Frequência no segundo modo: {0:6.2f} Hz\n'.format(fk[1]))
print('Rigidez das colunas inferiores (k1): {0:6.0f} N/m'.format(k1))
print('Rigidez do TMD (k2): {0:6.0f} N/m\n'.format(k2))
print('Coordenada do primeiro modo em M2: {0:6.2f}'.format(ph1[1]))
print('Coordenada do segundo modo em M2: {0:6.2f}'.format(ph2[1]))
Frequência no primeiro modo: 0.89 Hz Frequência no segundo modo: 1.12 Hz Rigidez das colunas inferiores (k1): 394784 N/m Rigidez do TMD (k2): 19739 N/m Coordenada do primeiro modo em M2: 5.00 Coordenada do segundo modo em M2: -4.00
Após algumas tentativas, percebe-se que a única maneira de se obter as frequências dadas é reduzindo a massa M2 para 100kg (1% da massa M1), ou aumentando-se a massa M1 para 50 ton (mesma relação). As rigidezes são calculadas usando-se a média das duas frequências alvo, que é 1Hz.
Portanto, adota-se as frequências 0.89 e 1.12Hz obtidas acima, correspondentes às rigidezes propostas.
Para a estrutura do problema anterior, calcule as máximas amplitudes de deslocamento de cada massa para uma carga dinâmica harmônica aplicada na massa M1.
F(t)=F0sin(2πf0t)onde F0=1kN e f0=1Hz.
Inicialmente construímos o vetor de cargas NODAIS, sendo uma força harmônica na massa M1 e zero na massa M2.
# Simulação das forças NODAIS
Td = 128
N = 2**16
F0 = 1000.
f0 = 1.00
t = np.linspace(0, Td, N)
F1 = F0*np.sin(2*np.pi*f0*t)
F2 = np.zeros_like(F1)
FG = MRPy(np.vstack((F1, F2)), Td=Td)
FG.plot_time(fig=1, figsize=(12,6), axis_t=[0, FG.Td, -2000, 2000]);
Cálculo dos parâmetros modais, usando a matriz Φ original (fornecida pelo algoritmo de autovalores do Python, com a escala que tiver). Abaixo também são calculadas as forças modais.
zk = np.array([0.01, 0.01])
Mk = np.diag(np.dot(Phi.T, np.dot(MG, Phi)))
Kk = Mk*(wk**2)
Fk = MRPy(np.dot(Phi.T, FG), fs=FG.fs)
Fk.plot_time(fig=2, figsize=(12,6), axis_t=[0, FG.Td, -500, 500]);
Cálculo dos deslocamentos por superposição MODAL e retorno aos valores NODAIS:
ak = MRPy(np.dot(np.diag(1/Mk), Fk), fs=Fk.fs) # divide force by modal mass
uk = ak.sdof_Duhamel(fk, zk) # modal space solution
uG = 1000*MRPy(np.dot(Phi, uk), fs=uk.fs) # back to nodal solution
uG = uG.extract(segm=(2/3, 1), by='fraction') # avoid transiente start
uG.plot_time(4, figsize=(12,6), axis_t=[0, uG.Td, -60, 60]);
f = uG.f_axis()
Su, fs = uG.periodogram()
plt.figure(5, figsize=(12,4))
plt.semilogy(f, Su[0], 'b', f, Su[1], 'g')
plt.axis([0, 5, 1e-4, 1e5])
plt.legend(('Massa M1', 'Massa M1'))
plt.grid(True)
ukp = uk.extract(segm=(3/4, 1), by='fraction').max(axis=1)
up = uG.max(axis=1)
print('Deslocamento modal de pico do primeiro modo: {0:4.1f}mm'.format(1000*ukp[0]))
print('Deslocamento modal de pico do segundo modo: {0:4.1f}mm\n'.format(1000*ukp[1]))
print('Deslocamento de pico da massa M1: {0:4.1f}mm'.format(up[0]))
print('Deslocamento de pico da massa M2: {0:4.1f}mm'.format(up[1]))
Deslocamento modal de pico do primeiro modo: 28.7mm Deslocamento modal de pico do segundo modo: 23.1mm Deslocamento de pico da massa M1: 1.1mm Deslocamento de pico da massa M2: 50.5mm
Observa-se que a frequência da carga está situada bem entre as duas frequências naturais, de modo que se evita um forte pico de ressonância.
As propriedades modais já foram calculadas no método anterior. Agora calcula-se a amplitude das forças modais:
FG = np.array([[F0, 0]]).T # amplitudes das forças nodais (vetor coluna)
Fk = np.dot(Phi.T, FG)
Fk1 = Fk[0,0]
Fk2 = Fk[1,0]
print('Amplitude da força modal no primeiro modo: {0:4.1f} N'.format(Fk1))
print('Amplitude da força modal no segundo modo: {0:4.1f} N'.format(Fk2))
Amplitude da força modal no primeiro modo: 196.1 N Amplitude da força modal no segundo modo: 242.5 N
A amplitude dos deslocamentos modais é calculada usando-se a função de ganho, A(β,ζ), na frequência da excitação f0 (1Hz):
Aw = lambda f: np.sqrt(1/( (1 - (f/fn)**2)**2 + (2*zt*(f/fn))**2 ))
fn = fk[0]
zt = zk[0]
A1 = Aw(f0)
u1 = 1000*A1*Fk1/Kk[0]
fn = fk[1]
zt = zk[1]
A2 = Aw(f0)
u2 = 1000*A2*Fk2/Kk[1]
print('Amplificação dinâmica no primeiro modo: {0:5.2f}'.format(A1))
print('Deslocamento modal no primeiro modo: {0:5.2f} mm\n'.format(u1))
print('Amplificação dinâmica no segundo modo: {0:5.2f}'.format(A2))
print('Deslocamento modal no segundo modo: {0:5.2f}mm'.format(u2))
Amplificação dinâmica no primeiro modo: 3.98 Deslocamento modal no primeiro modo: 28.59 mm Amplificação dinâmica no segundo modo: 4.98 Deslocamento modal no segundo modo: 23.12mm
Observa-se que os deslocamentos MODAIS coincidem com os valores obtidos por simulação. Finalmente os deslocamentos MODAIS são superpostos (ignorando-se a fase) para se calcular os deslocamentos NODAIS. Como a informação de fase é perdida, é feita uma combinação quadrática das amplitudes, que traz alguma imprecisão.
uG = np.sqrt((Phi[:,0]*u1)**2 + (Phi[:,1]*u2)**2) # Combinação quadrática de amplitudes
print('Deslocamento de pico da massa M1: {0:4.1f}mm'.format(uG[0]))
print('Deslocamento de pico da massa M2: {0:4.1f}mm'.format(uG[1]))
Deslocamento de pico da massa M1: 7.9mm Deslocamento de pico da massa M2: 35.9mm
Observa-se que os resultados diferem dos obtidos por simulação, onde a fase é levada em conta.
Para a viga com as restrições de apoio dadas, proponha uma forma aproximada para o primeiro modo de vibração, φ(x), e calcule a respectiva frequência natural em função do comprimento, L, da massa por unidade de comprimento, μ, e da rigidez à flexão, EI.
Vamos usar como modo de vibração a função de interpolação para uma rotação do nó B. Logo:
ϕ(ξ)=ξ3−ξ2onde ξ=x/L. A escala da função acima não é importante. A curvatura é a segunda derivada dessa função:
ϕ′′(ξ)=(6ξ−2)/L2Logo a energia cinética de referência é:
2Tref=∫10μϕ2(ξ)Ldξ=μL105e a energia potencial elástica é:
2V=∫10EI[ϕ′′(ξ)]2Ldξ=4EIL3Portanto, pelo quociente de Rayleigh temos:
fn=12π√VTref=12π√420EIμL4=12π(4.5270L)2√EIμNa tabela abaixo o resultado exato é encontrado como sendo 3.93 ao invés de 4.53 com a função aproximada. Lembrando que o quociente de Rayleigh sempre dá uma frequência acima do valor correto.
O gráfico abaixo é só para conferir a forma modal aproximada escolhida.
phi = lambda xi: L*(xi*xi*xi - xi*xi)
L = 1.
x = np.linspace(0, L, 1024)
phx = phi(x)
plt.figure(6, figsize=(12,4))
plt.plot(x, phx)
plt.axis([0, 1, -0.2, 0.1])
plt.grid(True)
Alternativamente podemos usar a linha elástica que resulta da aplicação de uma carga distribuída sobre uma viga com as condições de contorno dadas:
ϕ(ξ)=2ξ4−5ξ3+3ξ2onde ξ=x/L. A escala da função acima é irrelevante. A curvatura é a segunda derivada dessa função:
ϕ′′(ξ)=(24ξ2−30ξ+6)/L2Logo a energia cinética de referência é:
2Tref=∫10μϕ2(ξ)Ldξ=19μL630e a energia potencial elástica é:
2V=∫10EI[ϕ′′(ξ)]2Ldξ=36EI5L3Portanto, pelo quociente de Rayleigh temos:
fn=12π√VTref=12π√22680EI95μL4=12π(3.9308L)2√EIμObserva-se que essa função de interpolação proposta é (quase) exatamente o valor apresentado na tabela.
Abaixo está um gráfico para visualização da forma modal proposta.
phi = lambda xi: -2*xi*xi*xi + 5*xi*xi*xi - 3*xi*xi
L = 1.
x = np.linspace(0, L, 1024)
phx = phi(x)
plt.figure(6, figsize=(12,4))
plt.plot(x, phx)
plt.axis([0, 1, -0.6, 0.2])
plt.grid(True)
Para a viga do problema anterior, com os valores dados abaixo, calcule a máxima amplitude de deslocamento para o peso próprio sendo aplicado de forma súbita a partir do tempo t=0, ou seja, como uma função passo unitário, h(t).
Inicialmente define-se os dados numéricos do problema.
L = 6. # comprimento das barras (m)
EI = 48000000. # rigidez à flexão (Nm2)
μ = 250. # massa por unidade de comprimento (kg/m)
g = 9.81 # gravidade (m/s2)
q = μ*g # carga por unidade de comprimento (N/m)
Usando-se a função de interpolação proposta são calculados os valores modais. Primeiro a massa modal:
Mk=∫10μϕ2(ξ)Ldξ=19μL630≈45.2kge em seguida a frequência modal:
wk=(3.931L)2√EIμ≈188.1rad/s≈29.93Hzcom as quais calculamos a rigidez modal:
Kk=ω2kMk≈1600kN/mA amplitude da força modal (passo unitário) é calculada a partir da forma modal:
Fk=∫10μgϕ(ξ)Ldξ=320μgL≈2.21kNA amplificação dinâmica para uma carga passo unitário é A=2, que deve ser aplicada sobre o deslocamento modal estático:
uk,dyn=Auk,est=AFkKk=2⋅2.211600=2.76mmA máxima amplitude da forma modal é calculada como sendo ϕmax≈0.26. Portanto a máxima amplitude de deslocamento é dada por:
umax=ϕmaxuk,dyn≈0.72mm.