Cálculo simbólico con Sympy
Sympy permite hacer operaciones analíticas o con símbolos en lugar de
con valores numéricos Al igual que en Python existen varios tipos de
datos numéricos como enteros (int), decimales (float) o booleanos
(bool:True, False, etc.), Sympy
posee tres tipos de datos propios: Real, Rational e Integer, es decir,
números reales, racionales y enteros. Estoquiere decir que Rational(1,2)
representa 1/2, Rational(5,2)
a 5/2, etc. en lugar de 0.5 o 2.5.
>>> import sympy as sp
>>> a = sp.Rational(1,2)
>>> a
1/2
>>> a*2
1
>>> sp.Rational(2)**50/sp.Rational(10)**50
1/88817841970012523233890533447265625
También existen algunas constantes especiales, como el número
o, si embargo éstos se tratan con símbolos y no tienen un valor númerico determinado. Eso quiere decir que no se puede obtener un valor numérico de una operación usando el pi de Sympy, como (1+pi), como lo haríamos con el de Numpy, que es numérico:
>>> sp.pi**2
pi**2
>>> sp.pi.evalf()
3.14159265358979
>>> (sp.pi + sp.exp(1)).evalf()
5.85987448204884
como se ve, sin embargo, se puede usar el método evalf()
para evaluar una expresión para tener un valor en punto flotante (float).
Para hacer operaciones simbólicas hay que definir explícitamente los símbolos que vamos a usar, que serán en general las variables y otros elementos de nuestras ecuaciones:
>>> x = sp.Symbol('x')
>>> y = sp.Symbol('y')
Y ahora ya podemos manipularlos como queramos:
>>> x+y+x-y
2*x
>>> (x+y)**2
(x + y)**2
>>> ((x+y)**2).expand()
2*x*y + x**2 + y**2
Es posible hacer una substitución de variables usando subs(viejo, nuevo):
>>> ((x+y)**2).subs(x, 1)
(1 + y)**2
>>> ((x+y)**2).subs(x, y)
4*y**2
Operaciones algebraicas
Podemos usar apart(expr, x)
para hacer una descomposición parcial de fracciones:
>>> 1/( (x+2)*(x+1) )
1
───────────────
(2 + x)*(1 + x)
>>> sp.apart(1/( (x+2)*(x+1) ), x)
1 1
─────── - ────────
1 + x 2 + x
>>> (x+1)/(x-1)
-(1 + x)
─────────
1 - x
>>> sp.apart((x+1)/(x-1), x)
2
1 - ──────
1 - x
Cálculo de límites
Sympy puede calcular límites usando la función limit()
con la siguiente sintaxis: limit(función, variable, punto)
, lo que calcularía el limite de
cuando variable -> punto:
.. code:: ipython3
sp.limit(sin(x)/x, x, 0)
1
es posible incluso usar límites infinitos:
>>> sp.limit(x, x, oo)
oo
>>> sp.limit(1/x, x, oo)
0
>>> sp.limit(x**x, x, 0)
1
Cálculo de derivadas
La función de Sympy para calcular la derivada de cualquier función es diff(func, var)
. Veamos algunos ejemplos:
>>> x = sp.Symbol('x')
>>> diff(sp.sin(x), x)
cos(x)
>>> diff(sp.sin(2*x), x)
2*cos(2*x)
>>> diff(sp.tan(x), x)
1 + tan(x)**2
Se puede comprobar que es correcto calculando el límite:
>>> dx = sp.Symbol('dx')
>>> sp.limit( (tan(x+dx)-tan(x) )/dx, dx, 0)
1 + tan(x)**2
También se pueden calcular derivadas de orden superior indicando el
orden de la derivada como un tercer parámetro opcional de la función diff()
:
>>> sp.diff(sin(2*x), x, 1) # Derivada de orden 1
2*cos(2*x)
>>> sp.diff(sin(2*x), x, 2) # Derivada de orden 2
-4*sin(2*x)
>>> sp.diff(sin(2*x), x, 3) # Derivada de orden 3
-8*cos(2*x)
http://research.iac.es/sieinvens/python-course/sympy.html
ResponderBorrar