In [ ]:
from __future__ import division, print_function # Python 3
En Python, la fonction sqrt
retourne un résultat approximé sur les nombres flottants:
In [ ]:
from math import sqrt
sqrt(3)
Out[ ]:
La racine de 3 ne peut pas être écrite exactement avec un nombre fini de décimales, car c'est un nombre irrationel. La façon la plus exacte d'exprimer la racine (positive) du nombre trois est de l'écrire tel quel. En SymPy, la racine carrée de 3 est exprimée symboliquement:
In [ ]:
from sympy import sqrt
sqrt(3)
Out[ ]:
Quand c'est possible, SymPy procède à des simplifications:
In [ ]:
sqrt(4)
Out[ ]:
In [ ]:
sqrt(8)
Out[ ]:
In [ ]:
from sympy import Symbol
a = Symbol("a") # le symbole a est stocké dans la variable a
a
Out[ ]:
Cette variable peut être additionnée, soustraite, multipliée et divisée:
In [ ]:
a + a + a + a * a + 1/a - a
Out[ ]:
Pour plus de commodité, on peut importer les variables les plus souvent utilisées du sous-module abc
:
In [ ]:
from sympy.abc import a, epsilon
a + a * a + epsilon
Out[ ]:
In [ ]:
from sympy import symbols
x4,x5,x6,x7,x8 = symbols("x4:9")
x4 + x5 + x6 + x7 + x8
Out[ ]:
In [ ]:
from sympy import init_printing
init_printing(use_latex='mathjax')
Dans le notebook Jupyter, cette commande utilise la librairie MathJax.
Dans ces notes, on utilisera l'option init_printing(use_latex='mathjax', use_unicode=False)
lorsque cela aide la lecture des formules. Pour un exemple de la section précédente, on obtient:
In [ ]:
from sympy.abc import a, epsilon
a + a * a + epsilon
Out[ ]:
In [ ]:
from sympy.abc import a,b
(a + b)**2
Out[ ]:
ou impliquant les fonctions de SymPy:
In [ ]:
from sympy import sin,cos
sin(a)**2 + cos(a)**2 + b
Out[ ]:
Les expressions symboliques peuvent combiner des rationels, des fonctions et des constantes de toutes sortes:
In [ ]:
from sympy import Rational,pi,exp,I
from sympy.abc import x,y
Rational(3,2)*pi + exp(I*x) / (x**2 + y)
Out[ ]:
In [ ]:
from sympy import srepr
expr = x - y
srepr(x - y)
Out[ ]:
L'expression symbolique est représentée par un arbre d'opérations.
Pour information, l'image a été créée avec Graphviz avec le resultat de la fonction dotprint
:
In [ ]:
from sympy.printing.dot import dotprint
s = dotprint(expr)
In [ ]:
from sympy.abc import a,b,c
expression = a + 2*b + 3*c
expression.subs(a,9)
Out[ ]:
Pour faire plus d'une substitutions, on peut les indiquer dans un dictionaire ({}
) comme ci-bas:
In [ ]:
expression.subs({a:9, b:4})
Out[ ]:
In [ ]:
expression.subs({a:9, b:4, c:100})
Out[ ]:
On peut aussi substituer une variable symbolique par une expression symbolique:
In [ ]:
from sympy import log
from sympy.abc import x,y,z
expression.subs({a:x**2, b:log(y), c:z})
Out[ ]:
In [ ]:
from sympy import pi
pi
Out[ ]:
Cela permet de faire des calculs exacts. Par exemple, le sinus d'un angle de $\pi/3$ est égal à la racine de trois sur deux:
In [ ]:
from sympy import sin, pi
sin(pi/3)
Out[ ]:
La fonction inverse du sinus aussi appelée arc sinus et représentée par la fonction asin
dans SymPy peut retourner des expressions symboliques impliquant des constantes symboliques telles que le nombre $\pi$ :
In [ ]:
from sympy import asin, Rational
asin(1)
Out[ ]:
In [ ]:
asin(Rational(1,2))
Out[ ]:
SymPy sait que les fonctions sinus et arc sinus sont inverses une de l'autre:
In [ ]:
from sympy.abc import x
sin(asin(x))
Out[ ]:
ATTENTION
La fonction sin
du module math
de Python ne peut pas être appelée sur des expressions symboliques, car elle assume que l'argument est un nombre réel (type float):
In [ ]:
from sympy.abc import
from math import sin
sin(x)
Out[ ]:
In [ ]:
from sympy import sin,cos
from sympy.abc import a
r = sin(a)**2 + cos(a)**2
r
Out[ ]:
Pour simplifier une expression, on utilise la commande simplify
:
In [ ]:
from sympy import simplify
simplify(r)
Out[ ]:
Voici un autre exemple:
In [ ]:
simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
Out[ ]:
La fonction simplify
performe une série de simplifications dans un ordre bien choisi. Les simplifications spécifiques incluent besselsimp
, combsimp
, exptrigsimp
, hypersimp
, nsimplify
, powsimp
, radsimp
, ratsimp
, ratsimpmodprime
, signsimp
, simplify
, simplify_logic
, trigsimp
et d'autres encore. Il suffit de consulter le code simplify??
pour voir ce qui se passe et dans quel ordre.
Lorsque l'on sait exactement ce qu'on veut faire sur l'expression symbolique (factoriser, mettre sur un dominateur commun, etc.), on peut utiliser directement la bonne fonction. Cela peut retourner un résultat plus rapidement. Les plus importantes fonctions de modification d'expressions symboliques sont décrites dans les sections qui suivent. On trouvera plus d'informations sur les façons de simplifier une expression dans le tutoriel de SymPy: http://docs.sympy.org/latest/tutorial/simplification.html
Pour développer une expression, on utilise la fonction expand
:
In [ ]:
from sympy import expand
from sympy.abc import a,b
(a + b)**2
Out[ ]:
In [ ]:
expand((a + b)**2)
Out[ ]:
Cela peut mener à des simplifications:
In [ ]:
(a + b)**2 - (a - b)**2
Out[ ]:
In [ ]:
expand(_)
Out[ ]:
Note: En IPython et Jupyter, la barre de soulignement (_
) est une variable qui contient le dernier résultat calculé. Aussi, la double barre de soulignement (__
) est une variable qui contient l'avant-dernier résultat calculé. Finalement, la triple barre de soulignement (___
) est une variable qui contient l'avant-avant-dernier résultat calculé. La quadruple barre de soulignement ne contient rien.
Pour annuler les facteurs communs dans une fonction rationnelle, on utilise cancel
:
In [ ]:
expr = (x**2 + x*y) / x
expr
Out[ ]:
In [ ]:
from sympy import cancel
cancel(expr)
Out[ ]:
In [ ]:
from sympy import factor
factor(x**3 - x**2 + x - 1)
Out[ ]:
Pour factoriser le polynôme sur les nombres de Gauss (nombres complexes à parties imaginaire et réelle entières), on ajoute l'option gaussian=True
:
In [ ]:
factor(x**3 - x**2 + x - 1, gaussian=True)
Out[ ]:
Pour faire la factorisation sur une extension algébrique des nombres rationnels, il suffit de spéficifier un ou des nombres algébriques qui engendrent l'extension:
In [ ]:
factor(x**2 - 5)
Out[ ]:
In [ ]:
factor(x**2 - 5, extension=sqrt(5))
Out[ ]:
In [ ]:
expr = x*z + x**2 + x + x*y + x**2 * w + 5 - x**3
expr
Out[ ]:
On rassemble les termes selon les puissances de x
:
In [ ]:
from sympy import collect
collect(expr, x)
Out[ ]:
In [ ]:
from sympy.abc import x,y,z
1/(x+1) + 1/y + 1/z
Out[ ]:
Pour la mettre au même dénominateur, on utilise ratsimp
:
In [ ]:
from sympy import ratsimp
ratsimp(1/(x+1) + 1/y + 1/z)
Out[ ]:
Alternativement, on peut aussi utiliser la fonction together
. À la différence de ratsimp
la fonction together
préserve le plus possible les termes sous la forme initiale:
In [ ]:
from sympy import together
together(1/(x+1) + 1/y + 1/z)
Out[ ]:
In [ ]:
expr = (3*x**2 + 52*x - 265) / ((x - 7)*(x - 1)*(x + 34))
expr
Out[ ]:
On peut la décomposer en somme de fractions rationnelles à l'aide de la fonction apart
de SymPy:
In [ ]:
from sympy import apart
apart(expr)
Out[ ]:
In [ ]:
A = 1 / (1+sqrt(5))
A
Out[ ]:
In [ ]:
from sympy import radsimp
radsimp(A)
Out[ ]: