====== Calcul formel avec Xcas ====== ===== Qu'est ce que Xcas ===== **giac** est une bibliothèque C++ de **calcul formel**. On peut l'utiliser de différentes façons. **Xcas** est une interface pour utiliser giac. Nous allons par exemple utiliser la version [[https://www.xcasenligne.fr/giac_online/demoGiacPhp.php|Firefox de Xcas]] qui permet de travailler avec giac sans rien installer, juste avec le navigateur. > Testé sur Firefox, Chrome, Chromium On peut aussi installer Xcas comme application sur le téléphone. Par ailleurs, des calculatrices utilisent giac comme la TI-inspire ou la Numworks. Je n'ai pas encore explicité ce qu'on entend par **calcul formel**. Cela va devenir évident dans la suite. ===== Lancer la console ===== Rendez-vous sur [[https://www.xcasenligne.fr/giac_online/demoGiacPhp.php|Xcas en ligne]]. Vous recevrez un popup demandant « //Restaurer la sauvegarde d'urgence ?// ». Cela permet de récupérer un travail antérieur. Pour l'instant nous n'avons rien fait donc cliquez « Annuler » {{ :mm:xcas:accueil_xcas_en_ligne.png?direct&400 |}} Cliquez sur le terminal entouré en rouge. Vous êtes dans la console : {{ :mm:xcas:console_xcas_en_ligne_1.png?direct&400 |}} La flèche indique la zone de saisie. C'est là que vous allez pouvoir ajouter des commandes. ===== Exemple de calcul ===== Nous étudions une fonction $f$ paire, de période $T = 4$ et définie sur $[0\,;\,2]$ par $f(t) = \begin{cases}t\text{ si } 0 \leq t < 1\\1 \text{ si } 1 \leq t \leq 2\end{cases}$ On sait que $\omega = \dfrac{2\pi}{T}$ On voudrait calculer $a(n) = \displaystyle \int_0^2 f(t) \cos(n\omega t)\,dt,$ avec $n$ entier $>0$ * Dans ce qui suit, les commandes sont toujours écrites dans la console. Tapez //Entrée// pour exécuter la commande. * Vous aurez parfois besoin de réécrire presque la même chose qu'une commande précédente. Vous pouvez utiliser la flèche ↑ pour rappeler cette commande. * Si vous vous trompez, ce n'est pas grave. Pas besoin d'effacer l'erreur ou de recommencer dès le début. Réécrivez la commande corrigée dans une nouvelle ligne et continuez. * S'il y a plusieurs commandes, entrez les l'une après l'autre en validant à chaque fois. ==== Calculs directs ==== Essayez : 2pi/4 > Dans ce cas, $\pi$ est reconnu et le symbole de multiplication est optionnel. Mais le résultat ne se simplifie pas. simplifier(2pi/4) > Le résultat est simplifié. Remarquez que les commandes sont traduites en français. ==== Affectation ==== Essayez : T := 4 omega := 2pi/T > L'affectation utilise '':='', faites-y attention ; ''omega'' sera automatiquement compris comme le symbole $\omega$ ; l'expression pourra s'afficher différemment selon si fait une affectation ou non. ==== Calcul d'intégrale ==== Commençons par le calcul de $\displaystyle \int_0^1 t\cdot \cos(n\omega t)dt$ integrer(t*cos(n*omega* t), t, 0, 1) Détaillons les arguments de la fonction ''integrer'' : * ''%%t*cos(n*omega* t)%%'' : c'est l'expression de ce qui est intégré, sans le $dt$. * ''t'' : c'est la variable d'intégration. En gros, c'est le $dt$. * ''0'' et ''1'' : ce sont les bornes d'intégration. Maintenant vous devriez comprendre ce qu'est le calcul formel : on fait le calcul de façon exacte même s'il y a des symboles. Le résultat précédent semble compliqué. On voudrait simplifier : simplifier(integrer(t*cos(n*omega* t), t, 0, 1)) Mais le résultat n'est pas très satisfaisant. La simplification est automatique et elle ne prend pas toujours la forme que l'on préférerait. ==== Intégrale complète ==== Je vous rappelle que l'on voulait calculer $\displaystyle \int_0^2 f(t) \cos(n\omega t)\,dt$ avec $f(t) = \begin{cases}t\text{ si } 0 \leq t < 1\\1 \text{ si } 1 \leq t \leq 2\end{cases}$ Il faut donc calculer : $$\displaystyle \int_0^1 t\cdot \cos(n\omega t)dt + \int_1^2 1\cdot \cos(n\omega t)dt$$ **Trouvez vous-même la bonne commande en vous inspirant de la précédente.** > Pensez à simplifier, cette fois cela donne un bon résultat. ==== Définir la fonction ==== Il est possible de faire mieux en définissant la fonction $f$. f(t):=piecewise(t<1,t,1) Détaillons : * si ''t<1'', alors ce sera ''t'', * sinon ce sera ''1'' Maintenant on peut calculer : simplifier(integrer(f(t)*cos(n*omega*t),t,0,2)) Le résultat est satisfaisant. ==== Simplification incomplète ==== giac simplifie une partie du calcul mais il ne voit pas certaines simplifications : on sait que $\sin(n\pi) = 0$. On pourrait donc simplifier ce terme. Pourquoi giac ne le voit-il pas ? giac ne sait pas que $n$ est un entier. $\sin(n\pi) = 0$ uniquement si $n$ est entier. Il est possible d'indiquer que $n$ est un entier : assume(n, integer) ==== Évaluer ==== On voulait calculer $a(n) = \displaystyle \int_0^2 f(t) \cos(n\omega t)\,dt$ et on aimerait calculer quelques valeurs et faire un tableau de valeur. a(n) := integrer(f(t)*cos(n*omega*t),t,0,2) On peut maintenant calculer, par exemple : a(3) Il s'agit d'une valeur **exacte !** On peut évaluer : evalf(a(3)) > f signifie **flottant**. C'est le terme informatique utilisé pour les nombres à virgules. On peut préciser le nombre de chiffres significatifs désirés : evalf(a(3), 4) On peut aussi simplement arrondir, par exemple à 5 chiffres après la virgule : round(a(3), 5) ==== Afficher une liste ==== On peut donc afficher la valeur de n'importe quel $a(n)$. On peut faire mieux : obtenir directement un tableau de valeurs : seq(a(n), n, 1, 10) > Calcul de ''a(n)'' pour ''n'' allant de ''1'' à ''10'' L'affichage n'est pas terrible. On voudrait un tableau avec la valeur de $n$ en face de $a(n)$ et de l'approximation de $a(n)$ à 5 chiffres. seq([n, a(n), round(a(n), 5)], n, 1, 10) Et voilà !