[maple] Sturm

bonjour, j'ai une erreur dans mes deux programmes maple et j'ai beau les relire je ne vois pas ou sont les erreurs.

1er programme:pgcd de deux polynomes:

euclide:=proc(P,Q)
> local i,R;
> R[0]:=P;
> R[1]:=Q;
> for i
> while R[i] <> 0 do
> R[i+1]:=rem(R[i-1],R[i],x):
> od:
> R[i-1];
> end proc:

2eme programme:theoreme de sturm:

Changement de signe entre a et b
> ch_sgn:=proc(L)
> local i,x,R,n;
> R:=remove(x->(x=0),L);
> n:=0;
> for i from 2 to nops(R) do
> if R[i-1]*R[i]<0
> then n:=n+1
> fi;
> od:
> n;
> end proc:
Si un polynomes a des racines multiples
> rac_simple:=proc(P)
> local Q,R;
> Q:=quo(P,gcd(P,diff(P,x)),x):
> R:=factor(Q):
> end proc:
Suites de sturm
> Sturm:=proc(P)
> local i,R,L;
> R[0]:=P;
> R[1]:=-diff(P,x);
> L:=R[0],R[1];
> for i
> while(R[i]<>0) do
> R[i+1]:=-rem(R[i-1],R[i],x);
> L:=L,R[i+1];
> od:
> [L];
> end proc:
Nombre de changement de signe si on evalue le polynome en a
> Cal_val:=proc(P,a)
> ch_sgn(subs({x=a},P));
> end proc:
> P:=(x-1)*(x+2)*(x-3);
> print(`la factorisation du polynôme est ` ,factor(P));
> plot(P(x),x=-10..10,color=green);
> Q:=rac_simple(P);
> print(` `);
> print(`La suite de Sturm est :`);
> S:=Sturm(Q);
> print(`Le nombre de changement de signe dans cette suite est :`);
> M:=Cal_val(S,0);
> print(`représentation graphique de la suite de Sturm de notre polynome P :`);
> plot(x->Cal_val(S,x),-4..4);
> print(`Le nombre de racines réelles est :`);
> m:=Cal_val(P,4)-Cal_val(P,-4);

Merci beaucoup
Configuration: Windows XP
Internet Explorer 7.0

2 réponses

  1. Contributeur
    c'est normal for i tout court. Ca serait pas plutot while ... et ensuite tu incrémentes la variable i ?
    1. Bonjour,
      merci de m'avoir repondu ce programme fonctionne maintenant, par contre j'ai un soucis avec la suite, quand je dois isoler les racines.

      Changement de signe entre a et b
      > ch_sgn:=proc(L)
      > local i,x,R,n;
      > R:=remove(x->(x=0),L);
      > n:=0;
      > for i from 2 to nops(R) do
      > if R[i-1]*R[i]<0
      > then n:=n+1
      > fi;
      > od:
      > n;
      > end proc:
      Cas de Sturm si racines multiples
      > rac_simple:=proc(P)
      > local Q,R;
      > Q:=quo(P,gcd(P,diff(P,x)),x):
      > R:=factor(Q):
      > end proc:
      Calcul suites de Sturm
      > Sturm:=proc(P)
      > local i,R,L;
      > R[0]:=P;
      > R[1]:=-diff(P,x);
      > L:=R[0],R[1];
      > for i
      > while (R[i]<>0) do
      > R[i+1]:=-rem(R[i-1],R[i],x);
      > L:=L,R[i+1];
      > od:
      > [L];
      > end:
      >
      Nombre de Changement de signe si on evolue le polynome en a
      > Cal_val:=proc(P,a)
      > ch_sgn(subs({x=a},P));
      > end proc:
      >
      Nombre de racines dans [a,b[
      > Nb_rac:=proc(P,a,b)
      > local N;
      > N:=Cal_val(P,b)-Cal_val(P,a);
      > end proc:
      >
      Procedure qui renvoie la liste créée par Sturm
      > List_Sturm:=proc(S,a,b)
      > local w;
      > Cal_val(S,b)-Cal_val(S,a);
      > end proc:
      Isolement des racines
      > Isol_Rac:=proc(P,x)
      > local M,N,d;
      > M:=map(abs,[coeff(P,x)]);
      > print(a);
      > N:=evalf(1+max(op(M))/abs(lcoeff(P,x)));
      > print(N);
      > [split(Sturm(P,x),[-M,M])];
      > end proc:
      >
      >
      Procedure qui recoit la liste S créée par Sturm à partir du polynome initial P et un intervalle L
      > split:=proc(S,L)
      > local m,w;
      > print(e);
      > w:=List_Sturm(S,L[1],L[2]);
      > print(w);
      > print(f);
      > if w=0
      > then RETURN()
      > elif w=1 then L
      > else m:=(L[1]+L[2])/2;
      > split(S,[L[1],m],d),split(S,[m,L[2]],d);
      > print(g);
      > fi;
      > end proc:

      Essai
      > P:=x**7-5*x**3+12;
      > print(`la factorisation du polynôme est ` ,factor(P));
      > plot(P(x),x=-10..10,color=green);
      > Q:=rac_simple(P);
      > print(` `);
      > print(`La suite de Sturm est :`);
      > S:=Sturm(Q);
      > print(`Le nombre de changement de signe dans cette suite est :`);
      > M:=Cal_val(S,0);
      > print(`représentation graphique de la suite de Sturm de notre polynome P :`);
      > plot(x->Cal_val(S,x),-2..0);
      > Isol_Rac(P,x);

      Les premieres procedures fonctionnent sans probleme par contre les deux dernieres Isol_Rac et split que mon prof m'a donné ne fonctionnent pas. Comme j'ai énormément de mal avec maple, j'ai passé des heures à chercher l'erreur et sans résultat. Pourriez vous m'aider à faire fonctionner ces deux procedures. ou peut-etre que quelqu'un à deja travailler sur ca et a des procedures d'isolement qui fonctionnent?
      Merci