quinta-feira, 26 de fevereiro de 2015

Caos em Sistemas dinâmicos: Diagrama de Bifurgação do Mapa Logístico


Edward Lorenz, em 1963, estudando a previsão do tempo por um modelo dinâmico definido por poucas e simples equações diferenciais, fez uma descoberta que surpreendeu o mundo. Seu modelo seguia um padrão, que não se encaixava nas categorias possíveis de sistemas dinâmicos da época, exibindo um comportamento bastante complexo. Sistemas como o de Lorenz são denominados “caótico-determinísticos” ou seja, embora apresentem um comportamento aperiódico e imprevisível, a sua dinâmica é governada por equações diferenciais ou equações diferenças determinísticas simples.

Um bom exemplo de um sistema que pode gerar padrões complexos apesar de ter uma representação simples é o chamado mapa logístico, considerado como sistema dinâmico exemplar, por sua importância histórica e por sua natureza didática, e que não é mais do que um sistema unidimensional definido por,

x(n+1)=μ.x(n).[1-x(n)],

onde à medida que se vai mudando o valor da constante μ, também se vai mudando o comportamento do sistema. A seguir vamos analisar alguns casos, para diferentes valores de μ, dada a condição inicial Xo=0.55, sendo os espaços de fase apresentados, aqueles que fazem corresponder x(n+1) a x(n).

Nesta postagem, o nosso objetivo, além de apresentar este importante tema da Física, é o de fornecer exemplos da interatividade entre as linguagem de programação C/C++ e o aplicativo gnuplot, que juntos minimizam as tarefas de uma pesquisa. 


Informações sobre o Código Fonte em C/C++ para gerar o mapa logístico

O código fonte em C/C++ gera o arquivo de dados de nome "mapa_logistico.txt" e o arquivo-script do gnuplot de nome "mapa_logistico.plt", e em seguida chama o script do gnuplot através da função system( ), e o resultado é o gráfico gerado em formato .jpg no seu diretório corrente.

/*  MAPA LOGISTICO */

#include <stdio.h>
#include <stdlib.h>

FILE *fp;

static char nome[]="mapa_logistico.txt";

void scrip_gnuplot(char str[25], float m)
{
    fp=fopen("mapa_logistico.plt", "w");
   
    fprintf(fp, "reset\n");
    fprintf(fp, "set title \"Mapa Logístico para mi=%.2f\" \n", m);
    fprintf(fp, "set xlabel \"Numero de Iteracoes (N)\" \n");
    fprintf(fp, "set ylabel \"Valor das Iteracoes (X)\" \n");
    fprintf(fp, "set term jpeg \n" );
    fprintf(fp, "set output \"Mapa_Logistico.jpg\" \n");
    fprintf(fp, "plot \'%s\' t \"mapa x versus n\" w lp ls 7 lc 3 lw 2\n", str);
    fprintf(fp, "set output; set term wxt\" \n");
    fprintf(fp, "replot \n");
    fprintf(fp, "pause -1 \"Continuar?\" ");
    fclose(fp);
}

int main(void)
{
int k;
float n, mi;
double x;

    fp=fopen(nome,"w");
    // definindo os valores iniciais de mi, x e n
    mi = 4.0;  
    x = 0.8;
    n = 1.0;
    for(k=1; k<=100; k++)
    {
        n=n+1.0;
        x = mi*x*(1.0-x);
        fprintf(fp,"%.1f \t %lf\n", n, x);
    }
    fclose(fp);

    scrip_gnuplot(nome, mi);
   
    system("gnuplot mapa_logistico.plt");
    return 0;
}

RESULTADOS OBTIDOS

Parte (I): Iteração do mapa logístico com o código fonte acima no intuito de observar o atrator para diferentes valores de μ

 
 
 
 

Informações do Código Fonte em C/C++ para gerar o diagrama de bifurgação para o mapa logístico

Este código fonte em C/C++ gera o arquivo de dados de nome "diagrama.txt" e o arquivo-script do gnuplot de nome "diagrama.plt", e em seguida chama o script do gnuplot através da função system( ), e o resultado é o gráfico gerado em formato .jpg no seu diretório corrente.


/*  DIAGRAMA DE BIFURGAÇÃO DO MAPA LOGISTICO */

#include <stdio.h>
#include <stdlib.h>

FILE *fp;
static char nome[]="diagrama.txt";
void scrip_gnuplot(char str[25])
{
    fp=fopen("diagrama.plt", "w");
   
    fprintf(fp, "reset\n");
    fprintf(fp, "set samples 500\n");
    fprintf(fp, "set xr[1.9:4.1]\n");
    fprintf(fp, "set yr[0:1.1]\n");
    fprintf(fp, "set title \"Diagrama do Mapa Logistico\" \n");
    fprintf(fp, "set xlabel \"Coeficiente mi\" \n");
    fprintf(fp, "set ylabel \"Atrator X\" \n");
    fprintf(fp, "set term jpeg \n" );
    fprintf(fp, "set output \"Diagrama.jpg\" \n");
    fprintf(fp, "plot \'%s\' notitle w p ls 1 lw 0\n", str);
    fprintf(fp, "set output; set term wxt\" \n");
    fprintf(fp, "replot \n");
    fprintf(fp, "pause -1 \"Continuar?\" ");
    fclose(fp);
}

int main(void)
{
int k, n;
float mi;
double x;

    fp=fopen(nome,"w");
    // definindo o valoar inicial de mi
    mi =  2.0;
    for(k=1; k<=500; k++)
    {
        mi = mi + 0.004;
        x = 0.8;
        for(n=1; n<=1000; n++)
        {
            x = mi*x*(1-x);
            if (n>500)
            {
                fprintf(fp,"%f \t %lf\n", mi, x);
            }
        }
    }   
    fclose(fp);
    scrip_gnuplot(nome);
    system("gnuplot diagrama.plt");
    return 0;
}
Parte (II):  Construção do diagrama do mapa logístico a partir do código acima para observar a rota de duplicação de período.

Neste diagrama estão representados apenas os pontos referentes aos atratores dos mapas logísticos, para diferentes valores de μ. Não estão representados os pontos do transiente!
Vemos que o atrator foi ficando cada vez mais complicado: para os valores de μ entre 2,0 e aproximadamente 2,9 é do tipo ponto fixo, na primeira bifurcação, acima de 3,0, é duplo ciclo até aproximadamente 3,4, onde já passam a ser 4 pontos de repetição, depois 8 e assim por diante... A cada bifurcação ocorre uma duplicação de período até o sistema entrar em regime caótico. Por isso essa rota para o Caos ficou conhecida como rota de duplicação de período.

Para maiores informações sobre a teoria dos caos, o link a seguir é uma ótima fonte de pesquisa: http://www.geocities.ws/projeto_caos_ufg/



Um comentário:

  1. Parabéns pelo trabalho, procurei muito alguma referencia que ilustrasse com algum exemplo real a interação da linguagem C e o gnuplot.
    Me ajudou enormemente.

    ResponderExcluir