Dichotomie.mw

> restart;with(plots):secu:=1000:secu une valeur de sécurité pour éviter les boucles trop longues

Warning, the name changecoords has been redefined

Exercice 1

>

Question a)

> Dichotomie:=proc(f,a,b,epsilon)
local aa,bb,compteur,milieu;

aa:=a;bb:=b;

avant d'amorcer la boucle assurons-nous que nous sommes dans un cas particulier
if is(f(a)*f(b)>0) then return([infinity,infinity]);
si f(a) et f(b) sont de même signe on renvoie une solution erronnée
elif is(f(a)=0) then return([0,a]);
si f(a)=0 alors a est solution
elif is(f(b)=0) then return([0,b]);
si f(b)=0 alors b est solution
fi;

compteur:=0;

while is(abs(bb-aa)>epsilon) and is(compteur<secu) do

 compteur:=compteur+1;milieu:=(aa+bb)/2;

 if
is(f(milieu)=0) then aa:=bb
au cas où milieu soit une solution on sort de la boucle en posant [an,b_n] de diametre nul
 elif is(f(milieu)*f(bb)<0) then aa:=milieu;

 else bb:=milieu; fi;

od;

[compteur,milieu];

end:

>

Question b)

>

>

> Premier exemple

>

> f:=x->exp(-x/2)-1;a:=-4;b:=4;epsilon:=10^(-8);

f := proc (x) options operator, arrow; exp(-1/2*x)-1 end proc

a := -4

b := 4

epsilon := 1/100000000

> sol:=Dichotomie(f,a,b,epsilon);solution proposé par la procédure Dichotomie

sol := [30, (-1073741823)/268435456]

> 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point

f((-1073741823)/268435456) = 6.389056084

>

> Deuxième exemple

>

> f:=x->x^3-4*x+1;a:=-2.5;b:=-2;epsilon:=10^(-8);

f := proc (x) options operator, arrow; x^3-4*x+1 end proc

a := -2.5

b := -2

epsilon := 1/100000000

> sol:=Dichotomie(f,a,b,epsilon);solution proposé par la procédure Dichotomie

sol := [26, -2.114907544]

> 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point

f(-2.114907544) = -0.24e-7

>

> Troisième exemple

>

> f:=x->x^3-4*x+1;a:=0;b:=0.5;epsilon:=10^(-8);

f := proc (x) options operator, arrow; x^3-4*x+1 end proc

a := 0

b := .5

epsilon := 1/100000000

> sol:=Dichotomie(f,a,b,epsilon);solution proposé par la procédure Dichotomie

sol := [26, .2541016899]

> 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point

f(.2541016899) = -0.6e-8

>

> Quatrième exemple

>

> f:=x->x^3-4*x+1;a:=1.5;b:=2;epsilon:=10^(-8);

f := proc (x) options operator, arrow; x^3-4*x+1 end proc

a := 1.5

b := 2

epsilon := 1/100000000

> sol:=Dichotomie(f,a,b,epsilon);solution proposé par la procédure Dichotomie

sol := [26, 1.860805852]

> 'f'(sol[2])=evalf(f(sol[2])); valeur de f en ce point

f(1.860805852) = -0.7e-8

>

>

Illustration Graphique

> f:=x->x^3-4*x+1;

f := proc (x) options operator, arrow; x^3-4*x+1 end proc

>

> sol:=SDichotomie(f,a,b,epsilon):

> N:=sol[1]:s:=sol[2..N+1]:

> Graphique(f,a,b,N,s);

[Plot]

> sur l'axe des abbscissdes apparaissent les points milieu xn de la suite de segments [an,bn] construits par dichotomie
la
courbe est cell de f

> points:=seq([i,s[i]],i=1..N):

> plot([points],color=black,thickness=2,style=point);

[Plot]

> Les points tracés sont ceux de coordonnées (n,xn)