Biblioteca de
Simulação em C++

In English

Download da biblioteca para Linux (6k): Dynamical Systems Simulation in C++
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 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&iacutesticas da classe principal ContinuousDynamicalSystem são:

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 Linux (6k): Dynamical Systems Simulation in C++
Download da biblioteca para DOS/Borland C++ 3.1 incluindo funções gráficas (79k): Dynamical Systems Simulation in C++