next up previous
Next: Log Up: Apêndice - Detalhes da Previous: Apêndice - Detalhes da

Modelo e Parte Numérica

Este parte foi feita de forma independente da parte gráfica, aqui estão reunidas todas funções relativas aos métodos númericos e o modelo aeronáutico que esta sendo utilizado, todas as modificações relativas a estes itens só precisam ser modificadas aqui.


// Número de variáveis do vetor de estados

#define NVARS 9


// posições das váriaveis no vetor

#define _X_ 0
#define _Y_ 1
#define _H_ 2
#define _V_ 3
#define _GAMA_ 4
#define _PSI_ 5
#define _FTM_ 6
#define _FNM_ 7
#define _SIGMA_ 8


// Número de métodos de integração implementados

#define NUM_METODOS 5

typedef enum {
MET_EULER1,
MET_EULER2,
MET_RK4,
MET_RKF,
MET_ADAMS
} METODO;


// Todos os métodos númericos que foram implementados devem seguir esta forma de chamada de função

// (Vetor de estados seguinte ($y_{n+1}$), Vetor de estados anterior ($y_{n}$), passo de integração):

typedef void (* met_funcptr)(float *ynovo, float *yant, float passo);


// Váriaveis globais que contém funções dos metodos e seus respectivos nomes

met_funcptr func_metodos[NUM_METODOS];
const char *nome_metodos[NUM_METODOS];


// Funções básicas de manipulação de vetores.

float maior(float *a);
void somavetor(float *a, float *b, float *c);
void copiavetor(float *dest, float *src);
void imprimevetor(float *a);

// Esta função realiza o cálculo de $'n'$ iterações utilizando o método $'metodo'$ com o passo $'passo'$ e armazena o resultado no $'log'$
void calcula(Log *log, METODO metodo, long n, float passo);

Funções dos métodos de integração:

// EULER 1a ordem

void euler (float *ynovo, float *yant, float passo);

// EULER Preditor-Corretor

void euler2 (float *ynovo, float *yant, float passo);

// Runge-Kutta 4a ordem

void rk4 (float *ynovo, float *yant, float passo);

// Runge-Kutta 5a ordem

void rk_fehlberg (float *ynovo, float *yant, float passo);

// Adams Moulton, método de passos multiplos

void adams_moulton (float *ynovo, float *yant, float passo);


// Este método deve ser chamado 4 vezes antes de utilizar o método de adams, pois este necessita que pelos 4 iterações já estejam calculadas, estas iterações são guardadas em um vetor global (static).

void adams_moulton_init(met_funcptr func, float *ynovo, float *yant, float passo);


// Aplica a função relativa ao modelo aeronáutico que esta sendo utilizado

void aplica_funcao (float *y, float *f)

f[_X_] = y[_V_] * cos(y[_GAMA_]) * cos(y[_PSI_]);
f[_Y_] = y[_V_] * cos(y[_GAMA_]) * sin(y[_PSI_]);
f[_H_] = y[_V_] * sin(y[_GAMA_]);
f[_V_] = y[_FTM_] - g*sin(y[_GAMA_]);
f[_GAMA_] = ( y[_FNM_]*cos(y[_SIGMA_]) - g*cos(y[_GAMA_]) ) * (1/y[_V_]);
f[_PSI_] = ( y[_FNM_]*sin(y[_SIGMA_])/cos(y[_GAMA_]) )* (1/y[_V_]);
f[_FTM_] = 0;
f[_FNM_] = 0;
f[_SIGMA_] = 0;


next up previous
Next: Log Up: Apêndice - Detalhes da Previous: Apêndice - Detalhes da
Julian Geraldes Monteiro 2000-12-20