Introducción a SymPy#

`SymPy es una librería para Python de matemática simbólica. Para poder usarlo necesitamos importar el paquete SymPy.

import sympy as sp

Para imprimir las fórmulas por pantalla y obtener una visualización tipográfica agradable, además es necesario ejecutar:

sp.init_printing()

Tenga en cuenta que esto puede cambiar según cual sea de la versión de sympy

Luego, ya para comenzar con la operatorio simbólica, necesitamos crear un símbolo.

x = sp.Symbol('x')
x
../../../_images/9483708921e282f0e84269462e67c48821262036a8396ae5ae0f62e2b0e058f4.png

SymPy nos permite hacer muchas operaciones matemáticas que serían tediosas a mano. Por ejemplo, podemos expandir un polinomio:

polynomial = (2*x + 3)**4
polynomial.expand()
../../../_images/352fe21ba8362573a4ffd885a05a1cc31237e456c483d558e903777d5868353b.png

Observe lo que sucedió: definimos un nuevo nombre llamado polynomial y luego usamos el método .expand() para expandir el polinomio. Podemos ver todos los métodos asociados con un objeto escribiendo su nombre y un punto y luego presionando «tabulador».

Acceda a la lista de métodos para la variable polynomial ingresando «.» y presionando tabulador al final de la línea en la celda a continuación.

Para obtener ayuda sobre cualquier método, podemos escribir su nombre y agregar un ? al final, luego evaluar la celda.

Obtenga ayuda sobre el método .expand() mediante la evaluación de la celda a continuación:

polynomial.expand?

También es posible obtener ayuda para una función colocando el cursor entre los paréntesis y presionando Mayúscula + Tabulador

Por supuesto, también podemos factorizar polinomios:

(x**2 + 2*x + 1).factor()
../../../_images/72706bde946b28cb53c68740ca8a79f2abc8451dc3461f57f4f671f2431afe6e.png

Cálculo#

SymPy sabe integrar y diferenciar.

polynomial.diff(x)  # First derivative
../../../_images/f36282a4a8ce84165df120bb65e494407037a4ce5e3c59e80b5a3f8b055564a5.png
polynomial.diff(x, 2)  # Second derivative
../../../_images/5b7f8e8676e43dcc3021607d4b7c8049d3d1de779deb1b3da926fe138177d3cd.png
# indefinite integral - note no constant of integration is added
polynomial.integrate(x)
../../../_images/585412427534cd5aa3a1e5f174355b3d9d498b0a9ef8ff66413fc57f98c1fa85.png
# Note that integrate takes one argument which is a tuple for the definite
# integral
polynomial.integrate((x, 1, 2))
../../../_images/c3dd6981099c2c2a85cada6677cd8107007b9bfb83ebbdb0e20cc942a39c9178.png

Límites#

Podemos evaluar los límites usando SymPy, incluso para límites «interesantes» donde necesitaríamos la regla de L’Hopital

sp.limit((2*sp.sin(x) - sp.sin(2*x))/(x - sp.sin(x)), x, 0)
../../../_images/f60fdb959f23d97d2b51b8f06ef5d92113e5a21a9d0653d4e1c47f9f5e2f74e0.png

Aproximación#

SymPy tiene soporte incorporado para la expansión de series de Taylor

nonlinear_expression = sp.sin(x)

# taylor expansion in terms of the x variable, around x=2, first order.
sp.series(nonlinear_expression, x, 2, 2)
../../../_images/845bed3cc859679c9af6646bd9cac74a9725a62d26426e7778340ce34e954ef0.png

Para eliminar el término de perdida use .removeO()

temp = sp.series(nonlinear_expression, x, 2, 2)
temp.removeO()
../../../_images/9f8b2843f85a809f4c65e060e9c5f1edde44009274b0ad548330069df0d5dba5.png

También notará que el comportamiento predeterminado de SymPy es retener representaciones exactas de ciertos números:

number = sp.sqrt(2)*sp.pi
number
../../../_images/84c66cb53289dfdf74a79a5cf41ffb2a4103774af9d6a2ba12137a3e65a07993.png

Para convertir las representaciones exactas de arriba en representaciones aproximadas de punto flotante, use uno de estos métodos:

  • sympy.N funciona con expresiones complicadas que también contienen variables.

  • float devolverá un número de tipo float de Python normal y es útil cuando se interactúa con programas que no son de SymPy.

sp.N(number*x)
../../../_images/a49385c51818343f35503fff8c65921384bab6f9a21213222d1911fe9c024c80.png
float(number)
../../../_images/ecd6113d2fdb6319e91bc54e0b5533c5337b0b4acfdf7798209cdaa7b8eeffb5.png

Resolver ecuaciones#

SymPy puede ayudarnos a resolver y manipular ecuaciones utilizando la función solve. Como muchas funciones de resolución, encuentra ceros de una función, por lo que tenemos que reescribir las ecuaciones de igualdad para que sean iguales a cero,

\[\begin{split} \begin{aligned} 2x^2 + 2 &= 4 \\ 2x^2 + 2 - 4 &= 0 \end{aligned} \end{split}\]
solutions = sp.solve(2*x**2 + 2 - 4)
solutions
../../../_images/dfaac388b0345be70dcf8514e3a3c77ac35171c59c59746e3b7a10ec96f9f73f.png
solutions[0]
../../../_images/d7eadbadca2a3af6989bc68080b986324b1ad96bb6b19a82667f9f0443d660ad.png

También podemos usar sp.Eq para construir ecuaciones

equation = sp.Eq(2*x**2 + 2, 4)
equation
../../../_images/1c8f12042050e7f4596d70ad3c6f48133b0d9458dfa86ecf96c4a285e624c90c.png

La función roots nos dará también la multiplicidad de las raíces.

sol = sp.roots(equation)
sol
../../../_images/01f79bd47cc62d99fd1c41f008147a8601bee4afe70ed45adb3defe97b641923.png

Esto no dice que la ecuación anterior tiene una solución -1 y otra solución igual 1.

También podemos resolver sistemas de ecuaciones pasando una lista de ecuaciones para resolver y pidiendo una lista de variables para resolver.

x, y = sp.symbols('x, y')
sp.solve([x + y - 2,
          x - y - 0], [y, x])
../../../_images/73adeb7c60f34bc356d8516578204551b4176cd8a8c5c43365f159708c6b15a5.png

Esto incluso funciona con variables simbólicas en las ecuaciones.

a, b, c = sp.var('a, b, c')
solution = sp.solve([a*x + b*y - 2,
                     a*x - b*y - c], [x, y])
solution
../../../_images/a520397827692855a28788be72d14615d3fdb93291520492d151b34dcc55a5aa.png
solution.items()
dict_items([(x, (c + 2)/(2*a)), (y, (2 - c)/(2*b))])
a = [i for i in solution.values()]
a[0]
../../../_images/4779d3b5a308f41ecacfa77fb27c2038528bfc0080a094f5baabce2514815891.png
a[1]
../../../_images/703dd23b0b13d744d97e939164a9ac79074e4de96272ec7d78f5e5360d033652.png