function LaufkatzeAni ()

% Parameter (global definiert, damit Wertaenderung nur an einer Stelle erforderlich):
global mK mL JL c lS Dt F0 a g
mK = 100 ; mL = 500 ; JL = 400 ; c = 200000 ; lS = 4 ; Dt = 1 ; F0 = 2000 ; a = 5 ; g = 9.81 ;

x0    = [0 ; 0 ; 0 ; 0] ;         % Anfangswerte
tspan = [0  10] ;                 % Zeitintervall

% Integration des Anfangswertproblems:
options = odeset('Mass' , @Massenmatrix , 'MaxStep' , 0.01) ; 
[t xv]  = ode45 (@RechteSeite , tspan , x0 , options) ;

% Grafische Ausgabe von x und phi, zunaechst "Sortieren der Ergebnisse":
x   = xv(:,1) ;  % xv ist die Matrix der Ergebnisse,
phi = xv(:,2) ;  % x und phi sind Vektoren 

scrsz = get(0,'ScreenSize');
figure('Position',[scrsz(3)/3 scrsz(4)/20 scrsz(3)/2 scrsz(4)*.9])

subplot(3,1,1) ; plot (t  , x)   , grid on , title  ('x(t)-Diagramm:')
subplot(3,1,2) ; plot (t  , phi) , grid on , title  ('\phi(t)-Diagramm:')

tt  = tspan(1) ;
xxx = [x(1)  x(1)+lS*sin(phi(1))] ;
yyy = [0       -lS*cos(phi(1))  ] ;
maxx = max(x) + lS ;
subplot(3,1,3) ; plot ([min(x)-lS maxx maxx a a maxx maxx] , ...
                       [0 0 lS/4 lS/4 -lS/4 -lS/4 0] , 'r-') ; hold on
p=plot (xxx,yyy,'o-','EraseMode','xor') ; 
axis ([min(x)-lS maxx -1.2*lS lS/3]) ;
axis equal;
axis ([-30 10 -6 3]) ;
zeit = title (sprintf('t = %8.2f s' , tt)) ;
set (gca , 'userdata' , zeit)

deltatt  = 1/25     ;    % 25 Bilder pro Sekunde
zeitlupe = 1        ;    % Verzögerungsfaktor
cstart   = cputime  ;
Zeitschritte = length (t) ;

for ii=1:Zeitschritte    % Schleife über alle berechneten Zeitschritte
   if (t(ii) >= tt)      % Ausgabe jeweils nur nach deltatt 
       xxx = [x(ii) x(ii)+lS*sin(phi(ii))] ;
       yyy = [0     -lS*cos(phi(ii))] ;
       set(p , 'XData' , xxx , 'YData' , yyy)
       while (cputime-cstart < tt*zeitlupe)  % Warteschleife
       end 
       zeit = get (gca , 'userdata');
       set(zeit , 'string' , sprintf('t = %8.2f s' , tt))
       drawnow
       tt = tt + deltatt ;
   end
end

% ============================================================
% Funktion, die die "Massenmatrix" des Dgl.-Systems definiert: 
function M = Massenmatrix (t , xv)

global mK mL JL c lS Dt F0 a g

phi = xv(2) ;

M   = [1  0       0                0        ; 
       0  1       0                0        ; 
       0  0     mK+mL        mL*lS*cos(phi) ; 
       0  0  mL*lS*cos(phi)    mL*lS^2+JL   ] ;

% ============================================================
% Funktion, die die "rechte Seite" des Dgl.-Systems definiert: 
function r = RechteSeite (t , xv)

global mK mL JL c lS Dt F0 a g

x = xv(1) ; phi = xv(2) ; v = xv(3) ; omega = xv(4) ;

if (t < Dt) Ft = F0 ;  else   Ft = 0  ;  end
if (x < a ) ct = 0  ;  else   ct = c  ;  end

b1 = mL*lS*omega^2*sin(phi)-ct*(x-a)+Ft ;
b2 = -mL*g*lS*sin(phi) ;

r = [v ; omega ; b1 ; b2] ;