ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 20 Nov 2012 8:58 Sujet du message: |
|
|
Bonjour,
C'est parce que dans cet exemple, indets(Sol) n'est pas affiché de la même manière que dans les autres exemples:
{n, _Z^n, RootOf(2*_Z^n-3+3*I*3^(1/2))} dans cet exemple, alors que par exemple pour Racines_Complexes(-1,3,oui) on a {n, _Z1, cos(Pi/n+2*Pi/n*_Z1), sin(Pi/n+2*Pi/n*_Z1)}.
J'ai modifié le code en conséquence en distinguant 2 cas selon que le 3ème opérande de indets(Sol) commence ou non par RootOf: allvalues donne toutes les valeurs des racines du polynôme qui est dans le RootOf.
Code: |
> restart:
> Racines_Complexes:=proc(C::complex,O::posint,Avec_Points::symbol)
> # Création des variables locales
> local c,i,k,n,a,aretes,Details,Equation,Fleches,Fleches_P,
> Liste,ordre_convexe,Points,points,Sol:
> # Initialisation des variables
> Details:=Avec_Points;
> _EnvAllSolutions := true:
> # Critère de tri
> ordre_convexe:=(x,y)->evalb(evalf(op(2,y)>0) and evalb(evalf(op(1,x)<op(1,y)))):
> # Calcul des racines
> Equation:=z^O=C;
> Sol:=evalc(solve(z^n=C,z)):
> if convert((op(3,indets(Sol)),string))[1..6]="RootOf" then # cas 1
> n:=O: a:=op(3,indets(Sol)): a:=allvalues(eval(a)): Sol:=op(map(z->evalc(Re(z))+I*evalc(Im(z)),[a]));
>
> # Affichage conditionnel des résultats
> if Details=oui then
> print(Equation);
> print(seq(Sol[k],k= 1..O));
> print(`La racine principale est `,simplify(Sol[1],exp));
> print(` ou soit numériquement `,evalf(eval(Sol[1])));
> fi;
>
> # Affichage graphique des racines énièmes
> Points:=sort([seq([Re(Sol[k]),Im(Sol[k])],k = 1..O)],ordre_convexe):
> aretes:=plots[polygonplot](Points,linestyle=2,color=yellow):
> points:=plots[polygonplot](Points,style=point,symbol=circle,color=navy):
> Fleches_P:=plottools[arrow]([0,0],Points[O], .02, .06, .15, color=red):
> Fleches:=seq(plottools[arrow]([0,0],Points[k+1], .02, .06, .15, color=navy),k=0..O-2):
> c:= plottools[circle]([0,0], sqrt(Points[1,1]^2+Points[1,2]^2), linestyle=3,color=grey):
> plots[display](Fleches_P,Fleches,c,aretes,points,scaling=constrained)
>
> else # cas 2
> for i from 1 by 1 while convert((op(i,indets(Sol)),string))[1..2]<>"_Z" do
> od:
> Sol:=subs(op(i,indets(Sol))='k', Sol):
> Sol:=subs(n=O,Sol);
>
> # Affichage conditionnel des résultats
> if Details=oui then
> print(Equation);
> print(seq(Re(eval(Sol))+I*Im(eval(Sol)),k= 0..O-1));
> print(`La racine principale est `,simplify(subs('k'=0,Sol),exp));
> print(` soit symboliquement `,evalc(eval(Sol,'k'=0)));
> print(` ou soit numériquement `,evalf(eval(Sol,'k'=0)));
> #print([seq([Re(eval(Sol)),Im(eval(Sol))],k= 0..O-1)])
> fi;
> # Affichage graphique des racines énièmes
> Points:=sort([seq([Re(eval(Sol)),Im(eval(Sol))],k = 0..O-1)],ordre_convexe):
> aretes:=plots[polygonplot](Points,linestyle=2,color=yellow):
> points:=plots[polygonplot](Points,style=point,symbol=circle,color=navy):
> Fleches_P:=plottools[arrow]([0,0],Points[O], .02, .06, .15, color=red):
> Fleches:=seq(plottools[arrow]([0,0],Points[k+1], .02, .06, .15, color=navy),k=0..O-2):
> c:= plottools[circle]([0,0], sqrt(Points[1,1]^2+Points[1,2]^2), linestyle=3,color=grey):
> plots[display](Fleches_P,Fleches,c,aretes,points,scaling=constrained)
>
> end if:
> end:
> Racines_Complexes(evalc(polar(3, 5*Pi*(1/3))), 4, oui);
# cas 1 : présence de RootOf
> Racines_Complexes(-1,3,oui);#cas 2 pas de RootOf
|
Je pense que cela répondra à votre question. |
|