Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
El entorno sympy como CAS (del inglés computer algebra system) Los sistemas de álgebra computacional aparecieron al principio de la década de los 70, y evolucionaron a partir de la investigación en inteligencia artificial, aunque hoy en día constituyen campos ampliamente separados. Los primeros trabajos fueron dirigidos por el Premio Nobel Martin Veltman, quien diseñó en 1963 un programa para matemática simbólica, llamado Schoonship, especializado en Física de Altas Energías. Los primeros sistemas populares fueron Reduce y Macsyma. Hoy en día, una versión copyleft de Macsyma llamada Maxima es mantenida activamente. Posteriormente, en los años 1980 adquirió popularidad Derive (actualmente discontinuado). Los actuales líderes del mercado propietario son Maple y Mathematica; ambos son usados frecuentemente en ingeniería e investigaciones matemáticas. SymPy es una biblioteca escrita en Python cuyo objetivo es reunir todas las características de un sistema de álgebra computacional (CAS), ser fácilmente extensible y mantener el código todo lo simple que sea posible. SymPy no requiere ninguna biblioteca externa, salvo para soporte gráfico. Aspectos básicos El alma del Cálculo Simbólico son, naturalmente, las variables simbólicas, que en SymPy son instancias de la clase Symbol. Una explicación intuitiva sería que, mientras que las variables ordinarias tienen un valor que puede ser un número, una cadena, un valor verdadero / falso, una secuencia, etc. las variables simbólicas juegan el papel de contenedores: no sabemos a priori lo que pueden ser. En SymPy existe un entorno integrado para efectuar cálculos de manera interactiva que se conoce como isympy. hcaste@azul2:~$ isympy IPython console for SymPy 0.7.6.1 (Python 2.7.1264bit) (ground types: gmpy) These commands were executed: >>> from __future__ import division >>> from sympy import * >>> x, y, z, t = symbols('x y z t') >>> k, m, n = symbols('k m n', integer=True) >>> f, g, h = symbols('f g h', cls=Function) >>> init_printing() Documentation can be found at http://www.sympy.org In [1]: Veamos algunos aspectos claves: En SymPy, todas las variables simbólicas que vayamos a utilizar se tienen que definir antes. Esto se realiza con el método constructor symbol(), este permite definir constantes, variables y funciones contenedoras. Al definir una variable, podemos añadir una serie de suposiciones sobre ella (assumptions): por ejemplo, hemos dicho que "x, y, z, t" será de tipo complejo y que "k, m, n" serán tipo entero. Esto es muy importante a la hora de trabajar. Como desconozco el valor numérico de los contenedores entonces su evaluación produce otro contenedor. Por ejemplo: In [1]: cos(n * pi) Out[1]: (1) n In [2]: _ ** 2 Out[2]: 1 con la sobrecarga type se puede saber que tipo de contenedor se refiere: In [4]: type(x) Out[4]: sympy.core.symbol.Symbol n [5]: type(n) Out[5]: sympy.core.symbol.Symbol In [6]: n=2 In [7]: type(n) Out[7]: int Nota: el objeto al cual le asigna symbol puede no coincidir con el nombre del contenedor, por ejemplo: In [11]: d=symbols("c_v") In [12]: d Out[12]: cᵥ Pero para evitar confusiones de inexperto, no conviene hacer esto. Manipulación de expresiones numéricas En el caso de números se pude definir un racional con el método Rational(,) In [1]: a = Rational(1,3) In [2]: print a 1/3 In [3]: print 3*a 1 In [4]: Rational(2)**50/Rational(10)**50 Out[4]: 1/88817841970012523233890533447265625 Nota: sympy por defecto toma la división entera a menos que se coloque la clausula from __future__ import division Por defecto sympy no evalúa las constantes irracionales, esto se hace por medio del método evalf() In [6]: pi**2 Out[6]: π2 In [8]: pi.evalf() Out[8]: 3.14159265358979 Existe el objeto numérico llamado infinito, y se lo representa como oo In [9]: oo > 99999 Out[9]: True In [10]: oo + 1 Out[10]: ∞ Manipulación de expresiones Para manipular expresiones algebraicas que involucren variables simbólicas en SymPy hay tres herramientas básicas: la sustitución, las funciones de simplificación, expansión y las suposiciones. Sustitución El método subs(old, new) permite modificar un contenedor por otro o por un tipo numérico In [11]: ((x+y)**2).subs(x, 1) Out[11]: (y + 1) 2 In [12]: ((x+y)**2).subs(x, y) Out[12]: 4 y⋅ 2 Expansiones Por defecto sympy no expande una expresión a menos que se use el método expand() In [13]: (x+y)**2 Out[13]: (x + y) 2 In [14]: ((x+y)**2).expand() Out[14]: x2 + 2 x y + y⋅ ⋅ 2 Simplificación Sympy cuando puede simplifica In [26]: x+y+x-y Out[26]: 2 x⋅ SymPy pone a nuestra disposición multitud de métodos para reescribir las expresiones en una forma que nos sea más cómoda o que nos aporte algún tipo de beneficio. Estos pertenecen a la clase class sympy.core.expr.Expr, por ejemplo apart(expr, x) permite descomponer en fracciones simples In [27]: apart(1/( (x+2)*(x+1) ), x) Out[27]: − 1 x+2 + 1 x+1 together(expr, x) permite unir en mínimo común múltiplo fracciones racionales In [28]: together(1/x + 1/y + 1/z) Out[28]: x y+x z+ y x x y z cancel() simplifica una función racional In [29]: cancel((1 - x ** 2) / (1 + x)) Out[29]: -x + 1 expand_trig() expande una expresión trigonométrica In [30]: expand_trig(cos(3*x)) Out[30]: 4 cos⋅ 3 (x) - 3 cos(x)⋅ In [31]: expand(cos(3 * x), trig=True) #equivalente Out[31]: 4 cos⋅ 3 (x) - 3 cos(x)⋅ En resumen un conjunto de métodos útiles In [32]: (1 + I) * (1 + sin(x)) Out[32]: (1 + ) (sin(x) + 1)ⅈ ⋅ In [33]: expand(_) # Hace los productos y expande la expresión Out[33]: sin(x) + sin(x) + 1 + ⅈ⋅ ⅈ In [34]: collect(_, sin(x)) # Saca factor común Out[34]: (1 + ) sin(x) + 1 + ⅈ ⋅ ⅈ In [35]: _.subs(1 + I, t) # Voy a hacer un cambio de variable para que sea más sencillo Out[35]: t sin(x) + t⋅ Suposiciones Las suposiciones(assumptions en inglés) afectan directamente a cómo trata SymPy a los contenedores en cuestión (que llamaremos para no entrar en confusión variales simbólicas). • Para imponer que la variable cumple ciertas propiedades en el momento de la creación se utilizan los argumentos positive, real, etc. en el constructor, indicando su valor de verdadero o falso. • Por otro lado, para simplificar una expresión a posteriori con nuevas suposiciones hemos de utilizar la clase Q del módulo assumptions. • Para comprobar si una variable o expresión cumple determinadas propiedades, tendremos que utilizar las funciones is_real, is_integer, etc. In [15]: n.is_integer # indica que el contenedor se supone entero Out[15]: True In [17]: sqrt(x ** 2) Out[17]: √( x) # si no se asume nada no se hace nada In [18]: (sqrt(x ** 2)).refine(Q.real(x)) #se reasume real Out[18]: x│ │ In [20]: (sqrt(x ** 2)).refine(Q.positive(x)) #se reasume real y positivo Out[20]: x Cálculos Como buen paquete de cálculo simbólico que es, Sympy ofrece numerosas posibilidades para realizar tareas comunes del cálculo infinitesimal, como son calcular límites, derivadas, series e integrales simbólicas. Límites Para calcular límites simbólicos con SymPy se utiliza la función limit. Podemos calcular el límite de casi cualquier expresión, con una o varias variables y por las dos direcciones In [37]: limit(1 / x, x, oo) Out[37]: 0 In [38]: limit(sin(x) / x, x, 0) Out[38]: 1 In [39]: limit(tan(x), x, pi / 2) # como es indeterminado toma una dirección Out[39]: -∞ In [40]: limit(tan(x), x, pi / 2, dir='+') Out[40]: -∞ In [41]: limit(tan(x), x, pi / 2, dir='-') Out[41]: ∞ Derivadas Para calcular la derivada simbólica en SymPy (esto es: la función derivada) se usa la función diff o el método .diff de una expresión. Esta admite varias sintaxis para indicar las variables y el orden de las derivadas In [43]: diff(_42, x) # Derivada primera con respecto a x Out[43]: -(x + 1) sin(x) + cos(x)⋅ In [44]: diff(_42, x, 2) # Derivada segunda con respecto a x Out[44]: -((x + 1) cos(x) + 2 sin(x))⋅ ⋅ In [45]: diff(x * y * log(x * y), x, y) # Derivada parcial con respectoa x e yOut[45]: log(x y) + 2⋅ In [46]: diff(f(x) * sin(x), x) #derivada de funciones implicitas Out[46]: f (x)cos (x)+sin (x) d d x f (x) Esto último fue posible gracias a que previamente se definió f, g, h = symbols('f g h', cls=Function). Series Para calcular desarrollos en series de potencias en SymPy utilizamos la función series o el método .series de una expresión In [47]: cos(x).series(x) # Por defecto, desarrollo en torno al 0 con n = 6 términos Out[47]: 1− x2 2 + x4 24 +o(x6) In [48]: log(z).series(z, 1, n=5) # Desarrollo en torno a z = 1 Out[48]: −1− (z−1)2 2 + (z−1)3 3 − (z−1)4 4 +o((z−1)5 ; z→1) Integrales Para calcular integrales definidas e indefinidas con SymPy emplearemos la función integrate. Esta utiliza el algoritmo de Risch-Norman extendido más algunas reglas heurísticas y búsqueda de patrones. En matemática el algoritmo de Risch, nombrado en honor a Robert H. Risch, es un algoritmo utilizado para el cálculo de integrales indefinidas (es decir, encontrar la función primitiva de una función dada).Risch desarrolló el algoritmo en 1968, denominándolo un procedimiento de decisión, porque es un método para decidir si una función posee como integral indefinida una función elemental; y en el caso que la tuviera permite calcularla. En 1976 se desarrolló el algoritmo de Risch-Norman, que aunque es más rápido es una técnica menos poderosa. In [49]: integrate(6 * x ** 5, x) Out[49]: x6 In [50]: integrate(x * log(x), x) Out[50]: x2 log(x) 2 − x2 4 In [51]: integrate(exp(-x ** 2), x) Out[51]: √π erf (x) 2 También podemos efectuar integrales definidas, tanto propias como impropias In [52]: integrate(log(x), (x, 0, 1)) Out[52]: -1 Resolución de ecuaciones SymPy es capaz de resolver ecuaciones algebraicas de una o varias variables In [53]: solve(x**4 - 1, x) Out[53]: [-1, 1, - , ]ⅈ ⅈ Es capaz de resolver múltiples ecuaciones respecto a múltiples variables (sistemas de ecuaciones) proporcionando una tupla como segundo argumento In [54]: solve([x + 5*y - 2, -3*x + 6*y - 15], [x, y]) Out[54]: {x: -3, y: 1} También tiene capacidad (limitada) de resolver ecuaciones transcendentales In [55]: solve(exp(x) + 1, x) Out[55]: [ π]ⅈ⋅ Ecuaciones diferenciales SymPy es capaz de resolver (algunas) ecuaciones diferenciales ordinarias, dsolve() funciona de la siguiente forma In [56]: dsolve(f(x).diff(x, x) + f(x), f(x)) Out[56]: f(x) = C sin(x) + C cos(x)₁⋅ ₂⋅ Álgebra lineal Las Matrices se crean como instancias de la clase Matrix Matrix([[1,0], [0,1]]) Out[58]: [1 00 1] In [59]: A = Matrix([[1,x], [y,1]]) In [60]: A**2 Out[60]: [x y+1 2 x2 y x y+1] Aspectos básicos Manipulación de expresiones numéricas Manipulación de expresiones Sustitución Expansiones Simplificación Suposiciones Cálculos Límites Derivadas Series Integrales Resolución de ecuaciones Ecuaciones diferenciales Álgebra lineal
Compartir