Bonjour,
j'ai un programme maple avec deux procedures qui ne tournent pas, n'etant pas très doué en programmation, je ne trouve pas les erreurs.
Pourriez-vous m'aider ou me donner des procedures qui fonctionnent pour que Voila mes procedures
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);
>
Ce sont les procedures Isol_rac et split qui ne fonctionnent pas.
Merci
Posted by: VPE
Bonsoir,
D'abord je n'ai encore jammais utilisé maple alors pour commencer :
> if w=0
> then RETURN()
> elif w=1 then L
> else m:=(L[1]+L[2])/2;
=> "elif" est t-il une instruction existante ? ou est-ce que cela devrai étre :
> elseif w=1 then L
A vrai dire je ne sais meme pas si elseif existe dans ce language mais comme le "elif" est suivit d'un "then" cela me fait plutot penser a un "endif".
Autrement dit :
Si w = 0 alors :
Retourner()
sinon si w = 1 alors aller a L
=>Ensuite :
> [split(Sturm(P,x),[-M,M])];
Est ce que "-M" est cencé représenter l'opposé de M ?
Ni en vb,ni en C et n'as le droit d'utiliser -[Variable] ,il faut utiliser (M * -1) car il sagirai d'une variable nomée "-M" et non "M"
Mais si le language n'autorise que les noms de variables a 1 caractére alors ce serai possible...
De plus certaines lignes comme :
> then n:=n+1
ne sont terminées ni par ";" ni par ":" alors que d'autres lignes,ou il y a une affectation le sont (else m:=(L[1]+L[2])/2;)! Je ne suis pas sur de bien comprendre...
Qu'en est-il ?
PS :Le maple étant un language interprété je suppose qu'il ignore les erreurs au lieu de bloquer dessus et de les indiquer non? Dans ce cas comment sais tu ou elles sont et ou elle ne sont pas ?