Initiation a Sagemath / Python

Le but de ce TP est de s'initier à sagemath.

  1. Ouvrir une session sur: https://cloud.sagemath.com
  2. Ouvrir une nouvelle jupyter

Tout les documents sur sage et python se trouvent ici

In [ ]:
 
In [1]:
from IPython.core.display import display, HTML
display(HTML("""<a href="https://drive.google.com/drive/folders/0B_YN6-I6vHnRNXRUbEo4V0xrV3c?usp=sharing">text</a>"""))

Trouver de l'aide

Pour trouver de l'aide, il suffit de taper le nom mathématique de l'objet que vous souhaitez utiliser (en utilisant une majuscule) suivi d'un point d'intérogation. puis validez par les touches .

In [ ]:
solve

Si vous ne connaissez pas le nom de la fonction mathématique, vous pouvez le deviner en écrivant les premières lettre puis en tapant sur la touche tabulation.

sol

In [ ]:
sol
In [ ]:
solve??

Pour commencer: un peu de calcul

Calculer 1+2

In [1]:
1+2
Out[1]:
3

Attention: sagemath fait une différence entre les réelles, les entiers et rationelles

$1$ est un élément de $\mathbb{Z}$

$1.$ est un élément de $\mathbb{R}$

$1/2$ est un élément de $\mathbb{Q}$

$0.5$ est un élément de $\mathbb{R}$

Que va donner: 1+1/2 ?

In [3]:
1+1/2
Out[3]:
3/2

Que va donner: 1+.5 ?

In [4]:
1+0.5
Out[4]:
1.50000000000000

Plus difficile: la fonction in a pour sortie True ou False suivant que la partie de droite appartient à l'ensemble qui est à gauche. Exemple essayer: 1.2 in ZZ ou bien 1.2 in RR

In [ ]:
1.2 in ZZ
In [ ]:
 
In [ ]:
1.2 in RR
In [ ]:
 
In [ ]:
 

Sage et les fonctions

  • Soit la fonction, $$f(x)=\frac{(x+2)^3}{2x^2+1}.$$ Ecrivez la fonction $f$ en sagemath.
In [5]:
f(x)=(x+2)^3/(2*x^2+1)
In [39]:
f(2)
/projects/sage/sage-7.5/local/lib/python2.7/site-packages/IPython/core/interactiveshell.py:2881: DeprecationWarning: Substitution using function-call syntax and unnamed arguments is deprecated and will be removed from a future release of Sage; you can use named arguments instead, like EXPR(x=..., y=...)
See http://trac.sagemath.org/5930 for details.
  exec(code_obj, self.user_global_ns, self.user_ns)
Out[39]:
y^2 + z + 8
  • Calculez $f(2)$ dans le cas où $2\in \mathbb{R}$ et dans le cas où $2\in \mathbb{Q}$
In [6]:
f(2.)
Out[6]:
7.11111111111111
In [7]:
f(2)
Out[7]:
64/9

Attention: Il existe une difference entre la fonction, $f$, et la formule de la fonction, $f(x)$:

In [ ]:
 
In [ ]:
 
In [41]:
f(x)
Out[41]:
x^3 + y^2 + z
In [ ]:
 
  • Sage permet aussi de developper une expression et de la factoriser
In [9]:
expand((1-x)^5)
Out[9]:
-x^5 + 5*x^4 - 10*x^3 + 10*x^2 - 5*x + 1
In [ ]:
 
In [10]:
factor(x^2+2*x+1)
Out[10]:
(x + 1)^2
  • On peut aussi factoriser les fonctions:
In [11]:
P(x)=(2*x-1)^3*(x+3)^2
In [12]:
expand(P(x))
Out[12]:
8*x^5 + 36*x^4 + 6*x^3 - 73*x^2 + 48*x - 9
In [13]:
factor(P(x))
Out[13]:
(2*x - 1)^3*(x + 3)^2
  • Plus compliqué: factoriser $Q=\frac{x^2-7x+12}{x^2+3x+2}$:
In [1]:
Q=(x^2-7*x+12)/(x^2+3*x+2)
In [2]:
Q
Out[2]:
(x^2 - 7*x + 12)/(x^2 + 3*x + 2)
In [ ]:
 
In [18]:
factor(Q)
Out[18]:
(x - 3)*(x - 4)/((x + 2)*(x + 1))
In [ ]:
 
In [ ]:
 
In [ ]:
 

Derivée d'une fonction et étude de fonctions

  • Calculez la fonction dérivée de $g=f'$
In [24]:
g(x)=diff(f(x))
In [25]:
g
Out[25]:
x |--> -4*(x + 2)^3*x/(2*x^2 + 1)^2 + 3*(x + 2)^2/(2*x^2 + 1)
In [ ]:
 
  • Calculez la dérivé $f'(0)$
In [21]:
g(0)
Out[21]:
12
  • Cherchez les points ou la dérivée $f'$ s'annule
In [22]:
solve(g(x)==0,x)
Out[22]:
[x == -1/2*sqrt(10) + 2, x == 1/2*sqrt(10) + 2, x == -2]
In [23]:
find_root(g(x)==0,3,8)
Out[23]:
3.5811388300841887
In [ ]:
 
  • Cherchez les domaine où $f'(x)\leq 0$
In [26]:
solve(g(x)>0,x)
Out[26]:
[[x < -2], [x > -2, x < -1/2*sqrt(10) + 2], [x > 1/2*sqrt(10) + 2]]

Attention: La resolution avec solve est analytique ce qui n'est pas toujours possible. Dans le cas ou ce n'est pas possible vous utiliserai la fonction find_root(g(x),0,4) , $0$ et $4$ sont les bornes de l'interval où on recherchera les racines de $g$

In [ ]:
 
  • Cherchez les limites de $f$ en $+\infty$ et $-\infty$
In [27]:
limit(f(x),x=+oo)
Out[27]:
+Infinity
In [28]:
limit(f(x),x=-oo)
Out[28]:
-Infinity
  • Dessinez $f$, sur l'interval $[-10,0]$ et sur l'interval $[0,10]$
In [29]:
plot(f(x),-10,0)
Out[29]:
In [ ]:
plot(f(x),0,10)

Substitution dans les fonctions

In [30]:
a, x = var('a, x'); y = cos(x+a) * (x+1); y
Out[30]:
(x + 1)*cos(a + x)
In [31]:
y.subs(a=-x); y.subs(x=pi/2, a=pi/3); y.subs(x=0.5, a=2.3)
Out[31]:
-1.41333351100299
In [32]:
y(a=-x); y(x=pi/2, a=pi/3); y(x=0.5, a=2.3)
Out[32]:
-1.41333351100299

Attention: La substitution avec plusieurs paramètres est faite de façon parallèle, alors que plusieurs substitutions effectuent des réécritures séquentielles, comme le montrent les deux exemples ci-dessous :

In [34]:
x, y, z = var('x, y, z') ; q = x*y + y*z + z*x
In [ ]:
bool(q(x=y, y=z, z=x) == q), bool(q(z=y)(y=x) == 3*x^2)

Notons que pour remplacer une sous-expression plus complexe qu’une variable, on dispose de la fonction subs_expr :

In [35]:
y, z = var('y, z'); f = x^3 + y^2 + z
In [36]:
f.substitute(x^3 == y^2, z==1)
Out[36]:
2*y^2 + 1

Exercice: Soit la fonction $f(x)=\frac{(x^3+\alpha )}{(cx+3}$, pour $\alpha=0, 1$

  • Chercher le domaine de definition de la fonction $f$
  • Chercher la dérivé de $f$ sur son domaine de dérivabilité que vous derminerai.
  • Etudier la fonction $f$

Programmation sous Python

In [ ]:
 

Écrire une boucle calculant la somme des entiers de 1 à 100.

In [ ]:
a=0
for i in range(1,101) :
     a=a+i
print a

Écrire une boucle permettant de calculer le terme d’indice n de la suite (un) définie $u_0=1$ et $\forall n\in \mathbb{N}, u_{n+1}=\frac{1}{u_n}+\frac{u_n}{2}$

In [ ]:
n=10
u=1
for i in range(n) : 
    u=1/u+u/2
print u

Écrire un boucle permettant de compter le nombre de fois où la lettre e apparait dans un texte. Vous utilisera la fonction len() qui donne la longueur d'un tableau.

In [ ]:
def countage(text):
    a=0
    for i in range(len(text)) : 
        if (text[i]=='e') :
            a=a+1
    return a
In [ ]:
 
In [ ]:
 
In [ ]:
countage("ffsehhd")

Syntaxe des instructions répétitives de type while en Python :

Écrire un programme qui permet de jouer au jeu suivant : l’ordinateur tire un nombre au hasard (l’instruction correspondante est donnée) entre 1 et 100, puis le joueur essaie de deviner le 4 nombre. À chaque essai, le programme doit préciser au joueur s’il a fait une proposition trop haute ou trop basse. Quand le joueur a trouvé le nombre, le programme doit afficher le nombre d’essais nécessaires au joueur pour gagner.

In [ ]:
from random import *
r=randint(1,100)
a=-1
n=0
while a!=r :
    a=input('Choisissez un entier entre 1 et 100') 
    if a>r :
        print('Trop haut!') 
    elif a<r :
        print('Trop bas !') 
    n=n+1
print('Gagne en '+str(n)+' essais')

Fonctions en python

Syntaxe des définitions de fonctions en Python : def fonction(par1,par2,. . .) : instructions return valeur

Exemple: Construire une foncction qui calcul $n!$

In [ ]:
def factorielle(n) :
    a=1
    for i in range(1,n+1) :
        a=i*a
    return a
In [ ]:
range(1,10+1)
In [ ]:
def factorielle2(n) :
    if (n<=1):
        return 1
    else :
        return(n*factorielle2(n-1))

Calculer $10!$

In [ ]:
factorielle(10)-factorielle2(10)

Modules

Python utilise des bibliotheque appelées modules Liste de modules utiles:

  • random : sert à faire des tirages de nombres aléatoires.
  • mathplotlib : permet de tracer des courbes.
  • numpy et scipy : permettent de faire du calcul formel et de l’analyse numérique en Python.

Pour importer un module on utlise l'une des commandes suivantes:

  • import random (as alias): permet d’importer le module random (la précision entre parenthèses est facultative et permet de renommer le module en l’appelant alias plutôt que random, si on trouve son nom vraiment trop long). Par contre, la commande n’importe pas les noms des fonctions du module, qui devront donc être précédées du nom du module pour pouvoir être utilisées. Exemple, randint(1,100) renverra une erreur, alors que random.randint(1,100) (ou alias.randint(1,100) si on a renommé le module) fera le tirage aléatoire souhaité.
  • from random import randint: permet d'importer que la fonction radint de la bibliotheque random Remarque: Si on souhaite importer toutes les fonctions du module, on remplace simplement le randint par un * (dont la signification standard en informatique est en gros « tout ce qu’il y a dedans »).

Le module numpy : nymerical python

In [ ]:
import numpy as np
In [ ]:
a=np.array([[8,3,2,4],[5,1,6,0],[9,7,4,1]]); a
In [ ]:
type(a)

Remarque : la méthode tolist d’un tableau numpy le transforme en la liste (éventuellement une liste de listes) de ses éléments. Attention, ce c’est pas une fonction du module numpy. On n’écrira donc pas np.tolist(a) mais a.tolist()

In [ ]:
b=a.tolist();b
In [ ]:
c = np.array(b);c # retour tableau 
In [ ]:
a.shape
In [ ]:
np.alen(a)
In [ ]:
a.size
In [ ]:
np.size(a,0)
In [ ]:
np.size(a,1)
In [ ]:
a.ndim

Exercice: On considère la suite: $u_n=\frac{n^{100}}{100^n}$.

  • Calculer les 10 premiers termes de la suite.
  • Quelle est la monotonie de la suite ?
  • Quelle est la limite de la suite ?
  • À partir de quel rang a-t-on $u_n\in\left]0,10^{-8}\right[$ ?

On defini d'abord la suite (on rappel qu'une suite réelle est une fonction $\mathbb{N}$ à valeurs dans $\mathbb{R}$)

In [ ]:
 

Pour définir le terme de la suite un, on utilise une fonction symbolique. On effectue le calcul des 10 premiers termes « à la main »

In [ ]:
 

Pour connaire la monotonie de la suite on va dessiner la fonction generatrice de la suite: Pour cela on va utiliser la fonction plot : plot(u(x), x, 1, 40)

In [ ]: