% Verfahren von Heun fuer Stab-Pendel mit großen Ausschlaegen:

phip   = inline ('omega','omega') ;
omegap = inline ('-faktor*sin(phi)','t','phi','omega','faktor') ;

pl     = 1 ; g = 9.81 ;                        % Pendellaenge, Erdbeschleunigung
faktor = 1.5*g/pl ;

t0 = 0 ; phi0 = pi/2 ; omega0 = 0 ;   % Anfangswerte
tEnd = 10   ;                          % Ende des Integrationsintervalls
n    = 1000 ;                          % Anzahl der Integrationsschritte
dt   = (tEnd - t0) / n ;

t = t0 : dt : tEnd    ;
phi   = zeros (n+1,1) ;
omega = zeros (n+1,1) ;

% Heun-Algorithmus --------------------------------------------------------- 
phi(1) = phi0 ; omega(1) = omega0 ;

for i=1:n
    phipi = phip   (omega(i)) ;
    ompi  = omegap (t(i),phi(i),omega(i),faktor) ;
    % * Prädiktorschritt nach Euler-Cauchy: ********************************
    prphi = phi  (i) + dt * phipi ;
    prom  = omega(i) + dt * ompi  ;
    for j=1:3   % * Drei Korrektorschritte: ********************************
        prphi = phi  (i) + (phipi + phip(prom))*dt/2 ;
        prom  = omega(i) + (ompi  + omegap(t(i+1),prphi,prom,faktor))*dt/2 ;
    end
    phi  (i+1) = prphi ;           % ... die endgueltigen Werte des Schritts
    omega(i+1) = prom  ;
end
% Heun-Algorithmus ---------------------------------------------------------

% Erweiterte Auswertung, Verifizieren der Ergebnisse:
Tges = - g/2*cos(phi) + pl*omega.^2/6 ;   % Kontrollfunktion "Gesamtenergie"

[phimin , imin] = min(phi) ; 
disp (['Anzahl der Zeitschritte n = ' , num2str(n)]) ;
disp (['phi_0     =  ' , num2str(phi0)])   ; 
disp (['phi_min   = ' , num2str(phimin) , ' bei t = ' , num2str(t(imin))]) ;
disp (['omega_max =  ' , num2str(max(abs(omega)))])   ; 
subplot (2,1,1) ; plot (t , phi)  , title ('\phi(t)') ;    
subplot (2,1,2) ; plot (t , Tges) , title ('T_{ges}(t)') ;      