Calculer pi à l'aide d'un cercle trigo

Discussion sur l'enseignement de l'algorithmique avec Xcas au lycee
Répondre
ergibil
Messages : 9
Inscription : dim. juin 07, 2009 6:41 pm

Calculer pi à l'aide d'un cercle trigo

Message par ergibil » jeu. juin 11, 2009 8:26 pm

Bonjour à tous,
Tout d'abord merci pour ce forum que je trouve très intéressant.
Je voudrais faire une activité info sous xcas pour calculer pi à l'aide d'un demi cercle de centre 0 et de rayon 1 et d'un polygone régulier:

calculpi:= proc(n)
local i;
begin
noir
cercle(point([0,0]),1):
for i from 1 to n do
segment(point([cos((i-1)*180/n),sin((i-1)*180/n)]),point([cos(i*180/n),sin(i*180/n)])):
end_for;
end_proc;

La compilation se fait sans pb (xcas compatible mapple).
Mais à l'affichage apparait uniquement le dernier segment. :(
Existe-t-il une solution ?
D'avance merci pour vos réponses :wink:

slejoly
Messages : 194
Inscription : sam. oct. 14, 2006 10:17 am
Localisation : Lorient

Message par slejoly » jeu. juin 11, 2009 9:06 pm

Je me réfère au fil que j'avais moi même posé ici :
http://pcm1.e.ujf-grenoble.fr/XCAS/view ... light=#282
et donc en syntaxe xcas cela donne :

Code : Tout sélectionner

calculpi(n):={
local j,res; 
res:=NULL;
C:=cercle(point([0,0]),1):; 
pour j de  1 jusque n faire
res:=res,segment(point([cos((j-1)*180/n),sin((j-1)*180/n)]),point([cos(j*180/n),sin(j*180/n)])):;
 fpour; 
return (C,res);
};
Stéphane Lejoly

P.s. avec Xcas (=syntaxe xcas, Maple connais pas) i est réservé.

ergibil
Messages : 9
Inscription : dim. juin 07, 2009 6:41 pm

Message par ergibil » jeu. juin 11, 2009 9:23 pm

Merci beaucoup !!!
:D
Je trouve vraiment xcas très intéressant pour le lycée.

ergibil
Messages : 9
Inscription : dim. juin 07, 2009 6:41 pm

Message par ergibil » jeu. juin 11, 2009 9:28 pm

Quand je dis configuration mapple il faut aller ds cfg configuration du cas et dans prog style choisir mapple.
Je trouve intéressant d'habituer les élèves à une syntaxe mapple ai-je tort ?

ce qui donne :

calculpi:= proc(n)
local i,poly;
begin
poly:=NULL;
C:=cercle(point([0,0]),1);
for i from 1 to n do
poly:=poly,segment(point([cos((i-1)*180/n),sin((i-1)*180/n)]),point([cos(i*180/n),sin(i*180/n)]));
end_for;
RETURN(C,poly);
end_proc;

slejoly
Messages : 194
Inscription : sam. oct. 14, 2006 10:17 am
Localisation : Lorient

Message par slejoly » jeu. juin 11, 2009 10:09 pm

Je trouve vraiment xcas très intéressant pour le lycée
Moi aussi.
... cfg configuration du cas et dans prog style choisir mapple.
Je trouve intéressant d'habituer les élèves à une syntaxe mapple ai-je tort ?
Oui et non, c'est un choix, mais moi, ne travaillant pas en prépa, et n'utilisant que Xcas, j'ai toujours utilisé la syntaxe Xcas, de plus pour le lycée l'avantage c'est que les commandes d'Xcas existent aussi en français (solve = resoudre, si alors sinon fsi, deriver, factoriser, simplifier etc.) ce que je trouve moins déroutant pour des élèves notamment de seconde.
Mais Bernard Parisse (le grand manitou) donnerait sûrement d'autres arguments quant à la syntaxe à utiliser.

Bonne nuit.

Stéphane Lejoly

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Message par parisse » ven. juin 12, 2009 1:44 pm

Merci pour les commentaires, ça fait plaisir!
Sur la question du graphique, Stephane Lejoly a répondu, j'ajoute que de même que les résultats intermédiaires d'un programme ne sont pas affichés, de même les objets graphiques intermédiaires ne sont pas affichés en réponse. Ils sont par contre affichés dans la fenêtre "DispG" (qu'on peut faire apparaitre dans le menu Cfg).
Concernant le choix de syntaxe, il y a des arguments pour et contre. Pour maple, il y a la compatibilité (pour les élèves qui auront à se servir de maple plus tard). Pour la syntaxe xcas, il y a la plus grande proximité avec pas mal de langages (C, java,...). Mais de toutes façons les deux syntaxes sont assez proches et on peut le plus souvent utiliser une tournure à la maple en mode xcas et inversement (il faut toutefois faire attention aux variables réservées comme i ou I et aux délimiteurs de blocs {} ou d'ensemble, ainsi qu'à quelques instructions comme subs). Il faut faire attention toutefois que certains progs écrits en mode maple sous xcas ne passeront pas avec maple, en particulier si on utilise les noms francisés de commande.

ergibil
Messages : 9
Inscription : dim. juin 07, 2009 6:41 pm

Problème fonction input

Message par ergibil » ven. juin 12, 2009 7:44 pm

Merci pour les informations!
J'ai peut-être une info pour vous.......
J'avais remarqué comme d'autres utilisateurs je pense un problème pour la fonction input("a",a) dans une fonction ou une procédure lorsque a est déclaré comme variable locale. En effet, la fonction donne à la variable locale a le nombre 0 quelque soit la valeur donnée pour a.
Le problème disparaît lorsque l'on déclare a comme variable globale.

Bizarre non ?

Bonne soirée

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Message par parisse » sam. juin 13, 2009 6:44 am

Est-ce que le bug est encore présent dans la dernière version windows? Je viens de tester sous linux et ça marche.

ergibil
Messages : 9
Inscription : dim. juin 07, 2009 6:41 pm

Message par ergibil » sam. juin 13, 2009 10:26 pm

Je viens de rentrer le programme

dichotomie:=proc()
local a,b,m:
begin
input("borne inf",a);
print(a);
output("borne inf",a);
end_proc

une fenêtre s'ouvre avec la bonne valeur de a entrée (résultat de output) mais en ligne de commande il s'affiche a:0 (résultat de print(a)).

Par contre
dichotomie:=proc()
local b,m:
begin
input("borne inf",a);
print(a);
output("borne inf",a);
end_proc

j'obtiens la bonne valeur de a avec print.
:?

ergibil
Messages : 9
Inscription : dim. juin 07, 2009 6:41 pm

Message par ergibil » sam. juin 13, 2009 11:20 pm

deuxième essai :
avec le programme qui prend en entrée une fonction pour en déduire une valeur approchée de sa racine dans l'intervalle [binf,bsup]

dichotomie:=proc(fonct)
begin
input("borne inf",binf);
input("borne sup",bsup);
input("précision",prec);
f:=x->fonct;
while bsup-binf>prec do
mil:=approx((binf+bsup)/2);
if f(binf)*f(mil)>0
then binf:=mil;
else bsup:=mil;
end_if
end_while
print("borne inf",binf);
print("borne bsup",bsup);
output("borne inf",binf);
output("borne sup",bsup);
end_proc

le programme fonctionne très bien mais je suis obligé de ne pas utiliser la déclaration local bsup,binf,mil;
sinon il ne fonctionne pas.
Je pense qu'il y a un problème avec la déclaration des variables locales.

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Message par parisse » dim. juin 14, 2009 6:57 am

Bon, ca marche bien sous linux. Le probleme est un probleme windows avec input, je testerai en début de semaine sous win. Avez-vous bien testé avec la toute dernière version windows (qui date de lundi dernier)?
Sinon, pour le programme avec argument, l'argument est une expression dépendant de x, le nom de variable peut preter à confusion (faire croire que c'est une fonction). Il vaudrait peut-etre mieux soit passer en argument une fonction, soit passer en argument une expression et utiliser subst pour évaluer.

slejoly
Messages : 194
Inscription : sam. oct. 14, 2006 10:17 am
Localisation : Lorient

Re: Calculer pi à l'aide d'un cercle trigo

Message par slejoly » mar. juin 30, 2009 5:45 pm

J'ai essayé (syntaxe xcas):

Code : Tout sélectionner

dichotomie():={
local a,b,m; 
saisir("borne inf",a); 
afficher(a); 
output("borne inf",a); 
}:;
sous Mac et quand je tape ensuite dichotomie() la fenêtre ("borne inf") s'ouvre mais tout est bloqué (?).

Stéphane Lejoly

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Calculer pi à l'aide d'un cercle trigo

Message par parisse » mer. juil. 01, 2009 1:08 pm

En effet, probleme de focus. Je vais faire comme sous windows. L'image mac devrait etre mise a jour d'ici 16h.

Répondre