Teaching Methods & Materials > Mathematics">
Fsolve Maple
Fsolve Maple
Fsolve Maple
Bernard Dupont
Bernard.Dupont@univ-lille1.fr
Rsoudre des quations et des inquations est le pain quotidien du modlisateur, thoricien ou
technicien. Ce chapitre est consacr pour l'essentiel l'utilisation des commandes universelles solve
et fsolve, respectivement ddies la rsolution exacte (section 1) et la rsolution approche (section
2) d'une quation. Pour les systmes d'quations, on utilise les mmes commandes, soit solve pour la
rsolution exacte (section 3) et fsolve pour la rsolution approche (section 4). Les inquations sont
aussi rsolues avec solve (section 5). Enfin on donne des complments indispensables pour mener
bien une rsolution, en particulier en conomie o les inconnues sont des rels alors que Maple
"travaille" systmatiquement dans le corps des complexes (section 6).
quation polynmiale
Les limites de Maple sont celles de la thorie mathmatique. Si le degr du polynme est
infrieur ou gal 4, il est thoriquement possible de donner une solution l'aide de radicaux.
Au del de 5, c'est exceptionnel.
Polynme de degr infrieur ou gal 3
La commande solve(Xp=0,x) o Xp est une expression polynmiale de degr infrieur
ou gal 3 de la variable x renvoie les racines relles et complexes.
> restart;
xp:=a*x+b=0;solve(xp,x);#polynme du premier degr
xp := a x Cb = 0
b
K
a
> xp2:=a*x^2+b*x+c=0;solve(xp2,x);#polynme "symbolique" du
second degr
xp2 := a x2 Cb x Cc = 0
1 Kb C b2 K4 a c 1 bC b2 K4 a c
,K
2 a 2 a
> xp3:=5*x^2+3*x+6=0;
solve(xp3,x);#polynme "numrique" du second degr
xp3 := 5 x2 C3 x C6 = 0
1
3 1 3 1
K C I 111 , K K I 111
10 10 10 10
Maple renvoie une squence compose ici de deux lments. On rcupre un lment de la
squence au moyen de l'oprateur d'indiage [numero] :
> %[1];%%[2];
3 1
K C I 111
10 10
3 1
K K I 111
10 10
Il est astucieux d'attribuer un nom la squence des racines puis d'isoler chacune d'elles en
les assignant :
> soluce:=solve(xp3,x);soluce1:=soluce[1];soluce2:=soluce[2]
;
3 1 3 1
soluce := K C I 111 , K K I 111
10 10 10 10
3 1
soluce1 := K C I 111
10 10
3 1
soluce2 := K K I 111
10 10
Si l'quation comporte des nombres flottants, Maple renvoie systmatiquement des solutions
sous forme de nombres flottants avec n chiffres significatifs, n tant paramtr par la variable
Digits:=n.
> xp4:=5.*x^2+3*x+6=0;Digits:=3;sol:=solve(xp4,x);sol1:=sol
[1];sol2:=sol[2];
xp4 := 5. x2 C3 x C6 = 0
Digits := 3
sol := K0.300 C1.05 I, K0.300 K1.05 I
sol1 := K0.300 C1.05 I
sol2 := K0.300 K1.05 I
Les principes sont les mmes pour des polynmes du troisime degr.
> xp5:=a*x^3+b*x^2+c*x+d=0;solve(xp5,x);#polynme
"symbolique" du troisime degr
xp5 := a x3 Cb x2 Cc x Cd = 0
1 1
36 c b a K108 d a2 K8 b3
6 a
1/3
3 2 2 2 2 3 2
C12 3 4 a c Kc b K18 c b a d C27 d a C4 d b a K 3ac
3
Kb2 a 36 c b a K108 d a2 K8 b3
1/3
3 2 2 2 2 3 1 b
C12 3 4 a c Kc b K18 c b a d C27 d a C4 d b a K ,
3 a
1 1
K 36 c b a K108 d a2 K8 b3
12 a
2
1/3
3 2 2 2 2 3 1
C12 3 4 a c Kc b K18 c b a d C27 d a C4 d b a C 3ac
3
2 2 3
Kb a 36 c b a K108 d a K8 b
1/3
3 2 2 2 2 3 1 b
C12 3 4 a c Kc b K18 c b a d C27 d a C4 d b a K
3 a
1 1 1
C I 3 36 c b a K108 d a2 K8 b3
2 6 a
1/3
3 2 2 2 2 3 2
C12 3 4 a c Kc b K18 c b a d C27 d a C4 d b a C 3ac
3
Kb2 a 36 c b a K108 d a2 K8 b3
1/3
C12 3 4 a c3 Kc2 b2 K18 c b a d C27 d2 a2 C4 d b3 a ,
1 1
K 36 c b a K108 d a2 K8 b3
12 a
1/3
1
C12 3 4 a c3 Kc2 b2 K18 c b a d C27 d2 a2 C4 d b3 a C 3ac
3
2 2 3
Kb a 36 c b a K108 d a K8 b
1/3
1 b
C12 3 4 a c3 Kc2 b2 K18 c b a d C27 d2 a2 C4 d b3 a K
3 a
1 1 1
K I 3 36 c b a K108 d a2 K8 b3
2 6 a
1/3
3 2 2 2 2 3 2
C12 3 4 a c Kc b K18 c b a d C27 d a C4 d b a C 3ac
3
Kb2 a 36 c b a K108 d a2 K8 b3
1/3
3 2 2 2 2 3
C12 3 4 a c Kc b K18 c b a d C27 d a C4 d b a
> xp6:=2*x^3+3*x^2-6*x+7=0;#les coefficients du polynme de
degr 3 sont des entiers
sol:=solve(xp6,x);
xp6 := 2 x3 C3 x2 K6 x C7 = 0
1 1/3 5 1 1 1/3
sol := K 21 C2 79 K 1/3
K , 21 C2 79
2 2 4
2 21 C2 79
5 1 1 1 1/3
C 1/3
K C I 3 K 21 C2 79
2 2 2
4 21 C2 79
5 1 1/3 5 1
C 1/3
, 21 C2 79 C 1/3
K
4 2
2 21 C2 79 4 21 C2 79
3
1 1 1/3 5
K I 3 K 21 C2 79 C 1/3
2 2
2 21 C2 79
> xp7:=2.*x^3+3*x^2-6*x+7=0;#le premier coefficient de ce
polynme du 3 degr est un nombre flottant
sol:=solve(xp7,x);
sol[1];sol[2];sol[3];#assignation des trois racines
3 2
xp7 := 2. x C3 x K6 x C7 = 0
sol := 0.716 C0.826 I, K2.93, 0.716 K0.826 I
0.716 C0.826 I
K2.93
0.716 K0.826 I
Polynmes de degr 4
Des nouveauts apparaissent :
> xp8:=a*x^4+b*x^3+c*x^2+d*x+e=0;sol:=solve(xp8,x);
xp8 := a x4 Cb x3 Cc x2 Cd x Ce = 0
sol := RootOf a _Z4 Cb _Z3 Cc _Z2 Cd _Z Ce
Par dfaut, Maple renvoie en cho une fonction RootOf, signifiant que les racines du
polynme de degr 4 sont .. les racines de ce polynme. C'est frustrant puisqu'en thorie il est
possible d'expliciter toutes les solutions l'aide de radicaux. Ceci tant, on peut forcer le
systme renvoyer les solutions en fixant son environnement avec l'instruction
_EnvExplicit:=true
> _EnvExplicit:=true;
xp9:=a*x^4+b*x^3+c*x^2+d*x+e=0;
sol:=solve(xp9,x):#l'affichage de la sortie est
volontairement bloqu.
_EnvExplicit := true
xp9 := a x4 Cb x3 Cc x2 Cd x Ce = 0
De fait, l'output dveloppe des dizaines de lignes peu digestes. Evidemment, si les
coefficients sont des nombres du type flottant, le problme ne se pose pas :
> xp10:=1.*x^4+5*x^3-5*x^2+2*x+6=0;sol:=solve(xp10,x);
xp10 := 1. x4 C5 x3 K5 x2 C2 x C6 = 0
sol := 0.811 C0.845 I, K0.744, K5.88, 0.811 K0.845 I
5
K10 K5 0 5 10
x
K0.5
K1
K1.5
K2
En ralit, l'quation admet une infinit de solutions sur son domaine de dfinition. Maple a
renvoy une racine et il faut rectifier ce rsultat en ajoutant l'expression bien connue " 2 k
prs".
Moralit : il faut tre extrmement vigilant et rigoureux quand on fait appel
l'instruction solve.
Explorons d'autres singularits de cette instruction.
Il se peut que Maple retourne la question pose sous la forme laconique RootOf alors que des
solutions existent :
> xp2:=tan(x)+x+1;solve(xp2=0,x);plot(xp2,x=-2*Pi..2*Pi,y=-5.
.5,discont=true);
xp2 := tan x Cx C1
RootOf tan _Z C_Z C1
6
4
y
2
K6 K4 K2 0 2 4 6
x
K2
K4
Des solutions complexes peuvent tre renvoyes alors qu'on attend des solutions relles : ce
phnomne provient du fait que Maple cherche des solutions dans le corps des complexes.
> xp3:=cos(3*x)+7*cos(x);solve(xp3=0,x);plot(xp3,x=-2*Pi..2*Pi)
;
xp3 := cos 3 x C7 cos x
1
arccos I , arccos KI ,
2
7
8
K6 K4 K2 0 2 4 6
x
K2
K4
K6
K8
En fait, la rsolution d'une quation non polynmiale doit tre gnralement mene comme on le
ferait " la main". De plus, il faut avoir l'esprit critique vis vis des rponses fournies par le
logiciel.
quation polynmiale
Soit F x = 0 une quation polynmiale o x est inconnue et tous les coefficients sont
numriques. En principe, fsolve(F(x)=0,x) retourne toutes les racines relles de l'quation.
> restart;xp1:=x^4-3*x^2+x+1;
fsolve(xp1=0,x);#fsolve affiche 4 racines relles
plot(xp1,x=-2..2);#vrification graphique du rsultat
xp1 := x4 K3 x2 Cx C1
K1.801937736, K0.4450418679, 1., 1.246979604
8
7
K2 K1 0 1 2
x
K1
K2
K3 K2 K1 0 1 2 3
x
K1
K2
K3
K4
K5
K6
K7
K8
K9
K10 K5 0 5 10
x
K2
> sol2:=fsolve(xp2,x,avoid={x=sol1});#deuxime utilisation de
fsolve, en cartant la premire solution
sol2 := 4.451620297
> sol3:=fsolve(xp2,x=0..10,avoid={x=sol1,x=sol2});#troisime
utilisation de fsolve, en cartant la premire et la deuxime
solutions
sol3 := 1.806570269
> sol4:=fsolve(xp2,x=-infinity..0,avoid={x=sol1,x=sol2,x=sol3})
;#quatrime utilisation de fsolve, en cartant les solutions
prcdentes
sol4 := K1.481974815
11
solve(quations,inconnues) o equations est un ensemble ou une liste d'quations et
inconnues est un ensemble ou une liste d'inconnues. Il faut distinguer la rsolution des systmes
linaires des systmes non linaires.
Systmes linaires
En principe, Maple rsout tous les systmes linaires dont les coefficients sont des nombres.
> restart;
sol1:=solve({x+y+z=5,2*x+sqrt(2)*y-4*z=1,x-5*y=4},{x,y,z});
#la solution est exprime dans un ensemble
sol2:=solve([x+y+z=5,2*x+sqrt(2)*y-4*z=1,x-5*y=4],[x,y,z]);
#la solution est exprime dans une liste
2053 15 51 3 883 9
sol1 := x = C 2 , y=K C 2 , z= K 2
577 1154 577 1154 577 577
2053 15 51 3 883 9
sol2 := x = C 2 , y=K C 2 , z= K 2
577 1154 577 1154 577 577
Les quations sont crites entre accolades ou crochets ainsi que les inconnues. Le rsultat est lui
aussi entre accolades ou crochets. Pour Maple, tout lment ou squence d'lments entre
accolades reprsente un ensemble d'lments non ordonns. Il n'est pas possible de prvoir
l'ordre dans lequel vont apparatre les racines.
Au vu du rsultat, on peut rcuprer isolment les racines l'aide de subs :
> solx:=subs(sol1,x);soly:=subs(sol1,y);solz:=subs(sol1,z);
2053 15
solx := C 2
577 1154
51 3
soly := K C 2
577 1154
883 9
solz := K 2
577 577
ou rcuprer les solutions sous forme d'une liste ordonne (soit sous forme d'une squence
d'lments mis entre crochets) :
> ['solx','soly','solz']=subs(sol1,[x,y,z]);
2053 15 51 3 883 9
solx, soly, solz = C 2,K C 2, K 2
577 1154 577 1154 577 577
Quand le systme n'a pas de solution, Maple renvoie une squence vide :
> sol3:=solve({2*x+y=1,2*x+y=5},{x,y});
sol3 :=
Quand le systme admet une infinit de solutions (cas o les quations sont linairement
dpendantes), Maple renvoie une solution sous forme paramtrique dans laquelle une ou
plusieurs inconnues servent de paramtres :
> sol4:=solve({x+y+z=1,2*x+2*y+2*z=2,x-y+2*z=4},{x,y,z});
sol4 := x = K2 K3 y, y = y, z = 3 C2 y
En ce qui concerne les systmes dans lesquels certains ou tous les coefficients sont des
paramtres, Maple cherche une solution "gnrale" qui ne tient pas compte des cas particuliers. Il
convient alors d'tre trs vigilant.
> sol5:=solve({a*x+y=1,x+a*y=1},{x,y});
12
1 1
sol5 := x = ,y=
a C1 a C1
La solution gnrale fournie ici n'est pas correcte pour a = 1 (car, dans ce cas, les quations sont
linairement dpendantes) et pour a = K1 (car alors le dnominateur est nul, ce qui est
impossible). Il faut tudier part ces deux cas :
> sys:={a*x+y=1,x+a*y=1};
soluce_1:=solve(subs(a=1,sys),{x,y});
soluce_2:=solve(subs(a=-1,sys),{x,y});
sys := x Ca y = 1, a x Cy = 1
soluce_1 := x = Ky C1, y = y
soluce_2 :=
13
2
y
1
K1 0 1 2 3 4 5
x
K1
K2
On prcise dans un troisime argument le voisinage dans lequel Maple doit chercher une solution :
> fsolve({y^2-x=0,y-x^2+4*x-2=0},{x,y},{x=0.2..0.8,y=0.2..0.8});
x = 0.3819660113, y = 0.6180339887
> fsolve({y^2-x=0,y-x^2+4*x-2=0},{x,y},{x=0.8..1.2,y=-1.2..-0.8})
;
x = 1.000000000, y = K1.000000000
> fsolve({y^2-x=0,y-x^2+4*x-2=0},{x,y},{x=3.8..4.2,y=1.8..2.2});
x = 4.000000000, y = 2.000000000
Cet exemple n'a bien entendu aucune valeur universelle. Chaque cas un peu tordu est un cas
d'espce tudier avec beaucoup de patience et de rigueur.
Rsolution d'inquations
Maple peut rsoudre certaines inquations et mme certains systmes d'inquations une variable
l'aide de solve. Les symboles d'ingalits reconnus par le logiciel sont : strictement infrieur : <;
strictement suprieur >: ; infrieur ou gal : <=; suprieur ou gal : >=. Au passage, signalons
que l'oprateur "diffrent de" s'crit : <> .
14
Inquation une variable
L'exemple suivant familiarise avec la syntaxe et montre comment Mape exprime que le rsultat
est la runion d'intervalles ouverts de = :
> restart;
P:=x^3+4*x^2+2*x-1;solve(P>0,x);solve(P<0,x);
P := x3 C4 x2 C2 x K1
3 1 3
RealRange Open K K 13 , Open K1 , RealRange Open K
2 2 2
1
C 13 , N
2
3 1 3
RealRange KN, Open K K 13 , RealRange Open K1 , Open K
2 2 2
1
C 13
2
Une reprsentation graphique permet de s'assurer de la justesse du rsultat :
> plot(P,x=-4..1);
6
K4 K3 K2 K1 0 1
x
K2
K4
K6
K8
Si on dsire voir figurer explicitement la variable x dans la rponse, il faut mettre en accolades
15
l'inquation et la variable :
solve({P>0},{x});solve({P<0},{x});
3 1 3 1
x ! K1, K K 13 ! x , K C 13 ! x
2 2 2 2
3 1 3 1
x!K K 13 , K1 ! x, x ! K C 13
2 2 2 2
16
3
K3 K2 K1 0 1 2 3
K1
K2
K3
17
3
K3 K2 K1 0 1 2 3
K1
K2
K3
> inequal( { x+y>0, x-y<=1,y=2}, x=-3..3, y=-4..4,
optionsfeasible=(color=red),
optionsopen=(color=blue,thickness=2),
optionsclosed=(color=green, thickness=3),
optionsexcluded=(color=yellow) );#utilisation de toutes
les options
18
4
K3 K2 K1 0 1 2 3
K1
K2
K3
K4
Complments indispensables
L'conomiste sera parfois du par les rsultats bruts qu'apporte la commande solve. La premire
raison est que Maple recherche les solutions d'une quation ou d'un systme d'quations dans le
corps des nombres complexes alors que les variables conomiques sont "naturellement" relles. La
seconde tient au fait que les quations conomiques sont souvent thoriques et font intervenir des
paramtres soumis des hypothses que le logiciel ne prend pas en compte. Cette section donne des
indications sur la manire de, sinon surmonter, du moins contourner ces difficults. Elle prsente
galement quelques astuces pour amliorer la recherche et le traitement des solutions.
19
infolevelsolve := 3
LinearEq: computing pseudo sub-resultant 20 16 x
PseudoResultant: computing pseudo resultant with lengths 20
16 x
PseudoResultant: resultant computed and factored length = 29
1 3
cos RootOf 216 _Z Kcos _Z
6
21
sol_x2 = 1
sol_y1 = 1
sol_y2 = K1
1 1 1 1
1, K C I 3,K K I 3
2 2 2 2
x=1
1, K1, I, KI
x = 1 , x = K1
Le programmme de tri suivant conserve les solutions relles en cartant les solutions dont la
partie imaginaire est diffrente de 0. Il n'est utile que si Maple sait expliciter les solutions avec la
commande allvalues comme dans l'exemple qui suit. Ce n'est malheureusement pas toujours
le cas.
> sol:=map(allvalues,{solve(x^3-1=0,x)});#reprise de l'exemple
ci-dessus
#dbut du programme de tri
S:={}:
for j from 1 to nops(sol) do
if Im(sol[j])=0 then S:=S union {sol[j]} else S:=S end if;
end do;
S;
1 1 1 1
sol := 1, K K I 3,K C I 3
2 2 2 2
1
Dans l'exemple suivant, allvalues ne parvient pas expliciter les solutions. Les tests ne
peuvent donc pas aboutir.
> sol:=map(allvalues,{solve(x^5-2*x^3+10=0,x)});
S:={}:
for j from 1 to nops(sol) do
if Im(sol[j])=0 then S:=S union {sol[j]} else S:=S end if;
end do;
S;
5 3 5 3
sol := RootOf _Z K2 _Z C10, index = 1 , RootOf _Z K2 _Z C10, index = 2 ,
5 3 5 3
RootOf _Z K2 _Z C10, index = 3 , RootOf _Z K2 _Z C10, index = 4 ,
5 3
RootOf _Z K2 _Z C10, index = 5
RootOf _Z5 K2 _Z3 C10, index = 3
24