%  uma_especie.m
%
%  Modelo simples de uma população (uma espécie)  
%
% O programa resolve um modelo de dinâmico de uma população. 
% Os resultados são apresentados num gráfico onde é arepresentada a evolução da 
% espécie ao longo do tempo. Os resultados numéricos são exibidos depois da
% simulação na janela de comandos MATLAB se a tecla 'd' for primida.


p=0;                         
%
%Definição do modelo
%
disp(' ')
disp('Introduza a fórmula que define o modelo,usando a notação "p"')
disp('para o tamanho da espécie: (Exemplo: next_p = p+.2*p*(1-p/10))')
next_p=input ('next_p = ','s');
%
p=eval(next_p);               % test formula
% 
disp(' ')
disp('Introduza os limites para "p" que serão usados na construção do gráfico:'); 
disp('(por defeito é considerado [pmin pmax] = [0 20]) ');
limits=input('[pmin pmax] = ');
if isempty(limits) limits=[0 20]; end;
% 
disp(' ')
disp('Introduza o número de passos temporais: (por defeito é considerado n=20)');
n=input('n= ');
if isempty(n) n=20; end;
%
disp(' ')
disp('Prima qualquer tecla para iniciar.')
disp('Posicione o cursor no gráfico para escolher o valor inicial e')
disp('clique no botão da esquerda do rato.')
disp('Prima a tecla `d'' para obter os resultados numéricos na janela de comandos.')
disp('Prima qualquer tecla para finalizar.')
disp('  ')
pause
%
figure;                         % inicia uma nova figura
axis([ [0 n] limits]); grid on;    
xlabel('tempo');ylabel('população');
title(['next\_p=',next_p]); 
hold on;
%
times=[0:n];                    % gera o vector tempo    
% 
newcontinue=1;
while newcontinue               % ciclo até que o botão da esquerda seja primido
   [t,p,button]=ginput(1);      % capta o valor inicial da população  
   if button==1
      pops=p;
      for i=1:n                 % gera o vector com o tamanho da população
         p=eval(next_p);
         pops=[pops,p];
      end
      plot(times,pops);         % gráfico tempo versus população
   else 
      newcontinue=0;            % termina o ciclo
      if button==100
         disp('    tempo   população')
         disp([times;pops]')         % exibe os resultados numéricos na janela de comandos
         newcontinue=1;  		% inicia o ciclo
                                % se `d' for primida
      end
   end
end
%
hold off
