El algebra computacional o computo simbolico permite la manipulación y representación de expresiones y objetos matematicos de forma exacta y proceder de forma programatica en soluciones analiticas de los problemas y no limitado solo a los casos numericos como sucede en el computo tradicional. Dentro de los objetos matematicos a representar y manipular incluso se definen los numeros, permitiendo trabajar sin la presencia del redondeo de punto flotante.

En este curso se explora el uso de Sympy, un paquete python se computo simbolico que ha tomado mucha fuerza en los últimos años y con un interesante sistema en línea que emula las caracteristicas de Wolfram Alpha, denominado Sympy Gamma (tambien existe Sympy Live para probar sin instalar). Tambien se recomienda su exploración a nivel personal del paquete Maxima (con interface gráfica recomendada de WxMaxima).

Motivación

Para entender su necesidad, se ilustran algunos ejemplos básicos como motivación, sin contar que esto extiende su potencial a la contribución en el desarrollo de procesos analiticos bastante extensos donde su desarrollo manual podría llevar facilmente a errores. Hoy, incluso, existen sistemas de computo simbolico que asisten demostraciones matematicas sin intervencion humana más que la inclusión formal del teorema.

La siguiente ejemplificación es suponiendo un sistema de calculo cuya representación solo permita manipular números a 5 cifras significativas (para hacer más notable el efecto numerico).

\begin{equation} \begin{array}{|c|c|c|} \hline \text{Expresión a evaluar} & \text{Resultado Simbolico} & \text{Resultado Numerico}\\ \hline \pi & \pi & 3.1416\\ \frac{1}{3} & \frac{1}{3} & 0.33333\\ \frac{1}{3} + \frac{1}{3} + \frac{1}{3} & 1 & 0.99999\\ \sin(\pi) & 0 & -7.3464 \cdot 10^{-6}\\ \frac{2xa+ax^2}{a} & 2x + x^2 & \text{No se reconoce 'a' ni 'x'.}\\ \hline \end{array} \end{equation}

Lo anterior muestra que sin duda, incluso a partir de operaciones simples el error numerico evita la identidad de las expresiones con sus valores exactos. Esto se debe a que los numeros en si mismos son representados de manera aproximada en una maquina, y por ende no se corresponden de manera directa a los conjuntos numericos matematicos. Como ejemplo, en la representación de maquina los numeros enteros y reales son conjuntos finitos mientras que los matematicos son conjuntos infinitos. En el caso particular de los reales, en un intervalo cerrado cualquiera en el conjunto matematico existen infinitos reales nuevamente, sin embargo en la representación de maquina el conjunto es finito.

El último ejemplo tambien ilustra que de manera numerica toda variable siempre requiere tener un valor almacenado previo, lo cual imposibilita la manipulación algebraica de variables.

Representación de datos

Números

Variables

Expresiones

Las expresiones matematicas son comúnmente representadas con estructuras de datos de arbolos, donde los operadores, funciones, variables y números se ubican en sus nodos, y el parentezco de los nodos es dado por la definición de los operadores y funciones. Particularmente se usan arboles binarios dado que los operadores pueden ser clasificados en binarios o unarios, siendo así innecesario tener nodos que permitan más de dos hijos.

Los elementos númericos o variables siempre serán hojas del árbol (elementos terminales, o sea, nodos sin hijos). Un operador o función siempre será un nodo padre de uno o dos nodos (acorde a si es binario o unario). La forma del árbol equivalente se obtiene al usar esta información con la información de la jerarquía de operadores (los elementos de agrupación por ejemplo no se representan en el árbol sino que nos indican como se forma este en el orden adecuado), partiendo de los valores númericos y variables como nodos terminales y uniendolos entre sí con el nodo padre del operador que les corresponde por jerarquía.

![Arboles de ejemplo]()

Sin importar la representación seleccionada, siempre aparece un problema. Una misma expresión matemática así como puede ser representada de forma escrita de múltiples formas equivalentes, tambien existen múltiples árboles equivalentes para una misma expresión matemática (incluso para una misma forma escrita). Esto dificulta el proceso de determinación de la identidad entre expresiones matematicas de manera automatica (y por ende, una dificultad para las factorizaciones y otros procedimientos).

![ejemplo de árboles equivalentes]()

Algoritmos básicos de algebra computacional

Aritmetica de precisión arbitraria

Primalidad y factorización de enteros

Algebra lineal sobre anillos polinomicos

Computo Máximo Común Divisor y factorización de polinomios

Sympy

Instalación

Para mayor información sobre el proceso de instalación, se recomienda leer la documentación oficial.

Usando pip:

pip install sympy

Usando conda (si instalo miniconda, ya que anaconda lo tiene incluido):

conda install sympy

Uso


In [53]:
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(use_latex=True)

In [54]:
Rational(242, 33)


Out[54]:
$$\frac{22}{3}$$

In [34]:
Rational(242, 33).evalf()


Out[34]:
$$7.33333333333333$$

In [35]:
sqrt(9)


Out[35]:
$$3$$

In [36]:
sqrt(8)


Out[36]:
$$2 \sqrt{2}$$

In [28]:
(x+ 2) / ((x-2)*(x+2))


Out[28]:
$$\frac{1}{x - 2}$$

In [37]:
(x+k)/((x+k)*(x-2))


Out[37]:
$$\frac{1}{x - 2}$$

In [42]:
expr = x + 2*y - 1
xexpr = x*expr
xexpr


Out[42]:
$$x \left(x + 2 y - 1\right)$$

In [45]:
xexpexpr=expand(xexpr)
xexpexpr


Out[45]:
$$x^{2} + 2 x y - x$$

In [46]:
factor(xexpexpr)


Out[46]:
$$x \left(x + 2 y - 1\right)$$

In [56]:
dse = diff(sin(x)*exp(x), x)
dse


Out[56]:
$$e^{x} \sin{\left (x \right )} + e^{x} \cos{\left (x \right )}$$

In [49]:
dfg = diff(f(x)*g(x), x)
dfg


Out[49]:
$$f{\left (x \right )} \frac{d}{d x} g{\left (x \right )} + g{\left (x \right )} \frac{d}{d x} f{\left (x \right )}$$

In [57]:
integrate(dse)


Out[57]:
$$e^{x} \sin{\left (x \right )}$$

In [59]:
integrate(dse, (x, -oo, 1))


Out[59]:
$$e \sin{\left (1 \right )}$$

In [60]:
limit(sin(x)/x, x, 0)


Out[60]:
$$1$$

In [61]:
solve(x**2 - 2, x)


Out[61]:
$$\left [ - \sqrt{2}, \quad \sqrt{2}\right ]$$

In [62]:
solve(k*x**2 - 2, x)


Out[62]:
$$\left [ - \sqrt{2} \sqrt{\frac{1}{k}}, \quad \sqrt{2} \sqrt{\frac{1}{k}}\right ]$$

In [63]:
dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t))


Out[63]:
$$y{\left (t \right )} = C_{2} e^{- t} + \left(C_{1} + \frac{t}{2}\right) e^{t}$$

In [64]:
Matrix([[1, 2], [2, 2]]).eigenvals()


Out[64]:
$$\left \{ \frac{3}{2} + \frac{\sqrt{17}}{2} : 1, \quad - \frac{\sqrt{17}}{2} + \frac{3}{2} : 1\right \}$$

In [73]:
la = latex(Integral(cos(x)**2, (x, 0, pi)))
la


Out[73]:
'\\int_{0}^{\\pi} \\cos^{2}{\\left (x \\right )}\\, dx'

In [74]:
from IPython.display import Latex
Latex('$'+la+'$')


Out[74]:
$\int_{0}^{\pi} \cos^{2}{\left (x \right )}\, dx$

Referencias

  1. Symbolic Computation. Wikipedia. Consultado el 25 de agosto.
  2. The History of the Calculus and the Development of Computer Algebra Systems. Dan Ginsburg, Brian Groose, Josh Taylor y Prof. Bogdan Vernescu. Consultado el 25 de agosto. Capitulo 5.
  3. COMPUTER ALGEBRA AND ITS APPLICATIONS. Hazem Mohamed El-Alfy (Tesis de Maestría). 1997.
  4. COMPUTER ALGEBRA, Algorithms, Systems and Applications. Richard Liska, Ladislav Drska, Jiri Limpouch, Milan Sinor, Michael Wester, Franz Winkler. 2 de junio de 1997.
  5. SymPy: Symbolic computing in Python. PeerJ, 22 de junio de 2016.
  6. Maxima Documentation.
  7. Arbitrary-precision arithmetic. Wikipedia, consultado el 27 de agosto de 2016.
  8. Computer-assisted proof. Wikipedia, consultado el 29 de agosto de 2016.
  9. Sympy's Documentation. Sympy, consultado el 29 de agosto de 2016.