% Historico de comandos da aula 2 com comentarios

%% 1 - Análise das soluções dos exercícios da primeira aula 
% (ver script solucoes_exercicios_1a_aula.m, o qual deve ser executado 
% separadamente usando a opção "Evaluate cell" do menu "Cell" do editor do
% matlab, ou a combinação de teclas CONTROL + ENTER)
edit solucoes_exercicios_1a_aula.m

% ver o help dos novos comandos usados nessas soluções
help plot
help subplot
help figure
help hold
help disp
help sprintf

%% 2 - Para ver como definir funções no matlab
close all
clear
home
% criar uma funçao para calcular a media e o desvio padrao de uma serie
% de dados experimentais (ver arquivo estatistica_versao1.m)
dados = rand( 100, 1 );
[ xm, sx ] = estatistica_versao1( dados )
% veja que essa funcao também serve para calcular os valores medios e os
% desvios padrões de cada uma das linhas de uma matriz:
dados = rand( 10000, 4 );
[ xm, sx ] = estatistica_versao1( dados )
% para mostrar que a função pode ser chamada apenas com parte dos
% argumentos de saída (apenas a primeira saída)
dados = rand( 10000, 4 );
[ xm, sx ] = estatistica_versao1( dados )
[ xm ] = estatistica_versao1( dados )

% mudança da função para apenas mostar os valores na tela quando nenhum
% argumento de saída for colocado (ver arquivo estatistica.m)
dados = rand( 10000, 4 );
estatistica( dados )
plot( estatistica(dados), '*' )

%% 3 - Para fazer o triangulo de Sierpinski 
% (ver na Wikipédia: pt.wikipedia.org/wiki/Sistemas_de_funções_iterativas )

% criar a função que calcula os pontos seguindo o sistema de equações
% sugerido (ver arquivo triangulo_versao1.m)
[ x, y ] = triangulo_versao1( 100 );
plot( x, y )
plot( x, y, '.' )

[ x, y ] = triangulo_versao1( 1e4 );
plot( x, y, '.' )

% para ver a relação entre o tempo de execução da função e o número de pontos gerados:
% Note que o tempo não cresce linearmente com o número de pontos gerados, o
% que indica que uma parte significativa do tempo está sendo usada para
% lidar com o redimensionamento dinâmico das variáveis x e y
tic, [ x, y ] = triangulo_versao1( 5e2 ); toc
tic, [ x, y ] = triangulo_versao1( 5e3 ); toc
tic, [ x, y ] = triangulo_versao1( 5e4 ); toc

% Para ver o tempo gasto com o redimensionamento das variáveis 
% (compare as funções triangulo_versao1.m e triangulo_versao2.m)
tic, [ x, y ] = triangulo_versao1( 5e4 ); toc
tic, [ x, y ] = triangulo_versao2( 5e4 ); toc

% Para ver o efeito de transiente (devido ao fato do primeiro ponto ser
% escolhido aleatóriamente) 
% Executar algumas vezes, até aparecer uma figura com pontos claramente fora 
% do triângulo fractal
[ x, y ] = triangulo_versao2( 1e4 );
figure, plot( x, y, '.' )

% para estudar o efeito do transiente (executar algumas vezes até ver um
% caso em que haja claramente alguns pontos fora do triângulo fractal)
[ x, y ] = triangulo_versao2( 1e4 );
figure, plot( x, y, '.' )
hold on
plot( x(1), y(1), 'or' )
plot( x(2), y(2), 'ok' )

% Uma possivel forma de remover o problema do transiente (desconsiderar os 
% primeiros 50 pontos):
% Executar diversas vezes para ver que não aparecem mais pontos que estão
% claramente fora do triângulo fractal
[ x, y ] = triangulo_versao2( 1e4 );
figure, plot( x(51:end), y(51:end), '.' )

% Uma forma mais adequada de evitar o transiente: usar um ponto inicial adequado
% (ver o arquivo triangulo_versao3.m)
[ x, y ] = triangulo_versao3( 5e5 );
figure, plot( x, y, '.' )
% para uma figura mais bonita (usar pontos menores):
figure, plot( x, y, '.', 'markersize', 1 )

% Para entender o efeito das três regras de formação dos pontos: mudar a
% função para permitir saber que regra foi usada para calcular cada um dos
% pontos (ver arquivo triangulo.m)
[ x, y, r ] = triangulo( 1e5 );
figure
hold on
plot( x(r==1), y(r==1), '.b', 'markersize', 1 )
plot( x(r==2), y(r==2), '.r', 'markersize', 1 )
plot( x(r==3), y(r==3), '.g', 'markersize', 1 )

% AVANÇADO: para saber quais os pontos gerados quando a regra 1 é aplicada
% duas vezes em seguida
[ x, y, r ] = triangulo( 1e5 );
figure, plot( x, y, '.', 'markersize', 1 )
hold on
ind11 = find( (r(1:end-1)==1) & (r(2:end)==1) ) + 1;
plot( x(ind11), y(ind11), '.k', 'markersize', 1 )
