- dim. 04 février 2018
- Cours
- #ipython jupyter
%matplotlib inline
%autosave 300
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family'] = 'serif'
rcParams['font.size'] = 14
from IPython.core.display import HTML
from IPython.display import display,Image
from matplotlib import animation
#from JSAnimation import IPython_display
css_file = 'style.css'
HTML(open(css_file, "r").read())
Calcul symbolique avec sympy¶
Marc BUFFAT, dpt mécanique, Université Lyon 1
Mise à disposition selon les termes de la Licence Creative Commons
Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 2.0 France.
Systèmes de calcul symbolique (CAS)¶
- Maple [http://www.maplesoft.com] système propriétaire autonome
- Mathematica [http://www.wolfram.com/mathematica] système propriétaire autonome
- Sage [http://www.sagemath.org] système libre, interface WEB
- sympy bibliothéque sous Python, la + simple
Sympy¶
utilisation avec une sortie formattée LaTeX
pprint(expr) affiche expr
str(expr)
latex(expr)
manipulation avec des méthodes
expr.simplify()
expr.factor()
expr.expand()
import sympy as sy
sy.init_printing()
Variables symboliques¶
# symbole (variable)
x= sy.Symbol('x')
(sy.pi+x)**2
# fonction
f=sy.Function('f')
f(x+2)
On peut définir au début du programme une liste de variables symboliques avec leurs types et propriétés (entiere, positive, ..)
x,y,z,t=sy.symbols('x,y,z,t')
i,j,k=sy.symbols("i,j,k",integer=True)
f,g,h=sy.symbols("f,g,h",cls=sy.Function)
yp=sy.Symbol('x',positive=True)
yp<0
Liste de variables courantes
import sympy.abc
dir(sympy.abc)
from sympy.abc import w,omega
print(type(omega))
nombre complexe¶
$$ I = \sqrt{-1}$$from sympy import I
1+1*I
(x+I)**2
nombre rationnel (fraction)¶
r1=sy.Rational(3,6)
r2=sy.Rational(4,16)
r1+r2
Evaluation¶
exp.evalf(n=20)
N(exp,n=20)
from sympy import pi
print(pi.evalf(100))
print(sy.N(pi,100))
substitution¶
exp.subs(x,val)
exp.subs([(x1,val1),(x2,val2),..])
y=(x+pi)**2
y.subs(x,z+pi)
évaluation numérique¶
X=np.linspace(-10,10,51)
Y=np.array([sy.N(y.subs(x,val)) for val in X])
plt.plot(X,Y)
F = sy.lambdify([x],y,'numpy')
Y=F(X)
plt.plot(X,Y)
comparaison de l’éfficacité!!!
utiliser lambdify pour l'évaluation numérique des fonctions
%%timeit
Y=np.array([sy.N(y.subs(x,val)) for val in X])
%%timeit
Y=F(X)
Manipulation algébrique¶
equalité
Eq(y,x) equation y=x y=x affectation y==x test egalité
eq=sy.Eq(y,x**2)
print(eq)
print(sy.latex(eq))
eq
yy=x**2
print(yy)
yy
yy == x**2
- manipulation d’expression
factorisation expansion simplify collect
expr=(1+x)**3;
a=expr.expand()
a
a.factor()
a=(x + x**2)/(x*sy.sin(y)**2 + x*sy.cos(y)**2)
sy.pprint(a)
a.simplify()
sy.collect(i*x**2 + j*x**2 + i*x - j*x + k, x)
- dérivation
exp.diff(x) dériv. / x exp.diff(x,x) dériv. 2nd exp.diff(x,n) dériv. ordre n
f(x).diff(x,3)
- intégration
intégrale indéfinieintegrate(exp,x)
intégrale définie entre a et bintegrate(exp,(x,a,b))
sy.Integral(sy.sin(x**2),x)
sy.integrate(sy.sin(x**2),x)
- limite
limite pour x=val (oo = infinie)limit(exp,x,val)
sy.limit(sy.sin(x)/x,x,0)
- series de Taylor
développement en serie d’ordre nexp.series(x,val,n)
enleve ordre (polynome)removeO()
expr=sy.sin(x)/x
expr.series(x,0,6)
expr.series(x,0,6).removeO()
- approximation par différences finies (version 0.7.6)
calcul différences finiesas_finite_diff(expr)
as_finite_diff(expr,[pts])
h=sy.Symbol('h')
sy.Derivative.as_finite_difference(f(x).diff(x,2),h)
sy.Derivative.as_finite_difference(f(x).diff(x),h)
sy.Derivative.as_finite_difference(f(x).diff(x,4),h)
- résolution d’equations algébriques
résoud l’équation eq par rapport à varsolve(eq,var)
résoud un système d’équationssolve([eq],[var])
sy.solve(x**2-y,x)
y=sy.Rational(1,4)
sy.solve(sy.cos(x)-y,x)
Equations de Lagrange
euler_equations(L,fonct.,var.)
m,g=sy.symbols('m,g')
L=m*sy.diff(x(t),t)**2/2 - g*x(t)
sy.euler_equations(L,x(t),[t])
Formulation de Lagrange pour le pendule double¶
m,g,l=sy.symbols('m,g,l')
theta1,theta2=sy.symbols('theta1,theta2')
dtheta1=theta1(t).diff(t)
dtheta2=theta2(t).diff(t)
Ec=m*l**2/6*(4*dtheta1**2+dtheta2**2+3*dtheta1*dtheta2*sy.cos(theta1(t)-theta2(t)))
print("énergie cinétique E:")
Ec
Up=-m*g*l/2*(3*sy.cos(theta1(t))+sy.cos(theta2(t)))
print("énergie potentielle U:")
Up
L=Ec-Up
print("Lagrangien L:")
L
print("Equations de lagrange")
eq=sy.euler_equations(L,{theta1(t),theta2(t)},[t])
eq
print("forme numérique ")
print(eq)
Résolution d’EDO¶
soit l’EDO $$ \frac{d^2y}{d x^2} - \omega^2 y = x^2 $$ avec les conditions $$y(0)=1, \frac{d y}{dx}(1)=0 $$
tracer de la solution analytique pour $\omega=2\pi$
x,y,C1,C2 = sy.symbols('x,y,C1,C2')
omega = sy.Symbol('omega',positive=True)
eq=y(x).diff(x,x)+omega**2*y(x)-x**2
eq
sol=sy.dsolve(eq,y(x))
sol
print("extraction terme de gauche et droite")
sol.lhs, sol.rhs
# conditions aux limites en 0 et 1
ys=sol.rhs
eq1=ys.subs(x,0)-1
eq2=sy.diff(ys,x).subs(x,1)
eq1,eq2
# valeurs des coefficients
sol=sy.solve({eq1,eq2},{C1,C2})
sol
# d'où la solution
ysol=ys.subs([(C1,sol[C1]),(C2,sol[C2])])
ysol
# conversion en fonction numérique
Ys=sy.lambdify(x,ysol.subs(omega,2*pi),'numpy')
X=np.linspace(0,1,50)
Y=Ys(X)
plt.plot(X,Y)
Algébre linéaire¶
Matrix matrice ou vecteur
résolution (solve)
inversion (inv)
décomposition QR
M=sy.Matrix([[1,x],[x,2]])
M.inv()
b=sy.Matrix([1,2])
M.solve(b)
A=sy.Matrix([[1,1,3],[4,5,6],[7,8,9]])
Q,R = A.QRdecomposition()
sy.pprint(Q)
Q*R
Pattern matching¶
calcul de paramêtres par correspondance de modèle
expr=(1+5*x+x**2)**2
expr
p = sy.Wild('p', exclude=[x])
expr.match((p*x+1+x**2)**2)
Documentation¶
- http://docs.sympy.org documentation sympy
- http://docs.sympy.org/dev/tutorial/intro.html tutorial sympy
Bibliothéques utilisées¶
print("\t\tSystème utilisé")
import sys
print("Système :\t\t",sys.platform)
import platform
print(platform.platform())
print("Ordinateur:\t\t",platform.machine())
print("Version de Python:\t",sys.version)
import IPython
print("Version de IPython:\t",IPython.__version__)
import numpy
print("Version de numpy:\t",numpy.version.version)
import scipy
print("Version de scipy:\t",scipy.version.version)
import matplotlib
print("Version de matplotlib:\t",matplotlib.__version__)
import sympy
print("Version de sympy:\t",sympy.__version__)