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 (), Vetor de estados anterior
(
), 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 iterações utilizando o método
com o passo
e armazena o resultado no
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;