import numpy as np from scipy.linalg import eigh def main(): # Propriedades do material e seção transversal E = float(input("Insira o módulo de elasticidade do material (Pa): ")) A = float(input("Insira a área da seção transversal (m²): ")) I = float(input("Insira o momento de inércia da seção (m^4): ")) rho = float(input("Insira a densidade do material (kg/m³): ")) rg = np.sqrt(I / A) # Raio de giração da seção (m) # Definição da geometria e conectividade dos nós nnode = int(input("Insira o número de nós: ")) nel = int(input("Insira o número de elementos: ")) nnel = int(input("Insira o número de nós por elemento: ")) ndof = 3 edof = nnel * ndof sdof = nnode * ndof gcoord = np.zeros((nnode, 2)) print("Insira as coordenadas dos nós (formato: x y):") for i in range(nnode): gcoord[i] = [float(coord) for coord in input().split()] nodes = np.zeros((nel, nnel), dtype=int) print("Insira a conectividade dos elementos (formato: nó1 nó2):") for i in range(nel): nodes[i] = [int(node) for node in input().split()] # Carregamento aplicado nos nós print("Insira o vetor de carregamento aplicado nos nós (formato: Fx1 Fy1 M1 Fx2 Fy2 M2 ...):") F = np.array([float(val) for val in input().split()]) # Solicitação das condições de contorno print("Insira os graus de liberdade com condições de contorno (0-indexed, separados por espaços):") bcdof_input = input().split() bcdof = np.array([int(dof) for dof in bcdof_input]) print("Insira os valores dos graus de liberdade com condições de contorno (separados por espaços):") bcval_input = input().split() bcval = np.array([float(val) for val in bcval_input]) # Inicialização das matrizes de rigidez e massa globais KK = np.zeros((sdof, sdof)) MM = np.zeros((sdof, sdof)) # Montagem das matrizes de rigidez e massa for i in range(nel): deltax = gcoord[nodes[i, 1], 0] - gcoord[nodes[i, 0], 0] deltay = gcoord[nodes[i, 1], 1] - gcoord[nodes[i, 0], 1] L = np.sqrt(deltax ** 2 + deltay ** 2) alpha = np.arctan2(deltay, deltax) c = np.cos(alpha) s = np.sin(alpha) T = np.array([[c, s, 0, 0, 0, 0], [-s, c, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, c, s, 0], [0, 0, 0, -s, c, 0], [0, 0, 0, 0, 0, 1]]) ke = np.array([[A * L ** 2 / I, 0, 0, -A * L ** 2 / I, 0, 0], [0, 12, 6 * L, 0, -12, 6 * L], [0, 6 * L, 4 * L ** 2, 0, -6 * L, 2 * L ** 2], [-A * L ** 2 / I, 0, 0, A * L ** 2 / I, 0, 0], [0, -12, -6 * L, 0, 12, -6 * L], [0, 6 * L, 2 * L ** 2, 0, -6 * L, 4 * L ** 2]]) * E * I / L ** 3 me = (rho * A * L) * np.array([[140 / 420, 0, 0, 70 / 240, 0, 0], [0, (13 / 35) + (6 * rg ** 2) / (5 * L ** 2), (11 * L / 210) + (rg ** 2) / (10 * L), 0, (9 / 70) - (6 * rg ** 2) / (5 * L ** 2), (-13 * L / 420) + (rg ** 2) / (10 * L)], [0, (11 * L / 210) + (rg ** 2) / (10 * L), (L ** 2 / 105) + (2 * rg ** 2) / (15), 0, (13 * L / 420) - (rg ** 2) / (10 * L), (-L ** 2 / 140) - (rg ** 2) / (30)], [70 / 420, 0, 0, 140 / 420, 0, 0], [0, (9 / 70) - (6 * rg ** 2) / (5 * L ** 2), (13 * L / 420) - (rg ** 2) / (10 * L), 0, (13 / 35) + (6 * rg ** 2) / (5 * L ** 2), (-11 * L / 210) - (rg ** 2) / (10 * L)], [0, (-13 * L / 420) + (rg ** 2) / (10 * L), (-L ** 2 / 140) - (rg ** 2) / (30), 0, (-11 * L / 210) - (rg ** 2) / (10 * L), (L ** 2 / 105) + (2 * rg ** 2) / (15)]]) Ke = np.dot(np.dot(T.T, ke), T) Me = np.dot(np.dot(T.T, me), T) idx = np.zeros((1, edof), dtype=int) for j in range(ndof): idx[0, j] = 3 * nodes[i, 0] + j idx[0, j + ndof] = 3 * nodes[i, 1] + j for m in range(edof): for n in range(edof): KK[idx[0, m], idx[0, n]] += Ke[m, n] MM[idx[0, m], idx[0, n]] += Me[m, n] # Redução das matrizes devido às condições de contorno KK_cc = np.delete(np.delete(KK, bcdof, axis=0), bcdof, axis=1) MM_cc = np.delete(np.delete(MM, bcdof, axis=0), bcdof, axis=1) F_cc = np.delete(F, bcdof) # Resolução do sistema de equações lineares try: u = np.linalg.solve(KK_cc, F_cc) except np.linalg.LinAlgError: print("Sistema singular. Verifique as condições de contorno fornecidas.") return # Recuperação dos deslocamentos totais U = np.zeros((1, sdof)) idx_cc = 0 idx_gdl = 0 for i in range(sdof): if i == bcdof[idx_cc]: U[0, i] = bcval[idx_cc] idx_cc += 1 else: U[0, i] = u[idx_gdl] idx_gdl += 1 Ut = np.transpose(U) # Cálculo das reações de apoio reacao = np.dot(KK, Ut) # Determinação das frequências naturais e modos de vibração try: W, V = eigh(KK_cc, MM_cc) except np.linalg.LinAlgError: print("Sistema singular. Não é possível calcular as frequências naturais e modos de vibração.") return f = (np.real(W)) ** 0.5 / (2 * np.pi) # Impressão dos resultados print("\nDeslocamentos totais:") print(U) print("\nReações de apoio:") print(reacao) print("\nPrimeiras 6 frequências naturais:") for i in range(6): print('{:.3f} Hz'.format(f[i])) print("\nModos de vibração correspondentes:") print(np.real(V)) print("\nForças de reação nos nós com condições de contorno:") for i in range(len(bcdof)): node_index = bcdof[i] // ndof # Índice do nó associado ao grau de liberdade gdof = bcdof[i] % ndof # Grau de liberdade dentro do nó (0, 1, ou 2) print("Nó {}:".format(node_index)) print(" Força em x:", reacao[node_index * ndof]) # Força em x no nó print(" Força em y:", reacao[node_index * ndof + 1]) # Força em y no nó print(" Momento:", reacao[node_index * ndof + 2]) # Momento no nó if __name__ == "__main__": main()