function [p,fret] = dlinmin(funcnd,grfuncnd, p,xdir)
%
% Hleda minimum funkce N promennych v danem smeru.
% Pouziva Brentovu metodu s derivacemi
%
% Vstup:  
%    N-dim. funkce func    = func(vecP)
%    GRadient funkce func
%    bod P[1..N] 
%    N dimenzionalni smer XDIR[1..N].
% Vystup: 
%    bod P (minimum ve smeru XDIR),
%    FRET = funkcni hodnota v P  
%    
% Pouziva MNBRAK a DBRENT, 
%
    %% hodnota relativni presnosti pro BRENT.    
    tol = 1e-4;
    
    ax = 0.0;
    xx = 1.0;
    %% ohranic minimum funkce FUNC na primce  p + lambda * xdiri
    [ax,xx,bx,fa,fx,fb] = mnbrak({funcnd,p,xdir}, ax,xx);
    %% najdi minimum fce FUNC na primce p+x*xdir
    %%    Brentovou metodou s derivacemi
    [xmin, fret] = dbrent({funcnd,p,xdir},grfuncnd, ax,xx,bx,tol);
    %% presun se do minima
    xdir(:) = xmin*xdir(:);
    p(:)    = p(:)+xdir(:);

end
 
