function Laufkatze ()

% 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  7] ;                 % Zeitintervall

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

% Grafische Ausgabe von x und phi, zunaechst "Sortieren der Ergebnisse":
xx  = [1 0 0 0] * x' ;  % x' ist die transponierte Matrix der Ergebnisse,
phi = [0 1 0 0] * x' ;  % 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  , xx)  , grid on , title  ('x-t-Diagramm:')
subplot(3,1,2) ; plot (t  , phi) , grid on , title  ('phi-t-Diagramm:')

tt = tspan(1) ;
xxx = [xx(1)  xx(1)+lS*sin(phi(1))] ;
yyy = [0     -lS*cos(phi(1))] ;
maxx = max(xx) + lS ;
subplot(3,1,3) ; plot ([min(xx)-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(xx)-lS maxx -1.2*lS lS/3]) ;
axis equal;
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 = [xx(ii) xx(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 , x)

global mK mL JL c lS Dt F0 a g

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

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

global mK mL JL c lS Dt F0 a g

if t < Dt
    Ft = F0 ;
else
    Ft = 0  ;
end

if x(1) < a
    ct = 0 ;
else
    ct = c ;
end

f = [x(3) ; x(4) ; mL*lS*x(4)^2*sin(x(2))-ct*(x(1)-a)+Ft ; -mL*g*lS*sin(x(2))] ;
