Support de cours Semaine 9

Expressions symboliques

Avec Sagemath, on peut construire des fonctions comme des expressions symboliques. Ces expressions sont composées de valeurs (par exemple, des entiers), et de variables. Les variables sont parfois substituées par des valeurs, ce qui correspond à évaluer la fonction.

Création de variables. Pour créer les variables d'une expression symbolique, on utilise le mot-clef var. La syntaxe est particulière. Pour une variable x :

In [1]:
var('x')
Out[1]:
x

Pour deux variables x et y :

In [2]:
var('x y')
Out[2]:
(x, y)

Déclaration d'une expression symbolique. On peut ensuite créer une expression symbolique en fonction de ces variables, à partir des opérateurs usuels (+, *, etc.) ou de certaines fonctions mathématiques déjà implantées dans Sagemath (exp, log, sin, etc.).

In [3]:
x*exp(y) - 1
Out[3]:
x*e^y - 1
In [4]:
f = x*exp(y) - 1

Évaluation/substitution. Pour évaluer l'expression symbolique, il faut préciser quelle variable doit être substituée.

In [5]:
f(y=0)
Out[5]:
x - 1
In [6]:
f(x=1)
Out[6]:
e^y - 1
In [7]:
f(x=0, y=1)
Out[7]:
-1
In [8]:
f(x=y)
Out[8]:
y*e^y - 1

Dérivation

Les expressions symboliques représentant souvent des fonctions, on veut parfois les dériver par rapport à l'une de leurs variables. Pour cela, on peut utiliser la fonction diff() :

  • Le premier argument de diff est l'expression symbolique.
  • Ensuite, on ajouter la variable selon laquelle la dérivation doit être faite.
  • Enfin, de manière optionnelle, l'ordre de dérivation.
In [9]:
var('x y')
f = x*exp(y) - 1

dfx = diff(f, x)
dfy = diff(f, y)
print(dfx)
print(dfy)
e^y
x*e^y
In [10]:
d2fx =  diff(f, x, 2)
d2fx
Out[10]:
0

Primitives et intégrales

Primitives. Pour calculer une primitive d'une fonction, on utilise la fonction integrate. Comme pour diff, le premier argument est la fonction dont on veut trouver une primitive, et le second est la variable.

In [11]:
var('x y')
g = x*exp(x)

integrate(g, x)
Out[11]:
(x - 1)*e^x
In [12]:
f = x*exp(y) - 1
integrate(f, y)
Out[12]:
x*e^y - y

Intégrales. Pour calculer une intégrale, on utilise la même syntaxe en ajoutant les bornes d'intégration

In [13]:
integrate(sin(x), x, 0, pi)
Out[13]:
2

Remarques importantes. Certaines fonctions n'ont pas de primitives/intégrales connues. On vous renvoie alors l'expression symbolique associée

In [14]:
f = sqrt(ln(x**2))
integrate(f, x)
Out[14]:
integrate(sqrt(log(x^2)), x)

D'autres passent par des fonctions "spéciales" :

In [15]:
f = exp(-x**2)
show(integrate(f, x))

Remarque avancée. On peut même placer une variable dans les bornes, mais il faut faire comprendre à Sagemath que cette variable ne peut pas prendre n'importe quelle valeur.

In [16]:
assume(y>0)
integrate(cos(x), x, -y, y)
Out[16]:
2*sin(y)

Limites

Sagemath permet de calcul de limites. Pour cela, on peut utiliser la fonction limit. Le premier argument est l'expression symbolique. Le second est de la forme x=a, où x est la variable et a la valeur vers laquelle on souhaite tendre.

Par exemple, pour $$ \lim_{t \to a} \frac{1}{1-t} $$ avec différentes valeurs de $a$.

In [17]:
var('t')
h = 1/(1-t)

Si $a = 0$ (point de continuité) :

In [18]:
limit(h, t=0)
Out[18]:
1

Si $a = 1$ (point de divergence) :

In [19]:
limit(h, t=1)
Out[19]:
Infinity

On peut préciser si on veut la limite à gauche ou à droite :

In [20]:
limit(h, t=1, dir="+")
Out[20]:
-Infinity
In [21]:
limit(h, t=1, dir="-")
Out[21]:
+Infinity

Sage calcule aussi les limites à l'infini :

In [22]:
limit(h, t=+oo)
Out[22]:
0

Somme partielles et séries

Sommes finies. On déjà vu la fonction sum() pour sommer les éléments d'une liste. En réalité, elle permet de faire des calculs plus complexes. Par exemple, on peut effectuer la somme des termes d'une suite. Pour cela, on déclare une variable n et une fonction de n (ici, $f(n) = n^2$).

In [23]:
var('n, m')
f = n**2

Si l'on souhaite calculer la somme des termes de $f(0)$ à $f(4)$, la syntaxe est la suivante :

In [24]:
somme = sum(f, n, 0, 4)
print(somme)
30

On note que le premier argument est l'expression symbolique à évaluer et somme. Le second est la variable. Puis, on donne la première et la dernière valeur que doit prendre la variable.

On peut également somme jusqu'à un entier non-déterminé représenté par une autre variable (ici $m$) :

In [25]:
somme = sum(f, n, 0, m)
print(somme)
1/3*m^3 + 1/2*m^2 + 1/6*m

Puis, en factorisant l'expression, on reconnaît la formule de sommation $$ \sum_{n=1}^m n^2 = \frac{m(m+1)(2m+1)}{6} $$

In [26]:
show(factor(somme))

Séries. Sagemath permet également de calcul de somme infinies (les "séries"). Par exemple, pour la série géométrique, les sommes partielles (jusque $m$) sont :

In [27]:
var('n, m')
f = 2**(-n)

somme_geo = sum(f, n, 0, m)
print(somme_geo)
(2^(m + 1) - 1)/2^m

Et on peut en prendre la limite :

In [28]:
limit(somme, m=oo)
Out[28]:
+Infinity

Il y a une syntaxe plus directe pour calculer cette série :

In [29]:
sum(f, n, 0, oo)
Out[29]:
2

On peut même calculer la série dans un cadre plus général ($x$ quelconque au lieu de $1/2$). Il faut simplement préciser les conditions qui permettent à la série de converger.

In [30]:
var('x')
assume(abs(x)<1)

f = x**n
sum(f, n, 0, oo)
Out[30]:
-1/(x - 1)

Équations différentielles

Sagemath permet la résolution de certaines équations différentielles. Pour cela, il faut utiliser la fonction desolve.

Prenons l'exemple de l'équation différentielle $$ y'(t) + \frac{1}{t}y(t) = 1 $$

On déclare d'abord y comme une variable de "type fonction" :

In [31]:
var('t')
y = function('y')(t) 

Puis, on résout l'équation différentielle avec desolve :

  • le premier argument est l'équation à résoudre, sous la forme d'une expression symbolique
  • le second argument est l'inconnue
In [32]:
desolve(diff(y,t) + y/t -1 , y)
Out[32]:
1/2*(t^2 + 2*_C)/t

On observe que Sagemath donne une expression avec une constante non-déterminée _C.

On peut ajouter les conditions initiales, par exemple $y(3) = 7$, avec la syntaxe suivante :

In [33]:
desolve(diff(y,t) + y/t -1 , y, [3,7])
Out[33]:
1/2*(t^2 + 33)/t

Enfin, on peut également résoudre des équations d'ordre supérieur. Par exemple pour $y'' = y$ :

In [34]:
desolve(diff(y,t,2) - y, y)
Out[34]:
_K2*e^(-t) + _K1*e^t