function lorenzdemo(xi,yi,zi, T, draw, varargin)
% lorenzdemo(x,y,z,T,draw) stellt die Loesung der Lorenz
% Differentialgleichung mit Anfangswert (x,y,z) auf dem 
% Zeitintervall [0,T] grafisch dar.
%
% Der Parameter "draw" bestimmt die Art der Darstellung:
% draw = i, i=1,2,3: Darstellung der i-ten Komponente der Loesung
%                    in Abhaengigkeit von der Zeit
% draw = 0         : Darstellung der Loesung als animierte Kurve
%
% Beispielaufruf fuer statische Kurve: 
% lorenzdemo(1, 1, 1, 50, 1)
%
% Beispielaufruf fuer Animation: 
% lorenzdemo(1, 1, 1, 500, 0)
%
% lorenzdemo(x,y,z,T,draw,S) erlaubt zusaetzlich die Angabe 
% des Darstellungsstils, analog zu "plot(X,Y,S)", vgl. "help plot"
%
% Beispielaufruf fuer statische Kurve in rot: 
% lorenzdemo(1, 1, 1, 50, 1, 'r')
%
% Matlab-Programm zum Buch
% 
%  Gewoehnliche Differentialgleichungen -- 
%  Eine Einfuehrung aus der Perspektive der dynamischen Systeme
%  Lars Gruene, Oliver Junge, Vieweg+Teubner 2009
%  www.dgl-buch.de
%
% (C) Lars Gruene, Oliver Junge 2008

if (nargin<5) | (nargin>6)
    fprintf('Fehler: lorenzdemo benoetigt 5 oder 6 Argumente,\n');
    fprintf('        siehe "help lorenzdemo"\n');
    return;
else if (nargin==5)
    color = 'k';
else color = varargin{1};
end

speed = 0.01;

[t,y] = ode45(@lorenz_f,[0 T], [xi yi zi]);

% Darstellung in Abhaengigkeit von t

if ((draw >=1) & (draw<=3))
    plot(t,y(:,draw),color);
    xlabel('t');
    ylabel('Loesung');
else
    plot3(0, 0, 0)
    axis([-20 20 -30 30 0 50])
    view(-110,-28)

    punkt = line( ...
            'color','r', ...
            'Marker','.', ...
            'markersize',25, ...
            'erase','xor', ...
            'xdata',[],'ydata',[],'zdata',[]);
    kurve = line( ...
            'color','b', ...
            'LineStyle','-', ...
            'erase','none', ...
            'xdata',[],'ydata',[],'zdata',[]);
    s = size(t);
    j  = 1;
    for i=1:T/speed;
      while (t(j)<speed*i)  
          if (j==s(1)) 
              break 
          end
          j=j+1;
      end
      j1 = max(1,j-300);
      set(punkt,'xdata',y(j:j,1),'ydata',y(j:j,2),'zdata',y(j:j,3))
      set(kurve,'xdata',y(j1:j,1),'ydata',y(j1:j,2),'zdata',y(j1:j,3))
      drawnow;
    end
    end
end

% Differentialgleichung des Lorens-Systems

function y = lorenz_f(t,x)

y = zeros(3,1);

y(1) = 10.*(x(2)-x(1));
y(2) = -x(1).*x(3)+28.*x(1)-x(2);
y(3) = x(1).*x(2)-(8/3).*x(3);

