Universidade Federal do Rio Grande do Sul (UFRGS)
Programa de Pós-Graduação em Engenharia Civil (PPGEC)
NAME:
CARD:
# 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 scipy.linalg as sc
import matplotlib.pyplot as plt
from MRPy import *
Dados do problema:
H = 3. # altura de cada pavimento (m)
M = 10000. # massa de cada pavimento (kg)
f1 = 1. # frequência fundamental (Hz)
zt = 0.01 # amortecimento modal (adim., mesma nos dois modos)
g = 9.81 # aceleração da gravidade (m/s^2)
Função para cálculo dos modos de vibração:
def vibration_modes(K, M):
# 1. Uses scipy to solve the standard eigenvalue problem
w2, Phi = sc.eig(K, M)
# 2. Ensure ascending order of eigenvalues
iw = w2.argsort()
w2 = w2[iw]
Phi = Phi[:,iw]
# 3. Eigenvalues to vibration frequencies
wk = np.sqrt(np.real(w2))
fk = wk/2/np.pi
# 4. Mass matrix normalization
Mk = np.diag(np.dot(Phi.T, np.dot(M, Phi)))
for k in range(len(wk)):
Phi[:,k] = Phi[:,k]/np.sqrt(Mk[k])
# 5. Return results
return fk, wk, Phi
Monta matrizes e calcula modos:
K = 1.00 # rigidez de cada coluna (incógnita)
KG = K*np.array([[2, -2], [-2, 4]]) # rigidez global
MG = M*np.array([[1, 0], [ 0, 1]]) # massa global
fk, wk, Phi = vibration_modes(KG, MG)
K = (f1/fk[0])**2 # determina a rigidez correta
fk = fk*np.sqrt(K) # calcula todas as frequências
wk = fk*2*np.pi # em rad/s
print('Rigidez individual de cada barra: {0:6.1f}kN/m.'.format(K/1000))
print('Frequência no primeiro modo: {0:6.2f}Hz.'.format(fk[0]))
print('Frequência no segundo modo: {0:6.2f}Hz.'.format(fk[1]))
#print(wk)
Rigidez individual de cada barra: 516.8kN/m. Frequência no primeiro modo: 1.00Hz. Frequência no segundo modo: 2.62Hz.
Visualiza modos:
plt.figure(1, figsize=(12,8))
x = H*np.arange(3)
for k in range(2):
qk = np.zeros(3)
qk[1:] = Phi[::-1,k]
qk /= np.max(np.abs(qk)) # adjust scale for unity amplitude
plt.subplot(1,2,k+1)
plt.plot(qk, x, 'bo')
plt.plot(qk, x)
plt.xlim(-1.5, 1.5); plt.ylabel(str(k+1));
plt.ylim( 0.0, 7.0);
plt.title('fk = {0:4.2f}Hz'.format(fk[k]));
plt.grid(True)
A excitação tem mesma amplitude nas frequências de 0.5 e 3Hz. Para usar as amplificações dinâmicas, vamos admitir que o pico das respostas modais poderão estar em fase.
FG = 0.1*g*np.diag(MG).reshape(2,1) # amplitude das forças nos pavimentos
Fk = np.matmul(Phi.T, FG) # amplitude das forças modais
Mk = np.diag(np.dot(Phi.T, np.dot(MG, Phi))) # massas modais
Kk = wk*wk*Mk # rigidezes modais
uk = np.empty(2) # aloca memória para respostas modais
for k, fn in enumerate(fk):
bt = [0.5, 3.0]/fn # frequências componentes da excitação
AD = np.sqrt(1/((1 - bt**2)**2 + (2*zt*bt)**2)) # respectivas amplificações dinâmicas
uk[k] = (Fk[k]/Kk[k])*np.sum(AD) # pico da resposta modal amplificada
u = np.matmul(Phi,uk)
print('Máximo deslocamento no pavimento superior: {0:6.4f}m.'.format(u[0]))
Máximo deslocamento no pavimento superior: 0.0398m.
O mesmo cálculo agora por simulação, integrando por Fourier através do módulo MRPy
:
Td = 32.
N = 1024
t = np.linspace(0, Td, N) # domínio do tempo
F = FG*(np.sin(np.pi*t) + np.sin(6*np.pi*t)) # força dinâmica
Calcula forças modais e resolve equações de equilíbrio desacopladas:
Fk = MRPy(np.matmul(Phi.T, F), Td=Td) # cria objeto MRPy
for k in range(2):
Fk[k,:] /= Mk[k] # prepara para solução
uk = Fk.sdof_Fourier(fk, zt) # calcula respostas modais
u = np.matmul(Phi,uk) # deslocamento nos pavimentos
print('Máximo deslocamento no pavimento superior: {0:6.4f}m.'.format(u[0,:].max()))
u.plot_time(1, figsize=(10,5));
Máximo deslocamento no pavimento superior: 0.0388m.
A diferença dos dois resultados se deve a que o pico das respostas modais não está perfeitamente em fase. Portanto a solução numérica, que é a mais precisa, apresenta amplitude ligeiramente menor.
Primeiro vamos calcular a resposta exata, aplicando as condições de contorno na solução geral:
φ(x)=C1(cospx+coshpx)+C2(cospx−coshpx)+C3(sinpx+sinhpx)+C4(sinpx−sinhpx)onde:
p4=(μEI)ω2As condições de contorno são:
φ(0)=0φ′′(0)=0φ′(L)=0φ′′′(L)=0Aplicando essas condições na solução geral temos, para x=0:
φ(0)=C1(1+1)+C2(1−1)+C3(0+0)+C4(0−0)=0φ′′(0)=C1(−1+1)+C2(−1−1)+C3(−0+0)+C4(−0−0)=0Portanto C1=0 e C2=0. Por outro lado, para x=L:
φ′(L)=C3(cospL+coshpL)+C4(cospL−coshpL)=0φ′′′(L)=C3(−cospL+coshpL)+C4(−cospL−coshpL)=0Colocando as equações acima em forma matricial temos:
[(cospL+coshpL)(cospL−coshpL)(−cospL+coshpL)(−cospL−coshpL)][C3C4]=[00]Fazendo o determinante da matrix de coeficientes igual a zero temos as frequência naturais. Estas frequências podem ser calculadas numericamente, como mostrado abaixo.
def char_eq(x):
x = x[0]
A = np.array([[ np.cos(x)+np.cosh(x), np.cos(x)-np.cosh(x)],
[-np.cos(x)+np.cosh(x), -np.cos(x)-np.cosh(x)]])
return np.linalg.det(A)
#-----------------------------------------------------------------------
from scipy.optimize import fsolve
p = fsolve(char_eq, 1.0)
print('Cantilever beam frequency parameter is {0:8.6f}...'.format(p[0]))
Cantilever beam frequency parameter is 1.570796...
Ou seja, o parâmetro de frequência parece ser π/2 e a frequência fundamental resulta:
ω1=(π2L)2√EIμque coerentemente corresponde à frequência fundamental de uma viga bi-apoiada com vão 2L. Isso está correto já que a condição de apoio da direita equivale a uma condição de simetria para uma viga com o dobro do vão!
Agora vamos refazer o cálculo propondo a seguinte função aproximada para a forma modal:
φ(x)=1L2(2Lx−x2)ou seja, uma parábola que apresenta derivada nula para x=L, e portanto respeita algumas condições de contorno. A escala desta forma modal é intencionalmente escolhida como sendo unitária. As derivadas dessa forma modal aproximada são:
φ′(x)=(2L−2x)/L2φ′′(x)=−2/L2Observa-se que a função proposta não cumpre a condição de momento nulo na extremidade da esquerda, mas vamos em frente. A correspondente energia cinética de referência é:
Tref=12∫L0μφ2(x)dx=415μLenquanto a energia potencial elástica resulta:
V=12∫L0EI[φ′′(x)]2dx=2EIL3Portanto o quociente de Rayleigh resulta:
ω1=√VTref=√2EI⋅154μL4=(1201/42L)2√EIμonde 1201/4≈3.31 e portanto esse valor apresenta um erro de aproximadamente 5.4%, esperado em relação ao valor correto, π, e um erro de aproximadamente 11% em relação à frequência correta. Observe que o quociente de Rayleigh sempre fornece frequência igual ou maior que a exata.
Dados do problema:
L = 6. # comprimento da viga (m)
m = 80. # massa da pessoa (kg)
mu = 200. # massa por unidade de comprimento (kg/m)
EI = 36.e6 # rigidez à flexão (Nm^2)
Vamos considerar a resposta apenas no primeiro modo. A dissipação de energia por amortecimento é desprezada e a energia total do sistema deve se manter constante e igual à a energia potencial gravitacional da pessoa no início da queda:
E=mgh=784.8JPor questão de simplicidade, admite-se que a viga já está deformada por peso próprio quando se determina a altura de queda da pessoa. Também vamos considerar que o choque é perfeitamente inelástico, ou seja, a viga e a pessoa seguem unidos após o contato.
Observe que forma modal proposta é normalizada pela unidade, de modo que ela tem valor unitário na extremidade da direita, φ(L)=1. Desta forma, deslocamento vertical e deslocamento modal tem mesmo valor numérico no ponto B.
A energia cinética total do sistema após o choque é calculada como:
T=12∫L0μ[v0φ(x)]2dx+12m[v0φ(L)]2=360v20onde v0 é a velocidade inicial da extremidade direita da viga logo após o choque, que é numericamente igual à velocidade inicial no espaço modal. Igualando-se as energias, E=T, chega-se a:
v0=√784.8360≈1.48m/sA frequência natural no primeiro modo precisa ser re-calculada, pois agora a viga tem também a massa da pessoa incorporada na extremidade direita. A nova energia cinética de referência é:
Tref=12∫L0μφ2(x)dx+12mφ2(L)=360A energia potencial elástica, V, permanece a mesma e, portanto, a frequência natural resulta menor:
ωn=√VTref=√2⋅36×106360⋅63≈30.42rad/sSem a massa da pessoa incorporada, a frequência natural calculada na seção anterior seria de 32.27rad/s.
A amplitude total do delocamento modal é a soma da amplitude devida à velocidade inicial com o deslocamento devido à carga impulsiva. Dada a escala unitária da forma modal, a força modal tem o mesmo módulo da força aplicada na extremidade da direita. O formato retangular da carga impulsiva (choque inelástico) implica que o fator de amplificação dinâmica, A, da resposta estática, uB,est, é igual a 2.
uB,max=v0ωn+AuB,estPara calcular a resposta estática é necessário conhecer a massa modal:
M=∫L0μφ2(x)dx+mφ2(L)=720kgLembrando que a rigidez modal é dada por K=ω2nM, a resposta estática é calculada como:
uB,est=mgφ(L)K=80⋅9.81⋅130.422⋅720≈1.18mmSubstituindo valores:
uB,max=1.4830.42+2⋅0.00118≈5.1cm