Aller au contenu principal

Calcul avec `SymPy`

Lien

Calculus — SymPy documentation

Configurer SymPy

Avant les opérations de calcul, initialisez SymPy avec des symboles et des fonctions :

from sympy import symbols, diff, integrate, limit, series, sin, exp, ln, oo

# Define symbols
x, y, z = symbols('x y z')

Dérivation

Dérivez les fonctions symboliquement :

# Differentiate f(x) = x^2
f_prime = diff(x**2, x) # Returns 2*x

# Partial differentiation of f(x, y) = x^2 + xy
partial_f_x = diff(x**2 + x*y, x) # Returns 2*x + y
partial_f_y = diff(x**2 + x*y, y) # Returns x

Intégration

Effectuez des intégrations définies et indéfinies :

# Indefinite integration of f(x) = x^2
integral_f = integrate(x**2, x) # Returns x**3/3

# Definite integration of f(x) = x^2 from 0 to 1
definite_integral_f = integrate(x**2, (x, 0, 1)) # Returns 1/3

Limites

Calculez la limite d’une fonction lorsqu’une variable tend vers une valeur :

# Limit of sin(x)/x as x -> 0
lim_sin_x = limit(sin(x)/x, x, 0) # Returns 1

# Limit of (1+1/x)^x as x -> infinity
lim_exp = limit((1+1/x)**x, x, oo) # Returns E

Développement en série

Développez les fonctions en série de Taylor autour d’un point :

# Keep powers below x**5; O(x**5) is the remainder order
series_exp = series(exp(x), x, 0, 5)
# Returns 1 + x + x**2/2 + x**3/6 + x**4/24 + O(x**5)

# Series expansion of ln(1+x) around 0
series_ln = series(ln(1+x), x, 0, 4)
# Returns x - x**2/2 + x**3/3 + O(x**4)

Résoudre des équations différentielles

SymPy peut aussi résoudre symboliquement des équations différentielles. Voici un exemple élémentaire :

from sympy import Function, dsolve, Eq, Derivative

# Define an unknown function and differential equation
f = Function('f')
diffeq = Eq(Derivative(f(x), x, x) - 2*Derivative(f(x), x) + f(x), sin(x))

# Solve the differential equation
sol = dsolve(diffeq, f(x))

Hypothèses, valeurs exactes et vérifications

Exécutez les extraits dans l'ordre dans un environnement Python où SymPy est déjà disponible. Ils illustrent des résultats symboliques, sans garantir une forme fermée pour toute intégrale ou équation différentielle. Un objet Integral non évalué signifie que l'intégration n'a pas été effectuée, pas que sa valeur est zéro. Le tutoriel officiel explique ces objets et les termes d'ordre des séries.

Les symboles n'ont pas de contraintes sans hypothèses explicites. Par exemple, simplifier r2\sqrt{r^2} en rr est faux pour un réel négatif : le résultat est r|r|. Utilisez des nombres SymPy exacts pour l'algèbre exacte :

from sympy import Rational, sqrt, simplify, Abs

r = symbols('r', real=True)
p = symbols('p', positive=True)
assert sqrt(r**2) == Abs(r)
assert sqrt(p**2) == p
assert integrate(x**2, (x, 0, 1)) == Rational(1, 3)
print(Rational(1, 3).evalf(20))

Écrire d'abord 1/3 en Python crée une approximation flottante ; augmenter ensuite la précision d'affichage ne restaure pas l'exactitude perdue. integrate(x**2, x) donne une primitive ; la famille générale contient aussi une constante additive arbitraire. Vérifiez une primitive en la dérivant sur son domaine.

Pour une limite en un point fini, précisez le côté d'approche lorsque les côtés peuvent différer :

assert limit(1/x, x, 0, dir='+') == oo
assert limit(1/x, x, 0, dir='-') == -oo
assert simplify(diff(integral_f, x) - x**2) == 0

Les limites latérales diffèrent ici : il n'y a pas de limite bilatérale. Un développement terminé par O(x**5) conserve les puissances inférieures à cinq ; supprimer le terme d'ordre donne une approximation polynomiale locale, pas une égalité globale.

L'équation différentielle précédente a pour solution générale f(x)=(C1+C2x)ex+12cosxf(x)=(C_1+C_2x)e^x+\tfrac12\cos x. Il faut deux conditions initiales pour déterminer ses deux constantes. Vérifiez l'équation et les conditions, plutôt que la seule forme affichée :

from sympy import cos

C1, C2 = symbols('C1 C2')
g = (C1 + C2*x)*exp(x) + cos(x)/2
assert simplify(diff(g, x, 2) - 2*diff(g, x) + g - sin(x)) == 0
sol_ivp = dsolve(diffeq, f(x), ics={f(0): 0, diff(f(x), x).subs(x, 0): 0})
assert simplify(sol_ivp.rhs - ((x - 1)*exp(x) + cos(x))/2) == 0
Explorer les liensOuvrir le réseau