Biblioteca
de
Simulação em C++
In
English
Download da biblioteca para DOS/Borland C++ 3.1 incluindo funções
gráficas (79k): Dynamical Systems Simulation
in C++
Introdução
Esta bilioteca foi desenvolvida durante o meu curso de graduação
em
Engenharia Elétrica na Universidade
Federal de Minas Gerais. O objetivo é produzir uma ferramenta
de programação fácil e prática para a simulação
de Sistemas Dinâmicos representados no espaço de estados.
Dica: Para a
implementação DOS, juntamente com
as rotinas de cálculo numérico, existe também um conjunto
de classes projetadas para armazenar em disco e traçar gráficos
com os dados obtidos.
Filosofia
-
Um Sistema Dinâmico é qualquer parte do universo selecionada
para estudo e que evolui com o tempo.
-
Cada Sistema Dinâmico tem suas próprias entradas, saídas
e parâmetros.
-
O Sistema Dinâmico pode ser Linear ou Não Linear.
-
Seu comportamento temporal é completamente determinado pelo conjunto
de equações fornecidas na definição do Sistema
Dinâmico.
Características
Um dos objetivos deste projeto é classes implementadas de forma
amigável. O usuário deve fornecer o mínimo de informação
para iniciar a simulação.
As características da classe principal ContinuousDynamicalSystem
são:
-
A classe, na implementação para DOS/Borland C++ 3.1,
é um template, logo ela aceita vários tipos de dados. Você
pode especificar os tipos de dados float, double e long double.
-
No caso da implementação Linux, a precisão dos cálculos
é determinada pela definição da macro constante DSYSTEM_PRECISION
no arquivo cabeça;ho "dsystem.h".
-
A evolução temporal do sistema é computada via o algoritmo
Runge-Kutta de quarta ordem de passo fixo.
-
Não é necessário informar o número de entradas,
saídas, variáveis de estado e de parâmetros. Estas
informaçõoes são obtidas na construção
da classe derivada.
-
Todos os parâmetros do sistema são inicializados para 1.
-
Você pode utilizar outras classes presentes neste módulo.
As classes Vector, DiskManager e PlotManager. Com a classe Vector você
pode simplificar o intercâmbio de informações criando
objetos vetores. Com a classe DiskManager é possível armazenar
e recuperar dados do disco. Com a classe PlotManager é possível
representar graficamente os dados obtidos.
Como Usar
A maneira mais simples de utilizar esta biblioteca é usar as
macros pré-definidas listadas abaixo.
No seu arquivo cabeçalho(.H)
DECLARE_CONTINUOUS_DYNAMICAL_SYSTEM(Name)
END_DECLARATION
onde "Name" é o nome da classe derivada (o tipo particular de
Sistema Dinâmico como Inverted_pendulum, Lorenz,
etc).
Se você quer entradas no seu sistema, você deve escrever:
DECLARE_CONTINUOUS_DYNAMICAL_SYSTEM(Name)
DECLARE_INPUTS;
END_DECLARATION
Se você quer saídas:
DECLARE_CONTINUOUS_DYNAMICAL_SYSTEM(Name)
DECLARE_OUTPUTS;
END_DECLARATION
Se você quer entradas *e* saídas:
DECLARE_CONTINUOUS_DYNAMICAL_SYSTEM(Name)
DECLARE_INPUTS;
DECLARE_OUTPUTS;
END_DECLARATION
No seu arquivo de definição (.CPP,.CC etc)
Escreva as macros no escopo global do programa.
Defina o conjunto de equações diferenciais que determinam
o comportamento do sistema:
DEFINE_DIFFERENTIAL_EQUATION_SYSTEM(Name)
xdot[0] = p[0]*x[0] + x[1] + u[1];
xdot[1] = x[1] - p[1]*x[2]*u[0];
xdot[2] = x[0] - u[2];
END_DEFINITION
-
onde:
-
xdot[n] - variável de estado derivativa n.
-
x[n] - variável de estado n.
-
p[n] - parâmetro n.
-
u[n] - o sinal de entrada n.
Se você declarou entradas e/ou saídas, você deve
escrever (por exemplo):
DEFINE_INPUTS
u[0] = 5.0;
u[1] = t;
u[2] = sin(t) - sqrt(x[0]);
END_DEFINITION
DEFINE_OUTPUTS
y[0] = x[0];
y[1] = (x[2] - x[1])/p[0];
END_DEFINITION
No escopo da função MAIN e outras funções
Construa os objetos com o tipo de dado que você deseja:
Name system1,system2;
// na implementação Linux.
Name<float> system1,system2; // na implementação
para DOS/Borland C++ 3.1.
Forneça os parâmetros e o tempo de integração
(para o algoritmo Runge-Kutta de quarta ordem).
system1.SetParameter(0, 1.34);
system1.SetParameter(1, 1.5);
system1.SetTimeStep(0.001);
system2.SetParameter(0, 2.4);
system2.SetParameter(1, 5.2);
system2.SetTimeStep(0.01);
Agora já é possível calcular os próximos
estados do(s) sistema(s):
system1.Evolve(); // vai para o tempo t = (atual) + time_step.
system1.Evolve(tf); // vai para o tempo tf por passos de magnitude
time_step.
system1.Evolve(tf,dt); // vai para o tempo tf por passos dt.
Leia a informação que você precisa:
estado = system1.GetStateVar(0);
saida = system1.Output(1);
t = system1.GetTime();
Palavras Finais
Veja o exemplo para maiores detalhes (arquivos example.cpp e example.h).
Por favor, qualquer sugestão, envie um e-mail. Eu realmente
gostaria da sua opinião.
E-mail: torres@cpdee.ufmg.br
Download da biblioteca para DOS/Borland C++ 3.1 incluindo funções
gráficas (79k): Dynamical Systems Simulation
in C++