fugoide.py
[codesyntax lang=”python”]
# Script para fazer o grafico da trajetoria de vôo considerando o movimento fugóide
import numpy
from matplotlib import pyplot
numpy.seterr(all=’ignore’)
”’
veja http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html para explicacao.
esse comando ignora possíveis erros/warnings no calculo do raio de curvatura
”’
def raio_de_curvatura(z, zt, C):
“””Retorna o raio de curvatura de uma trajetória de vôo em qualquer ponto.
Parâmetros
———
z : float
posição atual abaixo da linha de referência horizontal (altura negativa)
zt : float
posição na qual se tem a velocidade do trim (altura do trim)
C : float
constante de integração
Retorna
——-
raio_de_curvatura : float
raio de curvatura da trajetoria
“””
return zt / (1/3 – C/2*(zt/z)**1.5)
def rotacao(x, z, xCentro, zCentro, angulo):
“””Retorna a nova posição (x,z) da trajetória
Parâmetros
———
x : float
coordenada x da trajetória no instante anterior
z : float
coordenada z da trajetória no instante anterior
xCentro : float
coordenada x do centro de rotação
zCentro : float
coordenada z do centro de rotação
angulo : float
anglulo de rotação
Retorna
——-
xCentro + xNovo : float
nova coordenada x da trajetória
zCentro + yNovo : float
nova coordenada z da trajetória
“””
dx = x – xCentro
dz = z – zCentro
# a seguinte formula considera a aplicação do tensor rotação para obter as novas coordenadas
# além disso, considera a orientação dos eixos x e z (z aponta para baixo)
xNovo = dx*numpy.cos(angulo) + dz*numpy.sin(angulo)
zNovo = -dx*numpy.sin(angulo) + dz*numpy.cos(angulo)
return xCentro + xNovo, zCentro + zNovo
def plota_trajetoria_voo(zt, z0, theta0):
“””Plota a trajetória do vôo.
Parâmetros
———
zt : float
altura do trim do planador.
z0 : float
altura inicial do planador.
theta0 : float
orientação inicial do planador.
Returns
——-
Nada : Nada
“””
# arrays para armazenar as coordenadas da trajetoria do aviao
N = 3000
z = numpy.zeros(N)
x = numpy.zeros(N)
# set initial conditions
z[0] = z0
x[0] = 0.
theta = theta0
# calcula a constante C
C = (numpy.cos(theta) – 1/3*z[0]/zt)*(z[0]/zt)**.5
# distância incremental ao longo da trajetória
ds = 1
#obtém as coordenadas da curva
for i in range(1,N):
# sinal de menos na segunda coordenada pois o z aponta para baixo
normal = numpy.array([numpy.cos(theta+numpy.pi/2.), -numpy.sin(theta+numpy.pi/2.)])
R = raio_de_curvatura(z[i-1], zt, C)
centro = numpy.array([x[i-1]+normal[0]*R, z[i-1]+normal[1]*R])
dtheta = ds/R
x[i], z[i] = rotacao(x[i-1], z[i-1], centro[0], centro[1], dtheta)
theta = theta + dtheta
# gera o gráfico
pyplot.figure(figsize=(10,6))
pyplot.plot(x, -z, color = ‘k’, ls=’-‘, lw=2.0, label=”$z_t=\ %.1f,\\,z_0=\ %.1f,\\,\\theta_0=\ %.2f$” % (zt, z[0], theta0))
pyplot.axis(‘equal’)
pyplot.title(“Trajetoria do voo para $C$ = %.3f” % C, fontsize=18)
pyplot.xlabel(“$x$”, fontsize=18)
pyplot.ylabel(“$z$”, fontsize=18)
pyplot.legend()
pyplot.show()
# Final do arquivo
[/codesyntax]