quarta-feira, 25 de fevereiro de 2015

Interação entre a Linguagem C e o Aplicativo gnuplot: O Mapa de Hénon

         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.

         O mapa de Hénon é definido pelo seguinte conjunto de equações:



                       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;
}
// --------------------------------------------------------------------

Mapa de Hénon




Nenhum comentário:

Postar um comentário