Equilibrio.py
[codesyntax lang=”python”]
# -*- coding: utf-8 -*-
"""
Data: 21/11/2016
@Autor: Prof. Emílio G. F. Mercuri D.Sc.
Departamento de Engenharia Ambiental (DEA)
Disciplina: TEA008 - Mecanica dos Solidos II
Curso: Engenharia Ambiental UFPR
Trabalho: Dinâmica de Vibração de Árvores
Programa que resolve a equação de equilíbrio
Referência: Murphy, K. D., & Rudnicki, M. (2012).
A physics-based link model for tree vibrations.
American journal of botany, 99(12), 1918-1929.
"""
print("""
Trabalho: Dinamica de Vibracao de Arvores
Programa que resolve a equacao de equilibrio
""")
# Importação das Bibliotecas e Funções
import numpy as np
from scipy import optimize
from scipy import linalg
from scipy.optimize import fmin
from scipy.optimize import fsolve
# Definição das variáveis
# Versão atual: caso simétrico (1 tronco e 2 ramos)
grav = 9.81 # m/s2
L = 6.1 # m
m = 43.8 # kg
K = 162.7*10**3 # N.m
h1 = 4.3 # m
h2 = 4.3 # m
theta1 = np.pi/4 # rad
theta2 = - np.pi/4 # rad
L1 = 3.7 # m
L2 = 3.7 # m
m1 = 14.6 # m
m2 = 14.6 # m
K1 = 8.8*10**3 # N.m
K2 = 8.8*10**3 # N.m
# Definição das funções da Matriz M
def P1(x):
return m*(L**2)/3 + m1*h1*(0.5*L1*np.cos(x[1])*np.cos(theta1)+h1-0.5*L1*np.sin(x[1])*np.sin(theta1)) + m2*h2*(0.5*L2*np.cos(x[2])*np.cos(theta2)+h2-0.5*L2*np.sin(x[2])*np.sin(theta2))
def P21(x):
return m1*h1*0.5*L1*(np.cos(theta1)*np.cos(x[1])-np.sin(theta1)*np.sin(x[1]))
def P22(x):
return m2*h2*0.5*L2*(np.cos(theta2)*np.cos(x[2])-np.sin(theta2)*np.sin(x[2]))
def Q11(x):
return m1*((0.5*L1)**2)*np.sin(theta1+x[1])*(np.cos(x[1])*np.sin(theta1)+np.sin(x[1])*np.cos(theta1)) + m1*0.5*L1*np.sin(0.5*np.pi-theta1-x[1])*(h1+0.5*L1*np.cos(x[1])*np.cos(theta1)-0.5*L1*np.sin(x[1])*np.sin(theta1)) + (1/12)*m1*(L1)**2
def Q12(x):
return m2*((0.5*L2)**2)*np.sin(theta2+x[2])*(np.cos(x[2])*np.sin(theta2)+np.sin(x[2])*np.cos(theta2)) + m2*0.5*L2*np.sin(0.5*np.pi-theta2-x[2])*(h2+0.5*L2*np.cos(x[2])*np.cos(theta2)-0.5*L2*np.sin(x[2])*np.sin(theta2)) + (1/12)*m2*(L2)**2
def Q21(x):
return m1*((0.5*L1)**2)*np.sin(theta1+x[1])*(np.cos(x[1])*np.sin(theta1)+np.sin(x[1])*np.cos(theta1)) + m1*((0.5*L1)**2)*np.sin(0.5*np.pi-theta1-x[1])*(np.cos(x[1])*np.cos(theta1)-np.sin(x[1])*np.sin(theta1)) + (1/12)*m1*(L1)**2
def Q22(x):
return m2*((0.5*L2)**2)*np.sin(theta2+x[2])*(np.cos(x[2])*np.sin(theta2)+np.sin(x[2])*np.cos(theta2)) + m2*((0.5*L2)**2)*np.sin(0.5*np.pi-theta2-x[2])*(np.cos(x[2])*np.cos(theta2)-np.sin(x[2])*np.sin(theta2)) + (1/12)*m2*(L2)**2
# Montagem da matrix M
def M(x):
return np.matrix([[P1(x) , P21(x), P22(x)],
[Q11(x), Q21(x), 0],
[Q12(x), 0 , Q22(x)]])
x = np.zeros(3)
#print(M(x))
# Definição das componentes do vetor g(x)
def g1(x):
return K*x[0] - K1*x[1] - K2*x[2] - m*grav*0.5*L*np.sin(x[0]) - (h1*m1*grav*np.sin(x[0])+h2*m2*grav*np.sin(x[0]))
def g2(x):
return K1*x[1] -m1*grav*0.5*L1*np.sin(theta1+x[1])*np.cos(x[0]) - m1*grav*0.5*L1*np.sin(0.5*np.pi-theta1-x[1])*np.sin(x[0])
def g3(x):
return K2*x[2] -m2*grav*0.5*L2*np.sin(theta2+x[2])*np.cos(x[0]) - m2*grav*0.5*L2*np.sin(0.5*np.pi-theta2-x[2])*np.sin(x[0])
def g(x):
return np.array([[g1(x)],[g2(x)],[g3(x)]])
#print(g(x))
# Cálculo da inversa M-1(x)
#print(linalg.inv(M(x)))
# Cálculo do vetor f (como um vetor coluna 1x3)
def f(x):
return linalg.inv(M(x)).dot(g(x))
#print(f(x))
# Cálculo do vetor f (como um vetor linha)
def func(x):
out = [linalg.inv(M(x)).dot(g(x))[0][0]]
out.append(linalg.inv(M(x)).dot(g(x))[1][0])
out.append(linalg.inv(M(x)).dot(g(x))[2][0])
return out
#print(func(x))
# Chute inicial para resolução do sistema de equações não linear
x0 = [0.0, 0.7, 0.1]
# Resolução da eq. do equilíbrio com a função fsolve (scipy)
solucao = fsolve(func, x0)
# imprime a solução em radianos
print("Solução do equilibrio em radianos:")
print(solucao)
#Convertendo a solução de radianos para graus:
thetachapeu0 = solucao[0]*180/np.pi
thetachapeu1 = solucao[1]*180/np.pi
thetachapeu2 = solucao[2]*180/np.pi
# imprime a solução em radianos
print("")
print("Solução do equilibrio em graus:")
print("")
print("Theta chapeu tronco: %.4f graus" % thetachapeu0)
print("Theta chapeu ramo 1: %.4f graus" % thetachapeu1)
print("Theta chapeu ramo 2: %.4f graus" % thetachapeu2)
[/codesyntax]