Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Boucle de fonction

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
scyl



Inscrit le: 26 Mai 2007
Messages: 4

MessagePosté le: 26 Mai 2007 13:10    Sujet du message: Boucle de fonction Répondre en citant

Bonjour

J'essaie actuellement ( pour mon TIPE ) de terminer un programme qui nécessite une boucle de fonctions, mais cela ne marche pas ( error ( in ns) too many levels of recursion ...)

En passant voici mon programme Maple ( censé donner la trajectoire d'un rayon )

anglo:=proc(ro,max,h)
> local Intens,i1,i,ns,r2,theta,i2,n2,n0,A,L,R;
> Intens:=r->A*exp(-r^2/r0^2);
> n:=r->n0+n2*Intens(r); R:=r0: n2:=3.*10^(-23); i1:=0: n0:=1.0003; r0:=1; A:=1; L:=[[R,0]];
> for i from 1 to max do ns:=r->n(r)+n2*Intens(r); r2:=op(1,[solve(n(r)=ns(r2),r2)]); theta:=arctan((r2-r)/h); i2:=arcsin(n(r)*sin(i1+theta)/(n(r)+n2*Intens(r)))-theta; L:=[op(L),[R-h*tan(i2),i*h]];
> n:=r->ns(r); i2:=i1: Intens:=r->(n(r)-n0)/n2: R:=R-h*tan(i2); od;
> plot(L);
> end;

et j'ai absolument besoin des fonctions ( je ne peux pas passer par des expressions car il me faut connaitre l'intensité en fonction de r!)
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 26 Mai 2007 14:28    Sujet du message: Répondre en citant

Bonjour, on ne retrouve pas dans le corps de la procédure de trace du paramètre formel ro. De plus il y a aussi une variable locale r0 ce qui ajoute à la confusion. Tout ceci est donc à clarifier...
A plus tard.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
scyl



Inscrit le: 26 Mai 2007
Messages: 4

MessagePosté le: 26 Mai 2007 15:07    Sujet du message: Répondre en citant

r0 n'a rien d'une variable locale, c'est une constante ( r0:=1, c'est précisé)
en revanche il y a eu une petite erreur au tout debut du programme, c'est R:=ro et non R:=r0 ce qui donne la procédure suivante :

anglo:=proc(ro,max,h)
> local Intens,i1,i,ns,r2,theta,i2,n2,n0,A,L,R,r0;
> Intens:=r->A*exp(-r^2/r0^2);
> n:=r->n0+n2*Intens(r);
R:=ro: n2:=3.*10^(-23); i1:=0: n0:=1.0003; r0:=1; A:=1; L:=[[R,0]];


> for i from 1 to max do
ns:=r->n(r)+n2*Intens(r);
r2:=op(1,[solve(n(r)=ns(r2),r2)]);
theta:=arctan((r2-r)/h);
i2:=arcsin(n(r)*sin(i1+theta)/(n(r)+n2*Intens(r)))-theta;
L:=[op(L),[R-h*tan(i2),i*h]];

> n:=r->ns(r); i2:=i1: Intens:=r->(n(r)-n0)/n2: R:=R-h*tan(i2); od;
> plot(L);
> end;

procédure qui ne marche toujours pas...
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 26 Mai 2007 15:32    Sujet du message: Répondre en citant

Si, r0 est une variable locale étant donné qu'elle est déclarée dans la ligne local, mais r0 contient une valeur constante.
Pour le reste, tracer votre programme en faisant
> trace(algo);
avant de lancer la procédure. Vous devriez voir ainsi le contenu des variables en cours d'exécution et ainsi réussir à corriger.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
scyl



Inscrit le: 26 Mai 2007
Messages: 4

MessagePosté le: 26 Mai 2007 17:01    Sujet du message: Répondre en citant

Merci pour la réponse et maintenant j'ai réussi ( enfin presque je n'ai pas les résultats attendus) , J'ai un autre problème ( moyennement contourné) je n'arrivait pas à obtenir r2, puisque le programme n'arrivait pas à résoudre l'équation n(r)=ns(r2) ( ce qu'il arrivait très bien à faire en dehors du programme ).

Je remet donc toute la procedure:
anglo:=proc(ro,max,h)
> local i1,i,r2,theta,i2,n2,n0,A,R,r0;
> global Intens,ns,n,L;
> R:=ro: n2:=3.*10^(-23); i1:=0: n0:=1.0003; r0:=1; A:=1; L:=[[0,R]];
>
> Intens:=unapply(A*exp(-r^2/r0^2),r);
> n:=unapply(n0+n2*Intens(r),r);
> for i from 1 to max do ns:=unapply(n(r)+n2*Intens(r),r);
> r2:=op(1,[solve(n(r)=ns(r2),r2)]); ( qu'il n'arrive pas à résoudre, ou sinon trouve 2 solutions mais ne peut pas en choisir une )

theta:=arctan((r2-R)/h); i2:=evalf(arcsin(n(R)*sin(i1+theta)/(n(R)+n2*Intens(R)))-theta); L:=[op(L),[i*h,R-100000*h*tan(i2)]];
> n:=unapply(ns(r),r); i1:=i2: Intens:=unapply((n(r)-n0)/n2,r): R:=R-h*tan(i2); od;
> plot(L);
> end;
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 26 Mai 2007 18:03    Sujet du message: Répondre en citant

Peut-être que comme ceci, vous pourrez tester si l'ensemble solution est vide ou non. Mais, ce qui me gêne à la fin, c'est que les éléments de L dépendent de r et que r n'a pas de valeur. Ou alors faire plot([L], r=a..b) où a et b sont 2 réels que vous choisirez.
A+

Code:

anglo:=proc(ro,max,h)
>  local s,i1,i,r2,theta,i2,n2,n0,A,R,r0;
>  global Intens,ns,n,L;
>  R:=ro: n2:=3.*10^(-23); i1:=0: n0:=1.0003; r0:=1; A:=1; L:=[0,R];

>  Intens:=unapply(A*exp(-r^2/r0^2),r);
>  n:=unapply(n0+n2*Intens(r),r);
>  for i from 1 to max do
>   ns:=unapply(n(r)+n2*Intens(r),r);
>   s:=[solve(n(r)=ns(r2),r2)]:
>   if nops(s)>0 then print(s):
>     for r2 in s do
>         theta:=arctan((r2-R)/h); i2:=evalf(arcsin(n(R)*sin(i1+theta)/(n(R)+n2*Intens(R)))-theta);                         L:=L,[i*h,R-100000*h*tan(i2)];
>         n:=unapply(ns(r),r); i1:=i2: Intens:=unapply((n(r)-n0)/n2,r): R:=R-h*tan(i2);
>      od;
>   fi; od;
>  plot([L]);
>  end:
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
scyl



Inscrit le: 26 Mai 2007
Messages: 4

MessagePosté le: 27 Mai 2007 9:06    Sujet du message: Répondre en citant

En effet, les éléments de L ne doivent pas dépendre de r, mais de R ( qui varie au fur et à mesure des itérations)


Je remet la procédure et corrgie mon ( enorme ) faute:

anglo:=proc(ro,max,h)
> local i1,i,r2,theta,i2,n2,n0,A,R,r0;
> global Intens,ns,n,L;
> R:=ro: n2:=3.*10^(-23); i1:=0: n0:=1.0003; r0:=1; A:=1; L:=[[0,R]];
>
> Intens:=unapply(A*exp(-r^2/r0^2),r);
> n:=unapply(n0+n2*Intens(r),r);
> for i from 1 to max do ns:=unapply(n(r)+n2*Intens(r),r);
> r2:=op(1,[solve(n(R)=ns(r2),r2)]); ( qu'il n'arrive pas à résoudre, ou sinon trouve 2 solutions mais ne peut pas en choisir une )

theta:=arctan((r2-R)/h); i2:=evalf(arcsin(n(R)*sin(i1+theta)/(n(R)+n2*Intens(R)))-theta); L:=[op(L),[i*h,R-100000*h*tan(i2)]];
> n:=unapply(ns(r),r); i1:=i2: Intens:=unapply((n(r)-n0)/n2,r): R:=R-h*tan(i2); od;
> plot(L);
> end;

Malgré cela Maple ne trouve pas ( ou ne veut pas trouver de solutions )
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 27 Mai 2007 10:02    Sujet du message: Répondre en citant

Bonjour, ça clarifie les choses. Essayez comme ceci. Je ne sais pas quelles valeurs vous prenez pour ro,max et h.

Code:

anglo:=proc(ro,max,h)
>   local s,i1,i,r2,theta,i2,n2,n0,A,R,r0;
>   global Intens,ns,n,L;
>   R:=ro: n2:=3.*10^(-23); i1:=0: n0:=1.0003; r0:=1; A:=1; L:=[0,R];
>   
>   Intens:=unapply(A*exp(-r^2/r0^2),r);
>   n:=unapply(n0+n2*Intens(r),r);
>   for i from 1 to max do
> print(i);   ns:=unapply(n(r)+n2*Intens(r),r);
>    s:=[solve(n(R)=ns(r),r)]:
>      if nops(s)>0 then
>      for r2 in s do
>          theta:=arctan((r2-R)/h); i2:=evalf(arcsin(n(R)*sin(i1+theta)/(n(R)+n2*Intens(R)))-theta);                         L:=L,[i*h,R-100000*h*tan(i2)];
>          n:=unapply(ns(r),r); i1:=i2: Intens:=unapply((n(r)-n0)/n2,r): R:=R-h*tan(i2);
>       od;
>    fi; od;
>   plot([L]);
>   end:


A+
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


phpBB

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com


Apprendre Maple - ©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.