clear




function s = f(x)
    s = exp(-cos(x)) + x - 1 
endfunction

function s = fp(x)
    s = sin(x).*exp(-cos(x)) + 1
endfunction


function s = g(x)
    s = x - f(x)/fp(a)
endfunction

function s = gp(x)
    s = 1 - fp(x)/fp(a)
endfunction



scf(2)
xset("font size",5)
X = -10:0.1:10
Y = f(X)
plot(X,Y,'-r')


scf(3)
xset("font size",5)
X = -10:0.1:10
Y = fp(X)
plot(X,Y,'-r')


a = 1
//a = 0.5692773  // zero de  f 


x0 = 0;
//x0 = 10;
//x0 = -3

// Resolution par point fixe 

x = x0;
r = g(x)-x;
nr = abs(r);
nr0 = nr;

eps = 1.0E-14;
kmax = 100;


k = 1;
res2(k) = log(nr/nr0)/log(10);
while (nr/nr0 > eps)&(k<kmax)
    
    x = r + x;
    r = g(x)-x;
    nr = abs(r);
    
    k = k + 1;
    res2(k) = log((nr+1.0d-20)/nr0)/log(10);       
    
end

scf(1)
xset("font size",5)
plot(res2,'-xb')

disp('x point fixe',x)

disp('residu ',r)





// Resolution par Newton 

x = x0;

r = f(x);
nr = abs(r);
nr0 = nr;

eps = 1.0E-14;
kmax = 100;

k = 1;
res(k) = log(nr/nr0)/log(10);

while (nr/nr0 > eps)&(k<kmax)
    
    dx = - r/fp(x);
    x = x + dx;
    r = f(x);
    nr = abs(r);

    k = k + 1;    
    res(k) = log((nr+1.0d-20)/nr0)/log(10);       
 
end


scf(1)
xset("font size",5)
xtitle('residu')
plot(res,'-xr')

disp('x newton',x)

disp('residu ',r)



// on note que l'algorithme de point fixe converge lineairement (sauf pour a = x solution ou il converge quadratiquement)

// l'algorithme de Newton converge quadratiquement si le x0 est choisi assez proche de la solution. Il est en general plus sensible que les algorithmes de point fixe au choix du point de depart x0. Une possibilite est de combiner l'algo de point fixe au depart avec un algorithme de Newton pour accelerer la convergence lorsque l'on est suffisament proche de la solution. 



