function Aufg28_5Ev (myin , my0in)

global m c my a g r myq
m = 20 ; c = 300 ; a = 0.5 ; g = 9.81 ; 

if nargin > 0  my  = myin  ;  else  my  = 0.4 ;  end
if nargin > 1  my0 = my0in ;  else  my0 = my  ;  end
tend = 10 ;

x0    = [2*a ; 0] ;          % Anfangswerte
tspan = [0 tend]    ;        % Zeitintervall

if x0(1) > 0    r = -1 ; else   r = 1 ; end
if x0(1) > a  myq = my ; else myq = 0 ; end

% Integration des Anfangswertproblems:
options = odeset ('MaxStep' , 0.1 , 'Events' , @Ereignis) ; 

tout  = [] ;  % Auf tout und xvout werden die Ergebnisse gesammelt
xvout = [] ;
cont = 1 ;

while cont == 1
  [t xv te xve ereig]  = ode45 (@RechteSeite , tspan , x0 , options) ;
  tout  = [tout  ; t]  ;  % Die gerade abgelieferten Ergebnisse werden an ...
  xvout = [xvout ; xv] ;  % ... die bereits gespeicherten Ergebnisse angehaengt
  
  lent  = length (t) ;
  if (t(lent) >= tend)
      cont = 0 ;          % Ende erreicht, Abbruch der while-Schleife
  else                    % ... war ein "Ereignis" der Grund fuer den Abbruch
      telen = length (te) ; 
      tspan = [te(telen) tend] ;             % ... weiter mit "Restintervall ...
      x0    = [xve(telen,1) xve(telen,2)] ;  % ... und neuen Anfangsbedingungen
      if ereig(telen) == 1                   % Ereignis "Geschwindigkeit Null"
          if abs(c*xve(telen,1)) < my0*m*g ...
             & xve(telen,1) > a              % Federkraft kleiner Haftkraft, ...
              cont = 0 ;                     % ... also Abbruch
              tout  = [tout  ; tend]  ;
              xvout = [xvout ; [xv(lent,1) 0]] ;
          elseif xve(telen,1) < 0  r=1 ;     % Es geht nach rechts weiter ...
          else  r=-1 ;                       % ... bzw. nach links
          end
      elseif ereig(telen) == 2  myq=my ;     % Ereignis "Ab sofort Reibung"
      elseif ereig(telen) == 3  myq=0  ;     % Ereignis "Ab sofort reibungsfrei" 
      end
  end
end

% Grafische Ausgabe, zunaechst "Sortieren der Ergebnisse":
x = xvout(:,1) ;  % xvout' ist die transponierte Matrix der Ergebnisse,
v = xvout(:,2) ;  

subplot(2,1,1) ; plot (tout , x) , grid on , title  ('x-t-Diagramm:')
subplot(2,1,2) ; plot (tout , v) , grid on , title  ('v-t-Diagramm:')

End_x = x(end)
End_v = v(end)

% ===================================================================
function [value,isterminal,direction] = Ereignis (t,xv)
global m c my a g r myq

x = xv(1) ;
v = xv(2) ;

value(1)      =  v  ; % Ereignis 1: "Geschwindigkeit Null"
isterminal(1) =  1  ; % Abbruch ...
direction(1)  =  0  ; % ... in jedem Fall

value(2)      = x-a ; % Ereignis 2: "Punkt x=a erreicht"
isterminal(2) =  1  ; % Abbruch, ...
direction(2)  =  1  ; % ... wenn Bewegung nach rechts

value(3)      = x-a ; % Ereignis 3: "Punkt x=a erreicht"
isterminal(3) =  1  ; % Abbruch ...
direction(3)  = -1  ; % ... wenn Bewegung nach links

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

% Input: Aktueller Zeitpunkt t und die Werte fuer Weg x und 
% Geschwindigkeit v zu diesem Zeitpunkt im Vektor  xv = [x ; v]

% Output: xPunkt und vPunkt im Vektor  f = [xPunkt ; vPunkt] 

global m c my a g r myq

x = xv(1) ;
v = xv(2) ;

xPunkt = v ;
vPunkt = - c*x/m - r*myq*g ;

f = [xPunkt ; vPunkt] ;