Démarrer en calcul formelR. De Graeve, B. Parisse, B. Ycart |
Xcas est un logiciel libre de calcul formel. Il est téléchargeable à partir de : xcas.univ-grenoble-alpes.fr ou utilisable directement en ligne depuis xcas.univ-grenoble-alpes.fr/nw/xcasfr.html
C’est un équivalent de Maple, avec lesquel il est
largement compatible. Il est possible de paramétrer Xcas pour qu’il
accepte les syntaxes de Python, Maple, ou des calculatrices TI (89, Voyage 200, Nspire CAS).
Nous nous limiterons à la syntaxe propre à Xcas
.
Ce cours d’introduction est destiné à faciliter la prise en main de Xcas par un utilisateur connaissant un peu de mathématiques (niveau terminale S, première année d’université scientifique), et ayant une pratique minimale de l’outil informatique.
Il est hors de question d’illustrer ici toutes les possibilités de Xcas. En particulier, nous ne parlerons ni de géométrie interactive, ni de la tortue logo, ni du tableur. Pour une pratique plus avancée, on se reportera à l’aide en ligne et aux différents documents disponibles à partir de la page d’accueil du logiciel.
Le but de ce qui suit est d’aider le débutant en introduisant quelques unes des commandes les plus courantes. Il est conseillé de lire ce document après avoir lancé Xcas (depuis un onglet du navigateur pour la version sans installation, ou sous Windows, cliquer sur le raccourci xcasfr.bat, sous linux, cliquer sur Xcas dans le menu Education ou en tapant depuis un Terminal xcas & puis la touche enter, sur Mac en cliquant sur xcas dans le menu Applications), et d’exécuter les commandes proposées une par une pour en comprendre l’effet.
Table des matières
- 1 Pour commencer
- 2 Les objets du calcul formel
- 3 Outils pour l’Analyse
- 4 Outils pour l’Algèbre
- 5 Représentations graphiques
- 6 Programmation
- 7 Des exercices corrigés avec Xcas
- 8 Vrai ou Faux ? (d’un point de vue informatique)
- 9 Exercices (niveau université)
Index
|
|
1 Pour commencer
1.1 Interface
Pour l’instant, vous allez simplement saisir vos premières commandes. L’interface offre bien d’autres possibilités que vous découvrirez ensuite. Elle apparaît comme suit au lancement de Xcas.
Vous pouvez la redimensionner. De haut en bas cette interface fait apparaître :
-
une barre de menu cliquable :
Fich
,Edit
,Cfg
,Aide
,CAS
,Expression
,Cmd
,Prg
,Graphic
,Geo
,Tableur
,… - un onglet indiquant le nom de la session, ou Unnamed si la session n’a pas encore été sauvegardée (on peut ouvrir plusieurs sessions en parallèle et donc avoir plusieurs onglets représentant ces sessions),
- une zone de gestion de la session avec :
-
un bouton
?
pour ouvrir l’index de l’aide, - une barre-bouton
Save
pour sauvegarder la session, - un bouton affichant la configuration du CAS
Config: exact real ...
et permettant de la modifier, - un bouton rouge
STOP
permettant d’interrompre un calcul trop long, - un bouton
Kbd
pour faire apparaitre un clavier ressemblant à celui d’une calculatrice (on peut le voir ci-dessus). Il peut faciliter vos saisies, peut faire afficher une fenêtre de messages avec touche Kbd->msg (ou avec le menu Cfg->Montrer->msg) et afficher le bandeau des commandes avec la touche Kbd->cmds (ou avec le menu Cfg->Montrer->bandeau) - un bouton
x
pour fermer la session,
-
un bouton
- une zone rectangulaire blanche numérotée 1 (première ligne
de commande) dans laquelle vous pouvez taper
votre première commande (cliquez si nécessaire pour faire
apparaitre le curseur dans
cette ligne de commande) :
1+1
, suivi de la touche "Entrée" ("Enter" ou "Return" selon les claviers). Le résultat apparaît au-dessous, et une nouvelle ligne de commande s’ouvre, numérotée 2.
Vous pouvez modifier l’aspect de l’interface et sauvegarder vos
modifications pour les utilisations futures (menu Cfg
).
Vous n’avez pour l’instant qu’à
entrer des commandes dans les lignes de commandes successives.
Si vous utilisez la
version html de ce cours, vous pouvez exécuter les commandes
proposées en tapant sur le bouton exe.
Chaque ligne de commande saisie est exécutée par la
touche "Entrée". Essayez par exemple d’exécuter les
commandes suivantes :
Toutes les commandes sont gardées en mémoire.
Vous pouvez donc remonter dans l’historique de votre session pour faire
afficher à nouveau des commandes antérieures avec Ctrl+
pour par exemple les modifier. Essayez, par exemple, en modifiant les
commandes précédentes d’exécuter aussi :
1/3+3/4; solve(a*x+b*x+c,x);
On obtient alors
On peut alors voir apparaitre, sur la droite, une barre de scroll permettant de
se déplacer dans les niveaux de la session et ici par exemple d’avoir
accès au niveau 8.
Le menu Edit
vous permet de préparer des sessions plus
élaborées qu’une simple succession de commandes. Vous pouvez
créer des groupes de lignes de commandes (sections),
ajouter des commentaires ou fusionner des niveaux en un seul niveau.
1.2 Les commandes et l’aide en ligne
Les commandes sont regroupées par thèmes dans les
menus du bandeau supérieur : Outils
, Expression
,Cmds
,
Prg
, Graphe
,
Geo
, Tableur
, Phys
, Scolaire
, Tortue
.
Certains menus sont des menus dit menus "Assistant" parce qu’ils
contiennent
une sélection des commandes les plus utiles,
classées par thème et explicitées (menu Outils) ou parce
qu’une boite de dialogue vous demande de
préciser les paramètres de la commande choisie (menu
TableurMaths ou menu Graphic).
Les autres menus contiennent les noms des commandes :
le menu Cmds contient les commandes de calcul formel,
le menu Prg contient les commandes que l’on utilise en
programmation,
le menu Geo contient les commandes de géométrie...
Lorsqu’on sélectionne une commande dans un menu,
-
soit une boite de dialogue s’ouvre vous permettant de spécifier
les arguments de la commande (par exemple pour tracer une courbe
depuis le menu
Graphe
ou pour faire des statistiques depuis le menu TableurMaths, - soit la commande est recopiée dans la ligne de commande. Pour connaitre
la syntaxe de cette commande, appuyez sur le bouton
?
en haut à gauche, ou faites afficher la zone deMessages
(en utilisant le menuCfg->Montrer->msg
).
Vous pouvez aussi :-
ouvrir l’index de l’aide à la commande sélectionnée
(cela est automatique si on a cocher la case
Aide index automatique
dans le menu de configuration générale :Cfg
->Configuration generale
). Il faut alors cliquer sur le bouton OK pour que la commande soit recopiée dans la ligne de commande à condition que le curseur soit dans une ligne de commande.
utoriel.tex Vous pouvez aussi cliquer sur le boutonDetails
pour afficher la page du manuel correspondant à la commande dans votre navigateur. - ouvrir automatiquement la page correspondante du manuel dans votre
navigateur, en cochant la case
Aide HTML automatique
dans le menu de configuration générale (Cfg
->Configuration generale
).
-
ouvrir l’index de l’aide à la commande sélectionnée
(cela est automatique si on a cocher la case
Le menu Aide
contient les différentes formes d’aide possible :
un guide de l’utilisateur (interface), un guide de référence
(Manuels->Calcul formel
, aide detaillée sur chaque commande),
un Index
(liste des commandes classées par ordre
alphabétique avec une ligne d’entrée permettant de se déplacer
facilement) et une recherche par mots clefs.
Si vous connaissez déjà le nom d’une commande et que vous désirez
vérifier sa syntaxe (par exemple factor
), vous pouvez
saisir le début du nom de commande
(disons fact
) puis taper sur la touche de tabulation
(située à gauche de la touche A sur un clavier
français) ou cliquer sur le bouton ?
en haut à gauche.
L’index des commandes apparaît alors dans une fenêtre, positionné
à la première complétion possible, avec une aide succinte sur chaque
commande.
Par exemple, vous voulez factoriser un polynôme, vous supposez que le nom de
commande commence par fact
, vous tapez donc fact
puis
la touche de tabulation, vous sélectionnez à la souris
factor
(ou un des exemples) puis vous cliquez sur OK.
Vous pouvez aussi saisir ?factor
pour avoir l’aide succinte
en réponse. Si le nom que vous avez saisi n’est pas reconnu, des
commandes proches vous sont suggérées.
1.3 Entrer des commandes
L’exécution d’une ligne se fait simplement par la touche "Entrée".
Si on ne souhaite pas afficher le résultat, on termine la ligne de commande
par :;
et on valide avec "Entrée".
On peut éditer plusieurs commandes à la file avant leur exécution
à condition de les séparer par un point-virgule.
Au début, de nombreuses erreurs proviennent d’une
mauvaise traduction des mathématiques : Xcas ne peut pas les comprendre
telles que vous les écrivez. Votre clavier vous
permet de taper , mais votre ordinateur ne peut pas
comprendre que vous souhaitez élever au carré, le multiplier
par , etc… Vous devez spécifier chaque opération, et la
syntaxe correcte est a*x^2+b*x+c
.
La multiplication doit être notée par une étoile
dans les commandes, mais est notée par un point dans
les réponses. Nous insistons sur le fait que pour Xcas, ax
est
une variable dont le nom comporte deux lettres, et pas le produit de a
par x
.
Opérations | |
+ | addition |
- | soustraction |
* | mutiplication |
/ | division |
^ | puissance |
Modulo quelques précautions, l’écriture des formules est assez directe. Les parenthèses ont le sens usuel pour spécifier l’ordre des opérations. Les crochets sont réservés aux listes et aux indices. Les priorités entre opérations sont standard (la multiplication est prioritaire sur l’addition, la puissance sur la multiplication). Par exemple :
-
2*a+b
retourne a/2*b
retourne
a/2/b
retournea^2*b
retourne
Dans le doute, il est toujours prudent de mettre des parenthèses pour s’assurer que l’ordre des opérations est celui souhaité.
Les commandes sont numérotées, ainsi que les réponses,
mais, si vous avez modifié une ligne de commande, celle-ci
garde le numéro qu’elle avait. On peut rappeler par ans()
(answer) la
réponse précédente c’est à dire la réponse de la dernière commande
évaluée (attention, il s’agit bien de la dernière commande
exécutée, qui peut ne pas être celle du niveau juste au-dessus).
2 Les objets du calcul formel
2.1 Les nombres
Les nombres peuvent être exacts ou approchés.
Les nombres exacts sont les constantes prédéfinies, les entiers,
les fractions d’entiers et plus généralement toute expression
ne contenant que des entiers et des constantes, comme
sqrt(2)*e^(i*pi/3)
.
Les nombres approchés sont notés avec la notation scientifique
standard : partie entière suivie du point de séparation
et partie fractionnaire (éventuellement
suivie de e
et d’un exposant).
Par exemple, 2
est un entier exact,
2.0
est la version approchée du même
entier; 1/2
est un rationnel, 0.5
est la version approchée du même
rationnel.
Xcas peut gérer des nombres entiers en précision arbitraire :
essayez de taper 500!
et comptez le nombre de chiffres
de la réponse.
On passe d’une valeur exacte à une valeur approchée par
evalf
, on transforme une valeur approchée en un rationnel
exact par exact
Les calculs sont effectués en mode exact si tous les nombres qui
interviennent sont exacts. Ils sont effectués en mode approché si
un des nombres est approché. Ainsi
1.5+1
renvoie un nombre approché alors que 3/2+1
renvoie un nombre exact.
Pour les nombres réels approchés, la précision par défaut est
proche de 14 chiffres significatifs (la précision relative est de 48
bits pour les réels flottants normalisés).
Elle peut être augmentée, en
donnant le nombre de décimales désiré
comme second argument de evalf
.
On peut aussi changer la précision par défaut pour tous les
calculs en modifiant
la variable Digits
.
La lettre i
est réservée à et ne peut être
réaffectée ; en particulier on ne peut pas l’utiliser comme indice
de boucle.
Xcas distingue l’infini non signé infinity
(), de
+infinity
ou inf
() et de -infinity
ou -inf
().
Constantes prédéfinies | |
pi | |
e | |
i | |
infinity | |
+infinity ou inf | |
-infinity ou -inf |
2.2 Les caractères et les chaînes
Une chaîne est parenthésée par des guillemets ("). Un caractère est une chaîne ayant un seul élément.
Chaînes | |
asc | chaîne->liste des codes ASCII |
char | liste des codes ASCII->chaîne |
size | nombre de caractères |
concat ou + | concaténation |
mid | morceau de chaîne |
head | premier caractère |
tail | chaîne sans le 1ier caractère |
string | nombre ou expression->chaîne |
expr | chaîne->nombre (base 10 ou 8) ou expression |
2.3 Les variables
On dit qu’une variable est formelle si elle ne contient aucune valeur :
toutes les variables sont formelles tant qu’elles n’ont pas été
affectées (à une valeur).
L’affectation est notée :=
. Au début
de la session a
est formelle, elle devient affectée après l’instruction
a:=3
, a
sera alors remplacé par 3 dans tous
les calculs qui suivent, et a+1
renverra 4.
Xcas conserve tout le contenu de votre session. Si vous voulez que la variable
a
après l’avoir affectée, soit à nouveau une variable formelle, il
faut la "vider" par purge(a)
. Dans les exemples qui suivent, les
variables utilisées sont supposées avoir été purgées avant chaque
suite de commandes.
Il ne faut pas confondre
-
le signe
:=
qui désigne l’affectation - le signe
==
qui désigne une égalité booléenne : c’est une opération binaire qui retourne 1 ou 0 (1 pour true qui veut dire Vrai et 0 pour false qui veut dire Faux) - le signe
=
utilisé pour définir une équation.
On peut faire certains types d’hypothèses sur une variable avec
la commande assume
, par exemple assume(a>2)
. Une
hypothèse est une forme spéciale d’affectation, elle efface
une éventuelle valeur précédemment affectée à la variable.
Lors d’un calcul, la variable n’est pas remplacée mais
l’hypothèse sera utilisée dans la mesure du possible, par exemple
abs(a)
renverra a
si on fait l’hypothèse a>2
.
La fonction subst
permet de remplacer une variable dans une
expression par un nombre ou une autre expression,
sans affecter cette variable.
Remarque avancée : pour stocker une valeur dans une variable par référence,
par exemple pour modifier une valeur dans une liste (un vecteur, une
matrice), sans recréer une nouvelle liste mais en modifiant
en place la liste existante, on utilise l’instruction =<
au lieu de :=
.
Cette instruction est plus rapide que l’instruction :=
, car
elle économise le temps de copie de la liste, mais peut avoir des
effets de bord inattendus si on ne comprend pas ce qu’est un passage
par référence.
2.4 Les expressions
Une expression est une combinaison de nombres et de variables
reliés entre eux par des opérations : par exemple
x^2+2*x+c
.
Lorsqu’on valide une commande, Xcas
remplace les variables par leur valeur si elles en ont une,
et exécute les opérations.
Certaines opérations de simplification sont exécutées
automatiquement lors d’une évaluation :
- les opérations sur les entiers et sur les fractions, y compris la mise sous forme irréductible
- les simplifications triviales comme , , …
- quelques formes trigonométriques comme , , …
Nous verrons dans la section suivante comment obtenir plus de simplifications.
2.5 Développer et simplifier
En-dehors des règles de la section précédente, il n’y a pas de simplification systématique. Il y a deux raisons à cela. La première est que les simplifications non triviales sont parfois coûteuses en temps, et le choix d’en faire ou non est laissé à l’utilisateur ; la deuxième est qu’il y a en général plusieurs manières de simplifier une même expression, selon l’usage que l’on veut en faire. Les principales commandes pour transformer une expression sont les suivantes :
-
expand
: développe une expression en tenant compte uniquement de la distributivité de la multiplication sur l’addition et du développement des puissances entières. -
normal
etratnormal
: d’un bon rapport temps d’exécution-simplification, elles écrivent une fraction rationnelle (rapport de deux polynômes) sous forme de fraction irréductible développée;normal
tient compte des nombres algébriques (par exemple commesqrt(2)
) mais pasratnormal
. Les deux ne tiennent pas compte des relations entre fonctions transcendantes (par exemple commesin
etcos
). -
factor
: un peu plus lente que les précédentes, elle écrit une fraction sous forme irréductible factorisée. -
simplify
: elle essaie de se ramener à des variables algébriquement indépendantes avant d’appliquernormal
. Ceci est plus coûteux en temps et "aveugle" (on ne contrôle pas les réécritures intermédiaires). Les simplifications faisant intervenir des extensions algébriques (par exemple des racines carrées) nécessitent parfois deux appels et/ou des hypothèses (assume
) pour enlever des valeurs absolues avant d’obtenir la simplification souhaitée. -
tsimplify
essaie de se ramener à des variables algébriquement indépendantes mais sans appliquernormal
ensuite.
Dans le menu Expression
du bandeau supérieur, les sous-menus sont
des menus de réécriture et contiennent d’autres fonctions, pour des
transformations plus ou moins spécialisées.
La fonction convert
permet de passer d’une expression à une
autre équivalente, sous un format qui est spécifié par le
deuxième argument.
Transformations | |
simplify | simplifier |
tsimplify | simplifier (moins puissant) |
normal | forme normale |
ratnormal | forme normale (moins puissant) |
expand | développer |
factor | factoriser |
assume | rajout d’hypothèses |
convert | transformer en un format spécifié |
2.6 Les fonctions
De nombreuses fonctions sont déjà définies dans Xcas, en
particulier les fonctions classiques. Les plus courantes figurent dans
le tableau ci-après; pour les autres, voir le menu Cmds->Reel->Special
.
Sinon l’utilisateur peut définir ses propre fonctions, par exemple :
-
Définition d’une fonction d’une variable :
f(x):=x*exp(x) ou
f:=x->x*exp(x) ou
f:=unapply(x*exp(x),x) - Définition de sa dérivée :
g:=function_diff(f) ou
g:=unapply(diff(f(x),x),x))
ATTENTION g(x):=diff(f(x),x) N’EST PAS VALABLE ! car ce qui est à droite de := n’est pas évalué lors de la définition....il faut utiliser unapply. - Définition d’une fonction de 2 variables :
h(r,t):=(r*exp(t),r*t) ou
h:=(r,t)->(r*exp(t),r*t); - Définition à partir d’une fonction de 2 variables, d’une fonction qui
à 1 variable fait correspondre une fonction:
k(t):=unapply(h(r,t),r)
ATTENTION Ici k(t) est une fonction de la variable r qui à r fait correspondre h(r,t). On a par exemple : k(1)(2)=(2*exp(1),2). Là aussi, il faut utiliser unapply.
Fonctions classiques | |
abs | valeur absolue |
sign | signe (-1,0,+1) |
max | maximum |
min | minimum |
round | arrondi |
floor | partie entière (plus grand entier ) |
frac | partie fractionnaire |
ceil | plus petit entier |
re | partie réelle |
im | partie imaginaire |
abs | module |
arg | argument |
conj | conjugué |
affixe | affixe |
coordonees | coordonnées |
factorial ou ! | factorielle |
sqrt | racine carrée |
exp | exponentielle |
log | logarithme naturel |
ln | logarithme naturel |
log10 | logarithme en base 10 |
sin | sinus |
cos | cosinus |
tan | tangente |
cot | cotangente |
asin | arc sinus |
acos | arc cosinus |
atan | arc tangente |
sinh | sinus hyperbolique |
cosh | cosinus hyperbolique |
tanh | tangente hyperbolique |
asinh | argument sinus hyperbolique |
acosh | argument cosinus hyperbolique |
atanh | argument tangente hyperbolique |
Pour créer une nouvelle fonction, il faut la déclarer à l’aide
d’une expression contenant la variable.
Par exemple l’expression est
définie par x^2-1
. Pour la transformer en la fonction qui
à associe , trois possibilités existent :
f(x):= x^2-1; f:=x->x^2-1; f:=unapply(x^2-1,x);
Si f
est une fonction d’une variable et E
est une
expression, f(E)
est une autre expression.
Il est essentiel de ne pas confondre fonction et expression.
Si on définit : E:=x^2-1
, alors la variable E
contient l’expression . Pour avoir la valeur de cette
expression en il faut
écrire subst(E,x=2)
et non E(2)
car E
n’est pas une fonction.
Lorsqu’on définit une fonction,
le membre de droite de l’affectation n’est pas évalué.
Ainsi l’écriture E:=x^2-1; f(x):=E
définit la fonction car E
n’est pas évalué.
Par contre E:= x^2-1; f:=unapply(E,x)
définit bien la
fonction car E
est évalué.
On peut ajouter et multiplier des fonctions,
par exemple f:=sin*exp
. Pour composer des fonctions, on utilise
l’opérateur @
et pour composer plusieurs fois une fonction
avec elle-même, on utilise l’opérateur @@
.
On peut définir des fonctions de plusieurs variables à valeurs dans
comme :
f(x,y):=x+2*y
et des fonctions de plusieurs variables à valeurs dans
par exemple :
f(x,y):=(x+2*y,x-y)
2.7 Listes, séquences, ensembles
Xcas distingue plusieurs sortes de collections d’objets, séparés par des virgules :
- les listes (entre crochets)
- les séquences (entre parenthèses)
- les ensembles (entre pourcentage-accolades)
Les listes peuvent contenir des listes (c’est le cas des matrices),
alors que les séquences sont plates (un élément d’une séquence
ne peut pas être une séquence). Dans un ensemble,
l’ordre n’a pas d’importance et chaque objet est unique.
Il existe une autre structure, appelée table, dont nous
reparlerons plus loin.
Il suffit de mettre une séquence entre crochets pour en faire une liste
ou entre accolades précédées de %
pour en faire un ensemble.
On passe d’une liste à sa séquence associée par op
,
d’une séquence à sa liste associée en la mettant entre crochets
ou avec la fonction nop
.
Le nombre d’éléments d’une liste est donné par size
(ou nops
).
Pour fabriquer une liste ou une séquence, on utilise des commandes
d’itération comme $
ou seq
(qui itèrent une
expression) ou makelist
(qui définit une liste à l’aide d’une
fonction).
1$5;k^2 $ (k=-2..2);[k^2$(k=-2..2)]
La séquence vide est notée NULL
, la liste vide
[]
. Pour ajouter un élément à une séquence il suffit
d’écrire la séquence et l’élément séparés par une virgule.
Pour ajouter un
élément à une liste on utilise append
.
On accède à un élément d’une liste ou d’une séquence grâce
à son indice mis entre
crochets, le premier élément étant d’indice 0.
se:=NULL; se:=se,k^2$(k=-2..2); se:=se,1 li:=[1,2]; (li:=append(li,k^2))$(k=-2..2) li[0],li[1],li[2]
Les polynômes sont souvent définis par une expression, mais
ils peuvent aussi être représentés
par la liste de leurs coefficients par ordre
de degré décroissant, avec comme délimiteurs poly1[
et ]
.
Il existe aussi une représentation non symbolique
pour les polynômes à plusieurs variables. Les fonctions
symb2poly
et poly2symb
permettent
de passer de la représentation expression à la représentation
par liste et inversement,
le deuxième argument détermine s’il s’agit de polynômes
en une variable (on met le nom de la variable) ou de
polynômes à plusieurs variables (on met la liste des variables).
Séquences et listes | |
E$(k=n..m) | créer une séquence |
seq(E,k=n..m) | créer une séquence |
[E$(k=n..m)] | créer une liste |
makelist(f,k,n,m,p) | créer une liste |
op(li) | passer de liste à séquence |
nop(se) | passer de séquence à liste |
nops(li) | nombre d’éléments |
size(li) | nombre d’éléments |
sum | somme des éléments |
product | produit des éléments |
cumSum | sommes cumulées des éléments |
apply(f,li) | appliquer une fonction aux éléments d’une liste |
map(li,f) | appliquer une fonction aux éléments d’une liste |
map(li,f,matrix) | appliquer une fonction aux éléments d’une matrice |
poly2symb | polynôme associé à une liste |
symb2poly | coefficients d’un polynôme |
2.8 Temps de calcul, place mémoire
Le principal problème du calcul formel est la complexité des
calculs intermédiaires. Elle se traduit à la fois par le temps
nécessaire à l’exécution des commandes et par la place mémoire
requise. Les algorithmes implémentés dans les fonctions
de Xcas sont en principe performants, mais ils ne
peuvent pas être optimaux dans tous les cas. La fonction time
permet de connaître le temps d’exécution d’une commande (si ce temps
est très court, Xcas exécute plusieurs fois la commande pour
afficher un résultat plus précis). La mémoire utilisée
apparaît dans les versions Unix dans la ligne d’état
(la barre-bouton). Si le temps d’exécution d’une
commande dépasse quelques secondes, il est possible que vous ayez
commis une erreur de saisie. N’hésitez pas à interrompre
l’exécution (bouton rouge STOP
en haut à droite, il est
conseillé de faire une sauvegarde de votre session auparavant).
3 Outils pour l’Analyse
3.1 Dérivées
La fonction diff
permet de calculer la dérivée d’une
expression par rapport à une ou plusieurs de ses variables. Pour
dériver une fonction ,
on peut appliquer diff
à l’expression , mais alors le
résultat est une expression. Si on souhaite définir la fonction
dérivée, il faut utiliser function_diff
.
Il ne faut pas définir la fonction dérivée par
f1(x):=diff(f(x))
, car dans cette définition, x
aurait
deux sens incompatibles : c’est d’une part la
variable formelle de dérivation et d’autre part l’argument
de la fonction f1
. D’autre part, cette définition
évaluerait diff
à chaque appel de la fonction (car
le membre de droite d’une affectation n’est jamais évalué), ce
qui serait inefficace.
Il faut utiliser
f1:=function_diff(f)
,
ou
f1:=unapply(diff(f(x)),x)
.
La fonction diff
s’applique à n’importe quelle combinaison de
variables, et permet de calculer des dérivées partielles
successives.
Si le deuxième argument de diff
est une liste, une
liste de dérivées est retournée. Par exemple pour calculer
le gradient de :
diff(sin(x*y),[x,y])
(on peut aussi utiliser grad
).
Des commandes particulières permettent de calculer les
combinaisons classiques de dérivées partielles.
Dérivées | |
diff(ex,t) | dérivée d’une expression par rapport à t |
function_diff(f) | fonction dérivée d’une fonction |
diff(ex,x$n,y$m) | dérivées partielles |
grad | gradient |
divergence | divergence |
curl | rotationnel |
laplacian | laplacien |
hessian | matrice hessienne |
3.2 Limites et développements limités
La fonction limit
calcule les limites finies ou
infinies, quand elles existent. On peut demander une limite
à gauche ou à droite à l’aide d’un quatrième argument (+1 ou -1).
Quand la fonction dépend d’un
paramètre, la limite obtenue peut dépendre des hypothèses
faites, avec la fonction assume, sur ce paramètre.
Pour les développements limités,
deux fonctions sont disponibles, series
et taylor
. La
différence est que l’ordre du développement doit être
spécifié pour series
, il est égal à 6 par défaut
pour taylor
.
L’ordre du développement limité demandé est utilisé par
Xcas en interne pour faire ses développements. En cas de
simplifications, l’ordre du développement obtenu pourra être inférieur,
il faudra alors recommencer le calcul avec un ordre plus grand. L’expression
retournée est constituée du polynôme de Taylor, plus un reste
dans lequel apparaît une fonction order_size
qui est
presque toujours un (i.e. une fonction bornée, plus précisément si
la fonction order_size
tend vers l’infini, elle le fait lentement, en vérifiant
pour tout , order_size
() tend vers
quand tend vers ). Pour supprimer le reste et ne garder
que le polynôme de Taylor, on peut utiliser convert
avec l’option
polynom.
Limites et développements limités | |
limit(ex,x,a) | limite en a |
limit(ex,x,a,1) | limite à droite en a |
limit(ex,x,a,-1) | limite à gauche en a |
taylor(ex,a) | développement limité en ordre 6 |
series(ex,a,n) | développement limité en ordre |
3.3 Primitives et intégrales
La fonction integrate
calcule une primitive d’une expressionpar rapport à
ou par rapport à la variable donnée en argument. Si
l’expression comporte plusieurs variables, il vaut préciser la
variable d’intégration. Si on ajoute deux arguments et
après la variable d’intégration, on calcule l’intégrale sur
l’intervalle . Eventuellement les
bornes de l’intégrale peuvent être des expressions, ce qui permet
de calculer des intégrales multiples.
Pour calculer une intégrale, un logiciel de calcul formel recherche
une primitive puis l’évalue entre les bornes, afin d’obtenir
une valeur exacte. Dans certains cas, il est inutile de calculer
une primitive, soit parce qu’il n’en existe pas qui s’exprime
avec les fonctions élémentaires, soit
parce qu’un calcul numérique est plus adapté (par exemple si
le temps de calcul de la primitive est trop long, si la fonction
présente des singularités dans l’intervalle d’intégration, etc…).
Dans ce cas, on demande une valeur approchée en utilisant
evalf
, ou bien on utilise directement
la fonction romberg
, qui est
appelée par evalf
.
Intégrales | |
integrate(E) | primitive d’une expression |
integrate(E,x,a,b) | intégrale exacte |
gaussquad(E,x,a,b) | intégrale approchée |
3.4 Résolution d’équations
Comme pour les intégrales on distingue :
- la résolution exacte qui renvoie toutes les solutions lorsque c’est possible (par exemple pour certaines équations polynomiales ou s’y ramenant)
- la résolution approchée qui calcule par un algorithme itératif une valeur proche d’une des solutions.
La résolution exacte s’effectue à l’aide de solve
, dont le
premier argument est une équation. Le membre de droite est
supposé nul s’il n’est pas précisé. Par
défaut solve
ne retourne pas les solutions complexes.
Pour les obtenir, il faut cocher Complexe
dans la configuration du CAS
(Cfg->Configuration de CAS ou sur la barre-bouton
Config :exact...)
Exécutez les commandes suivantes
avant et après avoir activé l’option Complex
.
Les racines exactes sont calculées pour les polynômes de
degré 1 et 2 (les formules de Cardan et Ferrari pour les degrés
3 et 4 ne sont pas utilisées, car les solutions obtenues
ne sont pas facilement maniables). En degré supérieur,
la fonction solve
affiche un message d’erreur et renvoie
une liste vide.
Pour les équations trigonométriques, les solutions principales
sont renvoyées. Pour obtenir toutes les solutions, il faut activer
l’option All_trig_sol
. Comparer les commandes suivantes avec et
sans cette option.
La fonction solve
peut aussi résoudre des systèmes
d’équations. Le premier argument est la liste des équations, le
second est la liste des variables.
La fonction de résolution approchée est fsolve
. Elle
propose en option différents algorithmes
(menus Calc->Num_solve_eq
et Calc->Num_solve_syst
).
Le plus célèbre est
l’algorithme de Newton, qui a de multiples variantes. Le principe
général de tous ces algorithmes est de calculer les termes
successifs d’une suite qui converge vers une solution de l’équation
ou du système proposé. Il faut pour cela choisir selon les cas
un point de départ, ou un intervalle de recherche.
Equations | |
solve(eq,x) | résolution exacte d’une équation |
solve([eq1,eq2],[x,y]) | résolution exacte d’un système |
fsolve(eq,x) | résolution approchée d’une équation |
fsolve([eq1,eq2],[x,y]) | résolution approchée d’un système |
newton | méthode de Newton |
linsolve | système linéaire |
proot | racines approchées d’un polynôme |
3.5 Equations différentielles
Comme dans les deux sections précédentes, on distingue le
calcul exact, qui n’est pas toujours possible, du calcul
approché. La résolution exacte s’effectue par desolve
.
Les dérivées de la fonction inconnue peuvent s’écrire ,
, qui sont traduits en diff(y)
, diff(diff(y))
.
Si on ne spécifie pas de condition initiale, le résultat est donné
en fonction de constantes arbitraires.
Les conditions initiales sont vues comme des équations
supplémentaires, qui forment une liste avec l’équation
différentielle.
La fonction odesolve
permet de résoudre par des méthodes
numériques une équation différentielle passant par
un point . Par exemple
permet de calculer où est la solution de ,
telle que .
La fonction plotode
représente graphiquement
la solution d’une équation différentielle,
plotfield
représente le champ
des tangentes. La fonction
interactive_odeplot
représente le champ
des tangentes et permet de cliquer sur le graphique pour tracer
les solutions passant par les points cliqués.
erase() interactive_plotode(sin(x*y),[x,y])
Equations différentielles | |
desolve | résolution exacte |
odesolve | résolution approchée |
plotode | tracé de trajectoire |
plotfield | tracé d’un champ de vecteurs |
interactive_plotode | interface cliquable |
4 Outils pour l’Algèbre
4.1 Arithmétique des entiers
Les opérations sur les entiers figurent dans le menu
Cmds->Entier
.
Les calculs modulo se font en
utilisant % p
. Une fois défini un entier modulo , disons
a:=3%5
, tous les calculs seront efffectués dans
: a*2
renvoie 1%5
(6 modulo 5),
1/a
renvoie 2%5
, …
Pour calculer efficacement les puissances modulo , on peut utiliser ce qui
précède, ou la fonction powermod
ou powmod
.
Nombres entiers | |
a%p | modulo |
powmod(a,n,p) | modulo |
irem | reste de la division euclidienne |
iquo | quotient de la division euclidienne |
iquorem | quotient et reste |
ifactor | décomposition en facteurs premiers |
ifactors | liste des facteurs premiers |
idivis | liste des diviseurs |
gcd | plus grand diviseur commun |
lcm | plus petit multiple commun |
iegcd | identité de Bezout |
iabcuv | renvoie tels que |
is_prime | l’entier est-il premier |
nextprime | prochain entier premier |
previousprime | entier premier précédent |
4.2 Polynômes et fractions rationnelles
Les fonctions de traitement des polynômes sont dans le menu
Cmds->Polyn\^omes
.
On utilise normal
ou expand
pour développer, ou plus généralement mettre une fraction
sous forme irréductible, et factor
pour
factoriser.
Le résultat dépend du corps de nombres dans lequel on
se place. Par défaut il s’agit des rationnels si les coefficients
sont exacts ou des réels sinon. Pour les complexes
(exacts ou approchées), il
faut activer l’option Complexe
à partir du bouton rappelant la configuration Config:...
. On peut aussi déclarer les
coefficients comme des
entiers modulo pour travailler dans (commande %
)
ou dans un corps
fini (défini par la commande GF
). Exécutez les
commandes suivantes avant et après avoir activé l’option
Complexe
.
Polynômes | |
normal | forme normale (développée et réduite) |
expand | forme développée |
ptayl | forme de Taylor |
peval ou horner | évaluation en un point par l’algorithme de Horner |
genpoly | polynôme défini par sa valeur en un point |
canonical_form | trinôme sous forme canonique |
coeff | (liste des) coefficient(s) |
poly2symb | de l’expression algébrique à la forme symbolique |
symb2poly | de la forme symbolique à l’expression algébrique |
pcoeff | polynôme décrit par ses racines |
degree | degré |
lcoeff | coefficient du terme de plus haut degré |
valuation | degré du monôme de plus bas degré |
tcoeff | coefficient du terme de plus bas degré |
factor | décomposition en facteurs premiers |
factors | liste des facteurs premiers |
divis | liste des diviseurs |
collect | factorisation sur les entiers |
froot | racines avec leurs multiplicités |
proot | valeurs approchées des racines |
sturmab | nombre de racines dans un intervalle |
getNum | numérateur d’une fraction rationnelle |
getDenom | dénominateur d’une fraction rationnelle |
propfrac | isole partie entière et fraction propre |
partfrac | décomposition en éléments simples |
quo | quotient de la division euclidienne |
rem | reste de la division euclidienne |
gcd | plus grand diviseur commun |
lcm | plus petit multiple commun |
egcd | identité de Bezout |
divpc | division suivant les puissances croissantes |
randpoly | polynôme aléatoire |
cyclotomic | polynômes cyclotomiques |
lagrange | interpolation de Lagrange |
hermite | polynômes de Hermite |
laguerre | polynômes de Laguerre |
tchebyshev1 | polynômes de Tchebyshev |
tchebyshev2 | polynômes de Tchebyshev |
4.3 Trigonométrie
Le menu Cmds->R\'eel->Transcendental
contient
les fonctions circulaires et hyperboliques ainsi que leurs inverses.
Pour linéariser et
développer on utilise tlin
et texpand
. Beaucoup
d’autres réécritures sont accessibles à partir des menus
-
Expression->Trigo
: transformations en (halftan), transformation des tangentes en sinus et cosinus (tan2sincos), … Expression->Trigo exp
: transformation des fonctions trigonométriques en exponentielles par les formules d’Euler (trig2exp), transformation des exponentielles en fonctions trigonométriques (exp2trig), transformation des exponentielles en puissances (exp2pow)...,Expression->Trigo inv
: transformation des fonctions inverses
Trigonométrie | |
tlin | linéariser |
tcollect | linéariser et regrouper |
texpand | forme polynomiale |
trig2exp | trigonométrique vers exponentielle |
exp2trig | exponentielle vers trigonométrique |
hyp2exp | hyperbolique vers exponentielle |
4.4 Vecteurs et matrices
Un vecteur est une liste de nombres, une matrice est la liste de ses
vecteurs lignes. Le produit matriciel est noté comme le produit
ordinaire *
. Les vecteurs sont a priori des vecteurs lignes,
mais le produit à droite par un vecteur ligne est effectué comme
si c’était une colonne. En particulier, si v
et w
sont deux vecteurs de même taille, v*w
retourne leur produit
scalaire.
À partir d’une fonction qui à deux indices associe un réel
, on peut constituer une matrice avec makemat
ou
matrix
. Pour makemat
les indices commencent à 0, pour
matrix
il commencent à 1.
On peut aussi créer des matrices par blocs avec la commande
blockmatrix
.
On accède à un élément d’une matrice grâce à deux indices
séparés par une virgule et mis entre
crochets. Le premier indice est l’indice de la ligne et le deuxième
celui de la colonne. Les indices commencent à 0.
Par exemple, si A:=[[0,2],[1,3],[2,4]]
alors
A[2,1]
renvoie 4
.
Pour extraire un bloc de la matrice, on utilise des intervalles
comme indices : A[1..2,0..1]
renvoie le bloc
constitué des lignes 1 à 2 et des colonnes 0 à 1.
Notez que les matrices de Xcas sont recopiées entièrement à chaque modification d’un coefficient. Ceci est pénalisant si on modifie successivement dans un programme beaucoup de coefficients d’une même (grande) matrice.
Vecteurs et matrices | |
v*w | produit scalaire |
cross(v,w) | produit vectoriel |
A*B | produit matriciel |
A.*B | produit terme à terme |
1/A | inverse |
tran | transposée |
rank | rang |
det | déterminant |
ker | base du noyau |
image | base de l’image |
idn | matrice identité |
ranm | matrice à coefficients aléatoires |
4.5 Systèmes linéaires
La fonction linsolve
résout une liste d’équations
linéaires, avec la même syntaxe que solve. On peut aussi utiliser
simult
pour résoudre plusieurs systèmes d’équations linéaires
qui ne diffèrent que par leur second membre, en mettant comme premier
argument la matrice du système et comme second argument la matrice dont la
(ou les) colonnes sont le (ou les) second membre(s) des systèmes, ou bien
rref
d’argument une matrice obtenue en bordant la matrice du système
avec lesecond membre (border(A,tran(b)) si b est une matrice
colonne). Quand le système est impossible, linsolve
retourne
la liste vide, simult
retourne un message d’erreur, rref
retourne une matrice dont une des lignes est nulle, sauf le dernier
coefficient. Quand le système est indéterminé, linsolve
retourne la solution fonction de certaines variables, simult
retourne seulement une solution, rref
retourne une matrice dont
une ou plusieurs lignes sont nulles. L’exemple ci-dessous concerne
le système
Il a une solution unique pour et , il est impossible pour
et il est indéterminé pour .
Systèmes linéaires | |
linsolve | résolution d’un système |
simult | résolution simultanée de plusieurs systèmes |
rref | réduction de Gauss-Jordan |
rank | rang |
det | déterminant du système |
4.6 Réduction des matrices
La fonction jordan
prend en entrée une matrice et retourne en
sortie une matrice de passage et une forme réduite de Jordan telles
que . Soit est diagonalisable auquel cas est
diagonale et contient les valeurs propres de sur la diagonale,
soit n’est pas diagonalisable et comporte des "1" ou des "0"
au-dessus de la diagonale. Pour les matrices exactes et symboliques,
seules les valeurs propres calculables par
solve
sont accessibles. Pour des matrices de nombres approchés,
un algorithme numérique est utilisé, et il risque
d’échouer en cas de valeurs propres multiples ou très proches.
La matrice de l’exemple qui suit a pour valeurs propres doubles 1
et 2. Elle est diagonalisable pour
, non diagonalisable pour .
Certaines fonctions, définies par des séries
entières, s’étendent aux matrices dès lors que l’on sait calculer
leur forme de Jordan. La plus utile est l’exponentielle.
Réduction des matrices | |
jordan | diagonalisation ou réduction de Jordan |
pcar | coefficients du polynôme caractéristique |
pmin | coefficients du polynôme minimal |
eigenvals | valeurs propres |
eigenvects | vecteurs propres |
5 Représentations graphiques
Pour obtenir une représentation graphique dans Xcas, il faut saisir une commande
dont la sortie est un objet graphique.
Pour vous aider à effectuer les représentations graphiques les plus courantes,
le menu Graphic
vous propose des boites de dialogue qui se chargent
de créer une ligne de commande et de le valider pour afficher le graphique souhaité.
Si vous souhaitez représenter plusieurs objets graphiques dans une même représentation,
vous devez séparer les commandes les créant par un ;
. Vous pouvez aussi créer
une figure (menu Geo
, Nouvelle figure
) et utiliser le menu Geo
pour créer des objets géométriques.
Chaque commande graphique crée un objet graphique 2-d ou 3-d, qui est traduit
en réponse par une image dans la fenêtre Xcas. A droite de cette
image, des boutons de zoom in
et out
permettent
d’agrandir ou de rapetisser la représentation, des flèches
permettent de la déplacer.
Les paramètres par défaut (en
particulier les intervalles de représentation en abscisse et
ordonnée) peuvent être changés dans la fenêtre de configuration
graphique accessible depuis le menu
Cfg->Configuration graphique
.
Notez enfin que les objets graphiques 2-d sont
aussi affichés dans une fenêtre appelée
DispG
(Display Graphics) que vous pouvez faire apparaître par le
menu
Cfg->Montrer->DispG
ou avec la commande
DispG
. La différence est que les graphiques successifs sont tracés
individuellement dans chaque fenêtre de réponse, alors qu’ils sont
superposés dans la fenêtre DispG
. Vous pouvez effacer la
fenêtre DispG
par la commande ClrGraph
.
5.1 Tracés de courbes
Pour créer rapidement des tracés de courbes simples,
il est conseillé d’utiliser le menu Graphe
.
L’instruction de tracé d’une courbe représentative de fonction est plot
avec en
paramètres une expression ou une liste d’expressions dont on
veut la représentation graphique, puis la variable (éventuellement
on indique l’intervalle de valeurs de la variable).
Pour distinguer plusieurs courbes,
on peut utiliser un troisième argument par exemple
couleur=
suivi de la liste des couleurs à utiliser. Les
couleurs peuvent être codées par leur nom français, leur nom
anglais ou leur numéro. La fonction couleur
change la couleur
de base pour toutes les fonctions graphiques qui suivent.
La fonction tangent
permet d’obtenir la tangente à une courbe en un
point.
La fonction plotparam
permet d’effectuer le
tracé de . Il faut définir les deux coordonnées
comme une seule expression complexe dont est la partie réelle
et la partie imaginaire. La fonction plotpolar
trace les courbes en coordonnées polaires. La commande
plotimplicit(f(x,y),x,y)
trace l’ensemble des solutions de
.
Tracés de courbes | |
plot | graphe d’une expression d’une variable |
plotfunc | graphe d’une expression d’1 ou 2 variable(s) |
couleur | choisir la couleur d’un tracé |
tangent | tangente à une courbe |
plotparam | courbe paramétrique |
plotpolar | courbe en polaires |
plotimplicit | courbe implicite |
5.2 Objets graphiques 2D
Xcas étant aussi un logiciel de géométrie plane, de nombreuses
figures peuvent être tracées (dans un écran que l’on obtient avec
Alt+g) par des commandes du menu Geo
, par exemple des polygones,
des coniques…
Les arguments de ces commandes sont souvent des points (commande
point
) qui peuvent en général être saisis
directement par leur affixe complexe.
Par exemple cercle(2+3*i,2)
trace le cercle centré au point
, de rayon 2.
La commande legende
permet de placer un texte à un endroit,
lui aussi spécifié par un nombre complexe. Les fonctions
polygonplot
et scatterplot
prennent en entrée une
liste d’abscisses et une liste d’ordonnées.
Objets graphiques 2D | |
legend | met du texte à partir d’un point donné |
point | point donné par son affixe ou 2 coordonnées |
segment | segment donnée par 2 points |
droite | droite donnée par son équation ou 2 points |
cercle | cercle donnée par centre et rayon |
inter | intersection de courbes |
equation | équation cartésienne |
parameq | équation paramétrique |
polygonplot | ligne polygonale |
scatterplot | nuage de points |
polygone | polygone fermé |
polygone_ouvert | polygone ouvert |
5.3 Objets graphiques 3D
-
Pour tracer une surface définie par l’équation
, on utilise la commande
plotfunc
, avec en arguments l’équation de la surface et la liste des deux variables. On peut aussi indiquer la plage de variable, et la discrétisation.
On obtient une surface en dimension 3. Pour modifier le point de vue, utilisez la souris en-dehors du cube de visualisation ou cliquez dans la figure 3-d, puis utilisez les touches x,X,y,Y,z,Z (rotations par rapport aux axes), + et - pour les zooms, les flèches de direction et page up/down pour changer la fenêtre de visualisation (la fenêtre de calcul par défaut est définie par la configuration graphique si on ne l’a pas indiquée en paramètre dansplotfunc
) - On peut aussi tracer une surface paramétrée
avec
plotparam
dont le premier argument est une liste de taille 3 contenant les coordonnées du point et les 2 arguments suivants les paramètres :
- Pour tracer des courbes paramétrées dans l’espace, on utilise
aussi la commande
plotparam
mais avec un seul paramètre :
- On peut aussi tracer des objets géométriques 3D dans une figure 3-d que l’on
obtient avec Alt+h, puis en utilisant des commandes du menu
Geo
, par exemple : point, droite ,plan, polygone, sphere…
Objets graphiques 3D | |
plotfunc | surface par équation |
plotparam | surface ou courbe paramétrique |
point | point donné par 3 coordonnées |
droite | droite donnée par 2 équations ou 2 points |
plan | plan donné par 1 équation ou 3 points |
sphere | sphère donnée par centre et rayon |
cone | cone donné par centre, axe, angle d’ouverture |
inter | intersection |
polygone | polygone |
polygone_ouvert | polygone ouvert |
6 Programmation
6.1 Syntaxe compatible avec Python
Comme Python est imposé dans l’enseignement secondaire, Xcas permet maintenant l’écriture de programmes avec une syntaxe largement compatible avec Python, ce qui évite d’avoir à apprendre un autre langage.
Vérifiez dans la configuration du CAS (menu Cfg ou directement
affichage dans la barre d’état) que vous êtes en mode
Xcas Python. Il est conseillé de conserver ^
comme
équivalent du signe puissance (^==**
).
Voici par exemple un programme calculant le PGCD de 2 entiers
écrit en syntaxe Python :
def pgcdi(a,b): while b!=0: r=irem(a,b) a=b b=r return a
On a utilisé ici l’instruction irem(a,b)
pour calculer
le reste de la division de par plutôt que a % b
car dans certains modes de Xcas, a % b
renvoie la classe
de dans .
6.2 Syntaxe en français ou compatible C/Javascript
Cette section s’adresse aux personnes qui ne connaissent pas Python ou ne souhaitent pas utiliser la syntaxe compatible Python.
6.2.1 Le langage
Xcas permet d’écrire des programmes, comme n’importe quel langage de programmation. Voici ses principales caractéristiques.
-
C’est un langage fonctionnel. L’argument d’une fonction peut être
une autre fonction. Si c’est le cas, on peut soit donner le nom de la
fonction argument dans la commande, soit sa définition : par exemple
function_diff(f)
ou bienfunction_diff(x->x^2)
. - Il n’y a pas de distinction entre programme et fonction :
une fonction renvoie la valeur de la dernière instruction
évaluée ou ce qui suit le mot réservé
return
. Comme pour tous les environnements de calcul, programmer consiste à étendre Xcas en lui rajoutant les fonctions souhaitées. Structurer la programmation consiste à hiérarchiser les différentes fonctions qui s’appellent entre elles. - Le langage est non typé. On distingue seulement les variables globales, qui ne sont pas déclarées, et les variables locales, déclarées en début de fonction.
Dans un programme, lorsqu’on appelle une variable munie d’un indice qui n’est
pas affectée à une liste, séquence ou matrice,
c’est une table qui est créée, et non une liste.
Une table est un conteneur d’objets analogue aux listes et aux
séquences. La différence est qu’elle peut être indicée
par autre chose qu’un entier, par exemple
une chaîne de caractères…
Si a
est une variable formelle, la commande a[4]:=2
crée une table a
.
Pour que a
soit une liste, il faut d’abord affecter a
à une liste par exemple a:=[0$10]
(si la taille de la liste est connue) ou a:=[]
puis
a[4]:=2
.
Même si le langage est non typé, il est donc
recommandé d’initialiser
les variables avant de les utiliser.
La syntaxe de déclaration d’une fonction est la suivante.
nom_fonction(var1,var2,...):={ local var_loc1, var_loc2,... ; instruction1; instruction2; ... }
La syntaxe est soit avec des mots clef en français soit comme en langage C/Javascript, soit en syntaxe compatible Python
Instructions en fançais | |
affectation | a:=2; |
entrée expression | saisir("a=",a); |
entrée chaine | saisir_chaine("a=",a); |
sortie | afficher("a=",a); |
valeur retournée | retourne(a); |
arrêt dans boucle | break; |
alternative | si <condition> alors <inst> fsi; |
si <condition> alors <inst1> sinon <inst2> fsi; | |
boucle pour | pour j de a jusque b faire <inst> fpour; |
pour j de a jusque b pas p faire <inst> fpour; | |
boucle répéter | repeter <inst> jusqua <condition>; |
boucle tantque | tantque <condition> faire <inst> ftantque; |
boucle faire | faire <inst1> si <condition> break;<inst2> |
ffaire; |
Instructions comme en C/JS | |
affectation | a:=2; |
entrée expression | input("a=",a); |
entrée chaine | textinput("a=",a); |
sortie | print("a=",a); |
valeur retournée | return(a); |
arrêt dans boucle | break; |
alternative | if (<condition>) {<inst>}; |
if (<condition>) {<inst1>} else {<inst2>}; | |
boucle pour | for (j:= a;j<=b;j++) {<inst>}; |
for (j:= a;j<=b;j:=j+p) {<inst>}; | |
boucle répéter | repeat <inst> until <condition>; |
boucle tantque | while (<condition>) {<inst>}; |
boucle faire | do <inst1> if (<condition>) break;<inst2> od; |
Pour les tests, une condition est un booléen, résultat d’une expression logique, utilisant les opérateurs habituels.
Opérateurs logiques | |||
== | teste l’égalité | != | teste la différence |
< | teste la stricte infériorité | > | teste la stricte supériorité |
<= | teste l’infériorité ou l’égalité | >= | teste la supériorité ou l’égalité |
&&, et | opérateur booléen infixé et | ||, ou | opérateur booléen infixé ou |
vrai | est le booléen true ou 1 | faux | est le booléen false ou 0 |
non, ! | inverse logique |
Attention, i
désigne et ne peut pas être
utilisé comme variable de boucle.
L’instruction break;
permet de sortir d’une boucle
et continue;
de passer immédiatement à l’itération
suivante.
De nombreuses variantes sont reconnues en particulier en mode
de compatibilité avec Maple, Mupad et les TI89/Voyage 200.
On peut capturer des erreurs d’exécution par
try {bloc_erreurs_capturees} catch (variable) {bloc_execute_si_erreur}
Par exemple :
try{A:=idn(2)*idn(3)} catch(erreur) {print("l'erreur est "+erreur)}
6.2.2 Quelques exemples
Pour écrire un programme, il est conseillé d’ouvrir
un éditeur de programme avec le menu Prg->Nouveau programme
. Le menu
Prg
de l’éditeur permet d’entrer facilement les structures
de programmation. On peut ensuite sauvegarder le texte du programme
indépendamment de la session de travail pour l’utiliser ensuite
dans une autre session de travail.
Voici deux versions du calcul du PGCD de deux entiers, une version itérative, puis une version récursive.
pgcd_iteratif | |
pgcdi(a,b):={ | pgcdi(a,b):={ |
local r; | local r; |
while (b!=0) { | tantque b!=0 faire |
r:=irem(a,b); | r:=irem(a,b); |
a:=b; | a:=b; |
b:=r; | b:=r; |
} | ftantque |
return a; | retourne a; |
}:; | }:; |
pgcd_recursif | |
pgcdr(a,b):={ | pgcdr(a,b):={ |
if (b!=0) return a; | si b!=0 alors retourne a;fsi |
return pgcdr(b,irem(a,b)); | retourne pgcdr(b,irem(a,b)); |
}:; | }:; |
Vous pouvez saisir une fonction, par exemple pgcdi,
dans un niveau éditeur de programme de Xcas
(Prg->Nouveau programme
). Vous pouvez tester la syntaxe
(bouton OK
). Vous pouvez ensuite utiliser cette fonction
dans une ligne de commande, en tapant par exemple pgcdi(25,15)
.
Pour utiliser cette fonction dans une autre session Xcas,
vous pouvez la sauvegarder par exemple sous le nom
pgcdi.cxx
, en utilisant la commande
read("idiv2.cxx")
ou en l’ouvrant depuis un
éditeur de programme (et en le validant par OK).
6.3 Mise au point d’un programme
Il arrive parfois qu’un programme ne fonctionne pas du premier coup
comme prévu (!)
Il est alors possible de l’exécuter en mode pas-à-pas pour le mettre
au point, avec la
commande debug
. Pour plus de détails consulter le menu
Aide->Interface
. Par exemple, pour le programme idiv2
,
on lance la mise au point en tapant :
debug(pgcdi(25,15))
Le débuggueur affiche automatiquement la valeur des paramètres a,b
puis
des variables locales (ici r
) lors de l’exécution instruction par
instruction avec le bouton sst
.
6.4 Style de programmation
Xcas est interprété et non compilé.
Plus que le nombre de lignes du programme, c’est le nombre
d’instructions réellement exécutées qui influence le temps de calcul.
En règle générale, il est plus rapide de créer des listes
ou des séquences que de programmer des boucles.
Voici quelques manières de calculer
: comparez leurs temps d’exécution.
f:=1; for(n:=1;n <= 5000;n++) {f:=f*n}
f:=1;n:=1; while(n < 5000) {n:=n+1; f:=f*n}
f:=1; (f:=f*n)$(n=2..5000):;
La rapidité d’exécution est parfois contradictoire avec la
clarté du programme, et on doit accepter des compromis. Dans une
utilisation courante, le temps de calcul n’est pas réellement un enjeu :
on utilise en général les langages
interprétés comme Xcas pour tester des algorithmes et réaliser des
maquettes. Les applications en vraie grandeur sont codées dans des
langages compilés comme C++ (en utilisant par exemple la librarie
giac
pour les fonctions de calcul formel).
7 Des exercices corrigés avec Xcas
7.1 Fonction et représentation graphique (niveau terminale S)
7.1.1 Exercice 1
On considère la fonction de -{3} dans définie par :
-
Calculer la derivée première et seconde de .
En déduire les variations de . - Calculer les limites de en et en 3 à gauche.
- Montrer que s’annule une seule fois en sur . Donner un encadrement de d’amplitude 0.1.
- Étudier le signe de sur -{3} et en déduire les variations de .
- Tracer la courbe de dans un repère orthonormé (unité 1).
- Calculer l’aire en de la région comprise entre , l’axe des abscisses et les droites d’équations et .
Réponses
-
On tape pour définir la fonction :
f(x):=(x+1)*ln(abs(x-3))
f1:=function_diff(f):;
f1(x)
ln(abs(x-3))+(x+1)/(x-3)
On tape pour définir la fonction :f2:=function_diff(f1):;
f2(x)
1/(x-3)+1/(x-3)+(x+1)*(-(1/((x-3)^2)))
normal(f2(x))
(x-7)/(x^2-6*x+9)
factor(f2(x))
(x-7)/((x-3)^2)
Autre façon
On tape pour définir la fonction :f(x):=(x+1)*ln(abs(x-3))
On tape pour calculer :
dfx:=diff(f(x)
On obtient :
ln(abs(x-3))+(x+1)/(x-3)
Donc .
Et on tape pour définir la fonction à partir de dfx:f1:=unapply(dfx,x);
On tape pour calculer :
ddfx:=diff(dfx)
On obtient :
1/(x-3)+1/(x-3)+(x+1)*(-(1/((x-3)^2)))
ou pour avoir une écriture factorisée, on tape directement :
ddfx:=factor(diff(dfx))
On obtient :
(x-7)/((x-3)^2)
Donc
Et on tape pour définir la fonction à partir de ddfx:f2:=unapply(ddfx,x);
Cette façon de faire à l’avantage de définir la fonction à partir d’une expression simplifiée ou factorisée.
Attention !!! On ne peut pas écrire par exemple :
g(x):=normal(diff(f(x))) pour définir la fonction mais on doit écrire g:=unapply(normal(diff(f(x))),x) car sinon il y a confusion entre variable de dérivation et variable de la fonction . - On tape pour avoir la limite de en :
limit(f1(x),x,-infinity)
+infinity
limit(f1(x),x,3,-1)
-infinity
- est continue et décroissante de à sur
puisque sur . Il existe donc
unique dans tel que .
On tape pour avoir une valeur approchée de :assume(x<3);fsolve(f1(x),x)
x,0.776592890991
purge(x)
f1(0.7)
0.0937786881525
f1(0.8)
-0.0297244578175
- Puisque , on tape pour avoir le minimum de sur :
f1(7)
ln(4)+2
Donc si et si .
Donc est croissante sur et est décroissante sur . - On cherche les limites de en , , et en .
On tape :limit(f(x),x,-infinity)
-infinity
limit(f(x),x,+infinity)
+infinity
limit(f(x),x,3)
-infinity
plofunc(f(x),x);droite(x=1);droite(x=2)
- On tape pour trouver l’aire en :
integrate(f(x),x,-1,2)
8*ln(4)-12+15/4
normal(8*ln(4)-12+15/4))
8*ln(4)-33/4
ibpu((x+1)*ln(abs(x-3)),ln(abs(x-3)))
[((x^2)/2+x)*ln(abs(x-3)),(-x^2-2*x)/(2*x-6)]
A:=ibpu([((x^2)/2+x)*ln(abs(x-3)),(-x^2-2*x)/(2*x-6)],0)
(-x^2-10*x)/4-15*1/2*ln(abs(x-3))+((x^2)/2+x)*ln(abs(x-3))
preval(A,-1,2)
8*ln(4)-9/4-6)
normal(8*ln(4)-9/4-6))
8*ln(4)-33/4
7.1.2 Exercice 2
On considère la fonction de dans définie par :
- Montrer que pour tout ,
- Étudier les variations de et tracer son graphe.
- Trouver l’équation de la tangente au graphe au point d’abscisse
- Calculer puis,
Réponses
-
On tape :
factor(x^4-2x^3+2x^2)
(x^2+-2*x+2)*x^2
canonical_form(x^2-2*x+2)
(x-1)^2+1
donc pour tout , - On tape pour calculer la valeur de la dérivée de en un point :
On obtient :
normal(derive((exp(x)^2-exp(x)+1)/(exp(x)^3+exp(x)),x))
(-(exp(x))^4+2*(exp(x))^3-2*(exp(x))^2-1)/
((exp(x))^5+2*(exp(x))^3+exp(x))
Le numérateur est négatif car il est égal à et le dénominateur est strictement positif car il est égal à une somme de termes strictement positifs. La fonction est donc décroissante.
Pour chercher la limite de en , on tape :limit((exp(x)^2-exp(x)+1)/(exp(x)^3+exp(x)),x=+infinity)
On obtient :
0
Pour chercher la limite de en , on tape :
limit((exp(x)^2-exp(x)+1)/(exp(x)^3+exp(x)),x=-infinity)
On obtient :
infinity
Pour tracer le graphe de , on tape :
plotfunc(((exp(x))^2-exp(x)+1)/((exp(x))^3+exp(x)),x)
On obtient le graphe de .
- On définit la fonction , on tape :
f(x):=(exp(x)^2-exp(x)+1)/(exp(x)^3+exp(x))
f(0)
df:=unapply(normal(diff(f(x),x)),x)
df(0)
c’est à dire .
ou encore on tape :equation(tangent(plotfunc(f(x)),0),[x,y])
y=(1/-2*x+1/2)y=(1/-2*x+1/2)
- On calcule l’intégrale :
On tape :int(f(t),t,0,x)
Puis on calcule : , on tape :(ln((exp(x))^2+1)*exp(x)+(-(2*x))*exp(x)+2*exp(x)-2)*
1/2/exp(x)-1/2*ln(2)
limit((ln((exp(x))^2+1)*exp(x)+(-(2*x))*exp(x)+2*exp(x)-2)
*1/2/exp(x)-1/2*ln(2),x=+infinity)
-1/2*ln(2)+1
7.2 Calcul de primitives (niveau début université)
-
Calculer
Réponse :
On tape :int(1/(x^3+1),x,1,2)
normal}
(sqrt(3)*ln(2)+pi)*1/3/sqrt(3)
partfrac(1/(1+t^3))
1/((t+1)*3)+(-1/3*t+2/3)/(t^2-t+1)
- Décomposer, sur , en éléments simples :
.
Calculer et
Réponse :
On tape :partfrac(t^2/(1-t^4))
-1/2/(t^2+1)+1/(4*(t+1))-1/4/(t-1)
int(-1/2/(t^2+1)+1/(4*(t+1))-1/4/(t-1),t)
int(t^2/(1-t^4),t)
1/(-2*atan(t))+1/(4*ln(abs(t+1)))+1/(-4*ln(abs(t-1)))
normal(int(sin(x)^2/cos(2*x),x))
-1/2*x-1/-4*ln(abs((tan(1/2*x))^2-2*tan(1/2*x)-1))-
1/4*ln(abs((tan(1/2*x))^2+2*tan(1/2*x)-1))
normal(int(tlin(sin(x)^2/cos(2*x))))
1/4*ln(abs(tan(x)+1))+1/-4*ln(abs(tan(x)-1))+1/-2*x
trigtan(texpand(sin(x)^2/cos(2x)))
(-((tan(x))^2))/((tan(x))^2-1)
subst('integrate(-tan(x)^2/(tan(x)^2-1),x)',x=atan(t))
subst(Int(-tan(x)^2/(tan(x)^2-1),x),x=atan(t))
integrate((-(t^2))/((1+t^2)*(t^2-1)),t)
1/-2*atan(tan(x))+1/4*ln(abs(tan(x)+1))+1/-4*ln(abs(tan(x)-1))
- Calculer
et
Réponse :
On tape :int(1/t^2,t)
1/(-t)
int(1/(t*(t^2+1)),t)
1/-2*ln(t^2+1)+1/2*ln((abs(t))^2)
int((t^2-t+1)/(t^2+t^4),t)
1/2*ln(t^2+1)-ln(abs(t))+(-t+1)/(-t)
7.3 Dévelopements limités
-
Donner un développement limité à l’ordre 7 au voisinage de
de :
Réponse :
On tape :series(sin(sinh(x))-sinh(sin(x)),x=0,7)
1/-45*x^7+x^8*order_size(x)
- Donner un développement limité à l’ordre 4 au voisinage de
de :
Réponse :
On tape :series(ln(cos(x))/exp(x+x^2),x=0,4)
1/-2*x^2+1/2*x^3+1/6*x^4+x^5*order\_size(x)
order_size
est telle que, pour tout ,order_size
tend vers 0 quand tend vers 0
7.4 Équations différentielles
-
Trouver les solutions de l’équation différentielle :
Réponse :
On tape :desolve(x*(x^2-1)*y'+2*y=0,y)
(c\_0*x^2)/(x^2-1)
- Trouver les solutions de l’équation différentielle :
Réponse :
On tape :desolve(x*(x^2-1)*y'+2*y=x^2,y)
((ln(abs(x))+c\_0)*x^2)/(x^2-1)
7.5 Les matrices
-
Soit
a) Pour quelles valeurs de , est-elle inversible ?
Préciser son rang lorsqu’elle n’est pas inversible.
b) Calculer l’inverse deRéponse :
On tape :M:=[[2a-1,a,2a-1],[a^2+a-2,a^2-1,a-1],[a^2+a-1,a^2+a-1,a]]
On calcule le déterminant de , on tape :
det(M)
On obtient :
2*a^4+-2*a^3+-2*a^2+2*a
Pour avoir l’inverse de on tape :
inv(M)
On obtient : On tape :
solve(2a^4-2*a^3-2*a^2+2*a,a)
On obtient :
[-1,0,1]
Donc la matrice est inversible si
Ou on tape :factor(2a^4-2*a^3-2*a^2+2*a)
On obtient :
2*(a+1)*a*(a-1)^2
On tape :
rank(subst(M,a,-1))
On obtient :
2
On tape :
rank(subst(M,a,0))
On obtient :
2
On tape :
rank(subst(M,a,1))
On obtient :
1
On tape :
inv(subst(M,a,2))
On obtient :
Remarque : pour éviter de faire des substitutions on peut définir la matrice comme une fonction de , il faut alors écrire :M(a):={[[2a-1,a,2a-1],[a^2+a-2,a^2-1,a-1],[a^2+a-1,a^2+a-1,a]]}
surtout ne pas oublier { et }.
On peut alors taper :inv(M(2))
. - Soit
Pour quelles valeurs de , est-elle diagonalisable ?Réponse :
On tape :A:=[[1,1,a],[1,a,1],[a,1,1]]Pour avoir les valeurs propres de on tape :
egvl(A)On obtient : ce qui s’écrit :
[[-a+1,0,0],[0,a+2,0],[0,0,a-1]]Si il y a 3 valeurs propres distinctes et
si il y a une valeur propre double () et une valeur propre simple ().
Puis on cherche la matrice de passage, on tape :egv(A)On obtient : ce qui s’écrit :
[[1,1,1],[0,1,-2],[-1,1,1]]les vecteurs propres sont les colonnes de cette matrice.
Ou on tape pour avoir directement les deux informations, matrice de passage et réduite de Jordan :jordan(A)On obtient une liste de deux matrices ( est la matrice de passage et ) : ce qui s’écrit :
[[[1,1,1],[0,1,-2],[-1,1,1]],[[-a+1,0,0],[0,a+2,0],[0,0,a-1]]]On remarque qu’en faisant : a:=1 puis jordan(A)
les valeurs propres doubles sont regroupées et on obtient :
ce qui s’écrit :[[[1,-3,0],[1,0,-3],[1,3,3]],[[3,0,0],[0,0,0],[0,0,0]]]est donc diagonalisable quelque soit et .
8 Vrai ou Faux ? (d’un point de vue informatique)
-
1+1:;
3-1
1.5+1/2
4/2
sqrt(4)
evalf(sqrt(4))
1^(1+1)+1^(1+1)
(1+1)^(1+1)
1*1^(1+1)
1+1*1^1
(1+1)*1^(1+1)
c
: répondre vrai ou faux et pourquoi ?
-
c:=2:;
c:=2
c==2
c=2
c:=4/2
c:=3/1.5
c:=(2+2)/2
c:=(2.0+2)/2
c:=2a/a
c:=(2*a)/a
c:=2*a/a
c:=1:; c:=2*c
c
une expression
valide : répondre vrai ou faux et pourquoi ?
-
c:=ab
c:=a*b
c==a
c:= c==a
c:=a+(a*b))/2
c=a+a*b
c:=a/b
c->a/b
a/b=>c
c:=a/0
c:=2*a/a
c:=1: c:=2*c
b
:
répondre vrai ou faux et pourquoi ?
-
a:=1:; b=a
a:=1:; b:=a
a:=1:; b:='a':; a:=3:; b
a:=1:; b:="a"
b:=a/a
b:=a^0
-
1/2^-1
a:=2
2*a/a
sqrt(4*a^2)/a
simplify(sqrt(4*a^2)/a)
sqrt(4*a^4)/(a*a)
simplify(sqrt(4*a^4)/(a*a))
expand(sqrt(4*a^4)/(a*a))
normal(sqrt(4*a^4)/(a*a))
ln(a^2)/ln(a)
simplify(ln(a^2)/ln(a))
texpand(ln(a^2)/ln(a))
normal(texpand(ln(a^2)/ln(a)))
-ln(exp(-2))
1/exp(-ln(2))
exp2pow(1/exp(-ln(2)))
-
f(x):=x^2
f(a):=a^2
f := x^2
f(x):=a^2
f := a->a^2
f(x):=evalf(x^2)
f(x):=simplify(x^3/x)
f(x):=simplify(x*x*a/a)
E:=x^2:;f:=unapply(E,x)
f:=unapply(simplify(x^3/x),x)
f
qui au
couple associe le produit :
vrai ou faux et pourquoi ?
-
f:=x*y
f:=x->x*y
f:=(a,b)->a*b
f(x,y):=x*y
f(x,y):=xy
f:=((x,y)->x)*((x,y)->y)
f:=(x->x)*(y->y)
f:=unapply(x*y,x,y)
E:=x*y:;f:=unapply(E,x,y)
f1
qui à
associe :
vrai ou faux et pourquoi ?
-
f(x):=x^2:; f1(x):=diff(f(x))
f1:=diff(x^2)
f1:=unapply(diff(x^2),x)
f(x):=x^2:; f1:=function_diff(f)
f(x):=x^2:; f1:=diff(f)
f(x):=x^2:; f1:=diff(f(x))
f(x):=x^2:; f1:=unapply(diff(f(x),x),x)
f(x):=x^2:; f1:=x->diff(f(x))
-
A:=diff(x^2*y)
A:=x->diff(x^2*y)
A:=diff(x^2*y,x)
A:=diff(x^2*y,y)
A:=diff(x*y^2,y)
A:=normal(diff(x*y^2,y))
A:=normal(diff(x^2*y^2/2,x,y))
A:=normal(diff(diff(x^2*y^2/2,x),y))
-
losange(1,i,pi/3)
losange((1,0),(0,1),pi/3)
losange(point(1,0),point(0,1),pi/3)
parallelogramme(0,1,1+i)
parallelogramme(0,1,1/2+i*sqrt(3)/2)
quadrilatere(0,1,3/2+i*sqrt(3)/2,1/2+i*sqrt(3)/2)
polygone(0,1,3/2+i*sqrt(3)/2,1/2+i*sqrt(3)/2)
polygonplot(0,1,3/2+i*sqrt(3)/2,1/2+i*sqrt(3)/2)
polygonplot([0,1,3/2,1/2],[0,0,sqrt(3)/2,sqrt(3)/2])
polygone_ouvert(0,1,3/2+i*sqrt(3)/2,1/2+i*sqrt(3)/2)
polygone_ouvert(0,1,3/2+i*sqrt(3)/2,1/2+i*sqrt(3)/2,0)
-
cercle(0,1)
arc(-1,1,2*pi)
arc(-1,1,pi), arc(-1,1,-pi)
plot(sqrt(1-x^2))
plot(sqrt(1-x^2)), plot(-sqrt(1-x^2))
plotimplicit(x^2+y^2-1,x,y)
plotparam(cos(t),sin(t))
plotparam(cos(t)+i*sin(t))
plotparam(cos(t)+i*sin(t),t)
plotparam(exp(i*t))
plotparam(cos(t)+i*sin(t),t,0,pi)
plotparam(cos(t)+i*sin(t),t,0,2*pi)
plotpolar(1,t)
plotpolar(1,t,-pi,pi)
plotpolar(1,t,0,2*pi)
-
l:=[1,2,3,4,5]
l:=op([1,2,3,4,5])
l:=nop(1,2,3,4,5)
l:=seq(i,i=1..5)
l:=seq(j=1..5)
l:=seq(j,j=1..5)
l:=seq(j,j,1..5)
l:=seq(j,j,1,5)
l:=seq(j,j,1,5,1)
l:=[seq(j,j=1..5)]
l:=nop(seq(j,j=1..5))
l:=[k$k=1..5]
l:=[k$(k=1..5)]
l:=[k+1$(k=0..4)]
l:=[(k+1)$(k=0..4)]
l:=cumSum([1$5])
l:=sort(5,2,3,1,4)
l:=sort([5,2,3,1,4])
l:=makelist(k,1,5)
l:=makelist(x->x,1,5)
-
0.5^[0,1,2,3,4]
2^(-[0,1,2,3,4])
2.0^(-[0,1,2,3,4])
2^-evalf([0,1,2,3,4])
evalf(2^(-[0,1,2,3,4]))
seq(2^(-n),n=0..4)
evalf([seq(2^(-n),n=0..4)])
1/evalf(2^n$(n=0..4))
evalf(2^n$(n=0..4))^(-1)
[evalf(2^n$(n=0..4))]^(-1)
evalf(nop(2^n$(n=0..4))^(-1))
a:=[]:; (a:=append(a,0.5^k))$(k=0..4):; a
makelist(k->2^(-k),0,4)
f:=x->2.0^(-x):; makelist(f,0,4)
-
l*10^[4,3,2,1,0]
l*10^[0,1,2,3,4]
revlist(l)*10^[0,1,2,3,4]
l*seq(10^n,n,4,0,-1)
expr(char(sum(l,48)))
l*nop(seq(10^n,n=(4..0)))
l*10^nop(j$(j=4..0))
l*10^(j$(j=4..0))
l*10^(j$(j=4..0))
l*nop(10^j)$(j=4..0))
-
(floor(n/10^k)-floor(n/10^(k+1))*10)$(k=4..0)
[(floor(n/10^k)-floor(n/10^(k+1))*10)$(k=4..0)]
seq(iquo(n,10^k)-10*iquo(n,10^(k+1)),k=4..0)
nop(seq(iquo(n,10^k)-10*iquo(n,10^(k+1)),k=4..0))
revlist(convert(n,base,10))
sum(asc(string(n)),-48)
string(n)
mid(string(n),k,1)$(k=0..4)
[mid(string(n),k,1)$(k=0..4)]
[expr(mid(string(n),k,1))$(k=0..4)]
P:=X^4+2*X^2+3
.
Les lignes de commande suivantes affichent
le polynôme réciproque 3*X^4+2*X^2+1
:
vrai ou faux et pourquoi ?
-
poly2symb(revlist(symb2poly(P)))
X^4*subst(P,X,1/X)
normal(X^4*subst(P,X,1/X))
normal(subst(P,X,1/X))
normal(subst(P/X^4,X,1/X))
normal(X^degree(P)*subst(P,X,1/X))
getNum(subst(P,X,1/X))
f:=unapply(P,X):; part(f(1/X),1)
f:=unapply(P,X):; part(normal(f(1/X)),1)
9 Exercices (niveau université)
Il y a souvent plusieurs manières d’obtenir le même résultat en Xcas. On s’efforcera de choisir les solutions les plus compactes.
- Calculer une primitive .
- Calculer et montrer que après simplifications.
- Calculer la valeur exacte, puis approchée de l’intégrale .
- Pour , puis , et pour tout , on pose , et . Calculer la valeur approchée de l’intégrale par la méthode des rectangles à gauche :
- Même question avec la méthode des trapèzes :
- On pose . Définir la fonction qui à associe
- Définir la fonction qui à associe la dérivée partielle par rapport à de la fonction précédente (dérivée directionnelle).
- Calculer le gradient de la fonction au point , puis le produit scalaire de ce gradient avec le vecteur . Donner ce résultat en fonction de g
-
Représenter graphiquement la solution en fonction de à l’aide
de la fonction
plotimplicit
. - Calculer les trois solutions de l’équation, en utilisant
rootof
pour la première, en éliminant la première avecquo
et en trouvant les deux dernières solutions en résolvant l’équation du second degré (utilisercoeff
pour calculer le discriminant de l’équation). - Représenter graphiquement chacune des
trois racines sur le même graphique avec une couleur
différente, et pour les valeurs de
telles que ces solutions soient réelles (on pourra utiliser
resultant
pour trouver les valeurs de pour lesquelles l’équation possède une racine multiple en , ces valeurs sont les bornes possibles des intervalles en où chacune des racines sont réelles). - Donner la valeur des solutions pour .
- Donner sa valeur exacte.
- Trouver une valeur de telle que la distance de à la limite soit inférieure à .
- .
- .
- .
- .
- .
- Vérifier que cette fonction prend des valeurs négatives sur . Représenter la fonction sur l’intervalle .
- Déterminer tel que Xcas donne une représentation correcte de la fonction sur l’intervalle .
- Représenter la fonction sur l’intervalle . Sur ce graphique, tracer aussi les représentations des polynômes de Taylor de cette fonction en , aux ordres .
- Même question pour l’intervalle .
- Représenter la fonction sur l’intervalle . Sur le même graphique, superposer les représentations des polynômes de Taylor de cette fonction en , aux ordres .
- La première bissectrice ().
- Le graphe de la fonction .
- La tangente au graphe de la fonction au point .
- Un segment vertical allant de l’axe des au point d’intersection de la fonction et de la première bissectrice, et un segment horizontal allant de ce point d’intersection à l’axe des .
- Les indications "point fixe" et "tangente", positionnées sur le graphique comme chaînes de caractères.
- Fonctions , pour allant de à .
- Fonctions , pour allant de à .
- Fonctions , pour allant de à .
-
Choisir un domaine de représentation et les pas de discrétisation,
de manière à obtenir une représentation informative
avec
plotfunc
. - Créer un paramètre modifiable à la souris
avec la fonction
assume
. Représenter la courbe définie par , puis faites varier le paramètre à la souris. - Créer un paramètre modifiable à la souris. Représenter la courbe définie par , puis faites varier le paramètre à la souris.
- Représenter la surface d’équation .
- Représenter la surface paramétrée définie par :
- En choisisant une valeur de suffisamment grande, représenter la courbe paramétrée définie par :
- Représenter la famille de courbes paramétrées définies par :
- Représenter le même cône en utilisant la fonction
cone
.
- Engendrer une liste de entiers au hasard entre et .
- Vérifier que l’ensemble des valeurs de est contenu dans .
- Extraire de la liste toutes les valeurs .
- Pour tout , compter combien de valeurs de la liste sont égales à .
- Calculer .
- Comparer votre résultat avec celui que donne la fonction
dfc
de Xcas. - Calculer , et donner la valeur numérique de .
- Nombres de à par pas de .
- Nombres de à par pas de .
- Carrés des premiers entiers.
- Nombres de la forme pour .
- 10 "0" suivis de 10 "1".
- 3 "0" suivis de 3 "1", suivis de 3 "2",…, suivis de 3 "9".
- "1", suivi de 1 "0", suivi de "2", suivi de 2 "0",…, suivi de "8", suivi de 8 zéros, suivi de "9".
- "" suivi de "", suivis de "",…, suivis de "".
-
Définir les polynômes de degré 6 suivants.
- polynôme dont les racines sont les entiers de à .
- polynôme dont les racines sont (racine triple), (racine double) et (racine simple).
- polynôme .
- polynôme .
- Ecrire (sans utiliser la fonction
companion
) la matrice compagnon associée à chacun de ces polynômes. On rappelle que la matrice compagnon associée au polynôme : est : - Calculer les valeurs propres de la matrice .
- Calculer le polynôme caractéristique de .
- Ecrire la matrice carrée d’ordre , telle que si et si , où et sont des variables.
- Calculer et factoriser le polynôme caractéristique de .
- Déterminer une matrice orthogonale telle que soit une matrice diagonale.
- Utiliser la question précédente pour définir la fonction qui à un entier associe la matrice .
- Calculer , pour en effectuant les produits matriciels, et vérifier que la fonction définie à la question précédente donne bien le même résultat.
- Ecrire la matrice carrée d’ordre , telle que si et si .
- Calculer , pour .
- Ecrire la matrice , où est une variable.
- Calculer , pour .
- Calculer en fonction de et :
- La fonction prend en entrée un entier et deux réels et retourne la matrice dont les termes diagonaux valent , tous les autres termes étant égaux à .
- La fonction prend en entrée un entier et trois réels et retourne la matrice dont les termes diagonaux sont égaux à , les termes égaux à et termes égaux à , pour (les autres termes sont nuls).
- La fonction prend en entrée un entier et retourne en sortie
la matrice
définie par (matrice de Hilbert).
Comparer le temps d’exécution de votre fonction avec celui de
la fonction
hilbert
- La fonction prend en entrée un vecteur
et retourne en sortie la matrice
définie par (matrice de Vandermonde).
Comparer le temps d’exécution de votre fonction avec celui de
la fonction
vandermonde
- La fonction prend en entrée un vecteur et retourne en sortie la matrice définie par (matrice de Toeplitz).
-
derive
: Elle calcule et représente graphiquement la dérivée de sur l’intervalle . Elle retourne la une valeur de . tangente
: Elle représente la fonction sur l’intervalle , elle superpose sur le même graphique la tangente au graphe de au point , et retourne l’équation de cette tangente comme un polynôme du premier degré.araignee
: Elle représente la fonction sur l’intervalle , ainsi que la droite d’équation (première bissectrice). Elle calcule et retourne les premiers itérés de en (). Elle représente la suite de segments, alternativement verticaux et horizontaux, permettant de visualiser les itérations : segments joignant , , , , , …(comparer avec la fonctionplotseq
)newton_graph
: Elle représente la fonction sur l’intervalle . Elle calcule et retourne les dix premiers itérés de la suite définie à partir de par la méthode de Newton : , … Les valeurs de la dérivée sont approchées. La fonction représente sur le même graphique les segments permettant de visualiser les itérations : segments joignant , , , , , ,…(comparer avec la fonctionnewton
)
- Calculer l’inverse de l’application .
- Déterminer et représenter graphiquement l’image par du domaine : .
- Soit la matrice jacobienne de en un point de , et la matrice jacobienne de en un point de . Calculer ces deux matrices, vérifier que et sont inverses l’une de l’autre.
- Soit le déterminant de la matrice . Calculer et simplifier .
- Calculer
- Calculer et vérifier que .