O mapa de Hénon, proposto em 1976 pelo astrônomo francês Michel Hénon como um modelo para descrever a seção de Poincaré do sistema de Lorentz a tempo contínuo, é governado por três equações diferenciais ordinárias não lineares de primeira ordem.
x(t+1) = a - x(t)² + b.y(t) e y(t+1)=x(t).
onde a é o parâmetro de não-linearidade, b o parâmetro de dissipação do sistema, x(t) e y(t) são variáveis dinâmicas, e t = 0, 1, 2, ...., é o tempo discreto. É um dos exemplos mais estudados de sistemas dinâmicos pois, apesar de ser descrito por um conjunto de equações bastante simples, o mapa de Hénon apresenta uma dinâmica extremamente rica. Por exemplo, para os valores dos parâmetros a=1.4 e b=0.3, que foram os valores utilizados por M. Hénon em seu trabalho, o mapa apresenta um comportamento caótico. No entanto, para outros conjuntos de valores de parâmetros, o mapa de Hénon pode convergir para uma órbita periódica, caótica ou mesmo divergir.
Neste post, temos dois objetivos, o primeiro é o de apresentar o mapa de Hénon para três conjuntos de valores para os parâmetros a e b, conforme as figuras abaixo, e o segundo é o de apresentar a interação entre a linguagem de programação C/C++ com o aplicativo gnuplot, que juntos otimizam bastante as tarefas do pesquisador.
O código fonte em C gera o arquivo de dados de nome "mapa.txt" e o arquivo-script do gnuplot de nome "mapa.plt", e em seguida chama o script do gnuplot através da função system( ), e o resultado é o gráfico gerado em formato .jpeg no seu diretório corrente automáticamente.
Código fonte em C
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define a 1.4 // Parâmetros do Mapa de Hénon
#define b 0.3 // (a, b) = (1.2,0.2); (1.3,0.3) e (1.4,0.3)
#define T 1000 // Tempo total discreto
double x[T], y[T];
FILE *fp;
static char nome[]="mapa.txt";
void scrip_gnuplot(char str[20])
{
fp=fopen("mapa.plt", "w");
fprintf(fp, "reset\n");
fprintf(fp, "set title \"Mapa de Hénon para a=%.2f, b=%.2f \" \n", a, b);
fprintf(fp, "set xl \"Xt+1\" \n");
fprintf(fp, "set yl \"Yt+1\" \n");
fprintf(fp, "set term jpeg \n" );
fprintf(fp, "set output \"Mapa_Henon.jpg\" \n");
fprintf(fp, "plot \'%s\' u ($1):($2) t \'%s\' w p ls 7 lc 3 \n", str,str);
fprintf(fp, "set output; set term wxt\" \n");
fprintf(fp, "replot \n");
fprintf(fp, "pause -1 \"Continuar?\" ");
fclose(fp);
}
int main()
{
int t;
fp=fopen(nome,"w");
x[0]=1;
y[0]=1;
for(t=0;t<=T;t++)
{
x[t+1]=a-pow(x[t],2)+b*y[t];
y[t+1]=x[t];
fprintf(fp,"%lf %15lf \n",x[t+1],y[t+1]);
}
fclose(fp);
scrip_gnuplot(nome);
system("gnuplot mapa.plt");
return 0;
}
// --------------------------------------------------------------------
#include <stdlib.h>
#include <math.h>
#define a 1.4 // Parâmetros do Mapa de Hénon
#define b 0.3 // (a, b) = (1.2,0.2); (1.3,0.3) e (1.4,0.3)
#define T 1000 // Tempo total discreto
double x[T], y[T];
FILE *fp;
static char nome[]="mapa.txt";
void scrip_gnuplot(char str[20])
{
fp=fopen("mapa.plt", "w");
fprintf(fp, "reset\n");
fprintf(fp, "set title \"Mapa de Hénon para a=%.2f, b=%.2f \" \n", a, b);
fprintf(fp, "set xl \"Xt+1\" \n");
fprintf(fp, "set yl \"Yt+1\" \n");
fprintf(fp, "set term jpeg \n" );
fprintf(fp, "set output \"Mapa_Henon.jpg\" \n");
fprintf(fp, "plot \'%s\' u ($1):($2) t \'%s\' w p ls 7 lc 3 \n", str,str);
fprintf(fp, "set output; set term wxt\" \n");
fprintf(fp, "replot \n");
fprintf(fp, "pause -1 \"Continuar?\" ");
fclose(fp);
}
int main()
{
int t;
fp=fopen(nome,"w");
x[0]=1;
y[0]=1;
for(t=0;t<=T;t++)
{
x[t+1]=a-pow(x[t],2)+b*y[t];
y[t+1]=x[t];
fprintf(fp,"%lf %15lf \n",x[t+1],y[t+1]);
}
fclose(fp);
scrip_gnuplot(nome);
system("gnuplot mapa.plt");
return 0;
}
// --------------------------------------------------------------------
Mapa de Hénon
Nenhum comentário:
Postar um comentário