


    function [x,y,nfun]=adrk45(ffun,a,b,h0,y0,tol);
    % Runge-Kutta med adaptiv steglängdskontroll
    % Indata:
    % ffun funktionen som definierar högerledet i y'=f(x,y)
    %      OBS att y ocg f är vektorer
    % a    startpunkt för integrationen
    % b    slutpunkt för integrationen
    % h0   initial steglängd
    % y0   vektor av begynnelsevärden
    % tol  tolerans för steglängdskontroll
    % Utdata:
    % x    vektor av x-värden där lösningen beräknats
    % y    matris av funktionsvärden
    % nfun antal funktionsevalueringar
    %
    i=0; nfun=0;
    h=h0; xx=a+h; x0=a; y(:,1)=zeros(size(y0));
    while xx<b,
      [yh,rt]=rk45(ffun,x0,y0,h);   % RK45 med steg h
      nfun=nfun+6;  
      if rt<tol*h/(b-a),   % Acceptera detta steg
        i=i+1;
        y(:,i)=yh;
        x(i)=xx;
        if rt<0.05*tol*h/(b-a),   % försök med längre steg nästa gång
          h=2*h;
        end
        x0=xx; y0=yh; xx=xx+h; 
      else
        h=h/2; xx=x0+h;            % Försök med kortare steg
      end
    end
    i=i+1;
    h=b-x(i-1);                    % Sista steget
    y(:,i)=rk(ffun,x0,y0,h);
    x(i)=b;
    nfun=nfun+6;
    
    
