Algoritmos de Álgebra Lineal Simbólica con Sympy
En este artículo exploraremos cómo Sympy, la biblioteca de cálculo simbólico de Python, permite resolver problemas clásicos de álgebra lineal (determinantes, inversas, valores propios, sistemas de ecuaciones) de manera simbólica, es decir, obteniendo expresiones algebraicas exactas en lugar de resultados numéricos aproximados.
1. ¿Por qué usar álgebra lineal simbólica?
- Exactitud matemática: Ideal para demostraciones, verificación de identidades y generación de fórmulas cerradas.
- Parametrización: Puedes trabajar con matrices que dependen de parámetros simbólicos (p.ej.,
k,θ). - Interoperabilidad: Los resultados pueden exportarse a LaTeX, MathML o código C para su posterior uso.
2. Instalación y configuración
pip install sympy==1.13.1 # última versión estable (2025)
Se recomienda usar un entorno virtual (venv o conda) para aislar dependencias.
3. Operaciones básicas con matrices simbólicas
3.1 Creación de matrices parametrizadas
import sympy as sp
# Definir símbolos
k, θ = sp.symbols('k θ')
# Matriz 2x2 con parámetros
A = sp.Matrix([[k, sp.sin(θ)], [sp.cos(θ), k**2]])
print('Matriz A:')
print(A)
Salida:
Matrix([[k, sin(θ)], [cos(θ), k**2]])
3.2 Determinante simbólico
det_A = A.det()
print('det(A) =', sp.simplify(det_A))
Resultado típico:
det(A) = k**3 - k*sin(θ)*cos(θ)
3.3 Inversa simbólica (cuando existe)
if det_A != 0:
A_inv = A.inv()
print('A⁻¹ =')
sp.pprint(A_inv)
else:
print('La matriz no es invertible simbólicamente')
4. Solución simbólica de sistemas lineales
# Sistema Ax = b con parámetros
b = sp.Matrix([sp.Symbol('b1'), sp.Symbol('b2')])
solution = A.LUsolve(b) # también .gauss_jordan_solve(b)
print('Solución x =')
sp.pprint(solution)
Obtendrás x₁ y x₂ expresados en función de k, θ, b1, b2.
5. Valores y vectores propios simbólicos
eigen_vals = A.eigenvals()
print('Valores propios:')
sp.pprint(eigen_vals)
# Vectores propios (pueden ser parametrizados)
eigen_vecs = A.eigenvects()
print('\nVectores propios:')
for val, mult, vec in eigen_vecs:
print(f'λ = {val}')
sp.pprint(vec)
Nota: Para matrices de gran dimensión, el cálculo simbólico puede volverse costoso; en esos casos se recomienda limitar el número de símbolos o usar simplify después.
6. Comparativa rápida: Sympy vs NumPy/SciPy vs SageMath
| Característica | Sympy | NumPy/SciPy | SageMath |
|---|---|---|---|
| Tipo de cálculo | Simbólico (exacto) | Numérico (flotante) | Simbólico + Numérico |
| Rendimiento en matrices < 10×10 | ~10‑20 ms | ~1‑2 ms | ~5‑10 ms |
| Escalabilidad > 20×20 | Se vuelve exponencial | Lineal/≈O(n³) con BLAS | Mejor que Sympy, peor que NumPy |
| Soporte de parámetros simbólicos | Completo | Limitado (solo constantes) | Completo |
| Exportación a LaTeX/MathML | nativa | requiere conversión manual | nativa |
| Depuración/Tracing | Expresiones paso‑a‑paso con .doit() | No disponible | Similar a Sympy |
Recomendaciones de uso
- Sympy: Ideal para investigación, generación de fórmulas, pruebas de teoremas y documentación.
- NumPy/SciPy: Preferido en pipelines de producción donde el rendimiento numérico es crítico.
- SageMath: Cuando necesitas combinar lo mejor de ambos mundos y una interfaz de notebook integrada.
7. Buenas prácticas y trucos de rendimiento
- Limita la cantidad de símbolos: Cada símbolo adicional aumenta exponencialmente la complejidad del algoritmo de simplificación.
- Usa
simplifyoradsimpestratégicamente: Aplicar simplificaciones después de cada operación pesada evita explosiones de término. - Cachea resultados: Sympy ofrece
sympy.cachingpara almacenar factorizaciones costosas. - Evita matrices densas gigantes: Si la matriz es estructurada (triangular, diagonal), construye directamente la forma simbólica (p.ej.,
sp.diag). - Paralleliza con
multiprocessing: Algunas funciones (p.ej.,Matrix.eigenvals) pueden ser paralelizadas manualmente cuando se procesan bloques independientes.
8. Depuración y troubleshooting comunes
8.1 "Matrix det is zero" cuando esperas lo contrario
Verifica que no hayas introducido símbolos idénticos con nombres diferentes (k vs k_). Usa sp.simplify(det_A) para reducir expresiones redundantes.
8.2 Inversión fallida por singularidad simbólica
Si A.det() devuelve una expresión que podría anularse para ciertos valores, la función .inv() lanzará MatrixSingularError. Solución:
if sp.simplify(det_A).is_zero:
print('Matriz singular para algunos valores de los parámetros')
else:
A_inv = A.inv()
8.3 Rendimiento lento en determinantes de orden > 12
Utiliza la expansión por cofactores sólo como último recurso. En su lugar, convierte la matriz a forma triangular con .rref() y multiplica los pivotes:
U, _ = A.gauss_jordan_solve(sp.zeros(A.shape[0], 1)) # U es triangular
tri_det = sp.prod([U[i, i] for i in range(U.shape[0])])
9. Exportación de resultados
Una de las ventajas de Sympy es la generación automática de LaTeX, lo cual facilita la documentación:
latex_det = sp.latex(det_A)
print('LaTeX:', latex_det)
# Guardar en archivo .tex
with open('determinante.tex', 'w') as f:
f.write(f"$${latex_det}$$")
10. Conclusiones
Sympy es una herramienta poderosa para abordar problemas de álgebra lineal cuando la exactitud simbólica es esencial. Aunque su rendimiento no compite con librerías numéricas optimizadas, su capacidad de manipular expresiones algebraicas, generar documentación automática y trabajar con parámetros lo convierten en la opción ideal para investigación, enseñanza y generación de código automático.
Publicado el 13 de noviembre de 2025 • Autor: Especialista en Ingeniería de Software y Contenedores
Algoritmos de Álgebra Lineal Simbólica con Sympy: Guía Completa y Ejemplos en Python