Resolvendo Sistemas Lineares de Forma Simbólica no Python
Quando tratamos de sistemas lineares, uma das abordagens mais elegantes e exatas é resolvê-los simbolicamente, ou seja, obter as soluções na forma de expressões algébricas exatas (com frações, letras e variáveis) em vez de valores decimais aproximados. Para isso, o Python conta com a poderosa biblioteca SymPy, voltada para álgebra simbólica.
✍️ O que é SymPy?
SymPy é uma biblioteca Python para matemática simbólica, capaz de manipular expressões matemáticas exatamente como fazemos no papel: com frações, raízes, variáveis, simplificações e muito mais.
🧮 Exemplo: resolvendo um sistema simbólico
Considere o sistema linear:
\[ \begin{cases} 2x + 3y - z = 4 \\ 5x - 6y + 2z = 1 \\ 7x - 3y + z = 5 \end{cases} \]
Vamos resolvê-lo com SymPy
:
from sympy import symbols, Eq, solve
# Definindo as variáveis simbólicas
x, y, z = symbols('x y z')
# Definindo as equações
eq1 = Eq(2*x + 3*y - z, 4)
eq2 = Eq(5*x - 6*y + 2*z, 1)
eq3 = Eq(7*x - 3*y + z, 5)
# Resolvendo o sistema
solucao = solve((eq1, eq2, eq3), (x, y, z))
# Exibindo a solução
print(solucao)
✅ Saída esperada:
{x: 1, y: z/3 + 2/3}
Ou seja, a solução simbólica do sistema é:
\( x = 1,\quad y = \dfrac{2}{3}+\dfrac{z}{3},\quad z\text{(variável livre)} \)
A forma vetorial da solução é dada por:
\[ \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \begin{bmatrix} 1 \\ \frac{2}{3} \\ 0 \end{bmatrix} + z \cdot \begin{bmatrix} 0 \\ \frac{1}{3} \\ 1 \end{bmatrix} \]
onde \( z \) é uma variável livre, e a solução representa uma reta no espaço tridimensional.
Vejamos outro exemplo...
Vamos resolver o seguinte sistema linear com três variáveis:
\[ \begin{cases} 2x - 3y + 2z = 12 \\ -5x + y - 7z = -5 \\ -11x - 3y - 17z = 9 \end{cases} \]
Nosso objetivo é encontrar as soluções possíveis para \( x \), \( y \) e \( z \).
🐍 Código Python com SymPy
A seguir, utilizamos o Python para resolver o sistema de forma simbólica:
from sympy import symbols, Eq, solve
# Definindo as variáveis simbólicas
x, y, z = symbols('x y z')
# Equações do sistema
eq1 = Eq(2*x - 3*y + 2*z, 12)
eq2 = Eq(-5*x + y - 7*z, -5)
eq3 = Eq(-11*x - 3*y - 17*z, 9)
# Resolvendo o sistema
solucao = solve((eq1, eq2, eq3), (x, y, z))
print(solucao)
✅ Resultado
{x: 3/13 - 19*z/13, y: -50/13 - 4*z/13}
Isso significa que o sistema admite infinitas soluções, expressas em função do parâmetro livre \( z \). A variável \( z \) pode assumir qualquer valor real, e as demais variáveis dependem dela:
\[ \begin{cases} x = \dfrac{3}{13} - \dfrac{19}{13}z \\ y = -\dfrac{50}{13} - \dfrac{4}{13}z \\ z = z \quad (\text{livre}) \end{cases} \]
Podemos também escrever a solução em forma vetorial:
\[ \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \begin{bmatrix} \frac{3}{13} \\ -\frac{50}{13} \\ 0 \end{bmatrix} + z \cdot \begin{bmatrix} -\frac{19}{13} \\ -\frac{4}{13} \\ 1 \end{bmatrix} \]
Vamos a um exemplo de sistema impossívle
Considere o seguinte sistema linear com três variáveis \( t \), \( u \) e \( v \):
\[ \begin{cases} -8t + u - 2v = -7 \\ -5t + 3u + 7v = 2 \\ 3t + 2u + 9v = 1 \end{cases} \]
Nosso objetivo é verificar se existe uma solução que satisfaça simultaneamente as três equações.
🐍 Código Python com SymPy
A seguir, implementamos o sistema no Python e usamos a função solve()
para obter a solução simbólica:
from sympy import symbols, Eq, solve
# Definindo as variáveis simbólicas
t, u, v = symbols('t u v')
# Equações do sistema
eq1 = Eq(-8*t + u - 2*v, -7)
eq2 = Eq(-5*t + 3*u + 7*v, 2)
eq3 = Eq(3*t + 2*u + 9*v, 1)
# Resolvendo o sistema
solucao = solve((eq1, eq2, eq3), (t, u, v))
print(solucao)
✅ Resultado
[]
Ou seja, o sistema não possui solução. Isso significa que ele é incompatível — também conhecido como Sistema Impossível (SI).
💡 Dica prática
Você também pode usar solve()
com sistemas que dependem de parâmetros. Por exemplo:
a = symbols('a')
eq_param = Eq(x + a*y, 2)
solve((eq_param, Eq(y, 1)), (x, y))
Isso permite resolver sistemas simbolicamente em função de um parâmetro, recurso valioso em muitos contextos teóricos.
🔍 Comparando NumPy
e SymPy
na Resolução de Sistemas Lineares
As bibliotecas NumPy e SymPy são amplamente utilizadas em Python para resolver sistemas de equações lineares. Apesar de ambas permitirem encontrar soluções para sistemas, elas possuem fins distintos. A escolha entre elas depende do contexto: numérico ou simbólico.
🧩 Convergências
Aspecto | NumPy e SymPy em comum |
---|---|
Resolução de sistemas | Permitem resolver sistemas lineares com múltiplas variáveis |
Sistemas quadrados | Suportam sistemas com mesmo número de equações e incógnitas |
Ambiente | Funcionam em Jupyter, scripts Python e ambientes educacionais |
Representação | Usam matrizes e vetores para representar os sistemas |
⚙️ Divergências
Característica | NumPy | SymPy |
---|---|---|
Tipo de cálculo | Numérico (ponto flutuante) | Simbólico (exato) |
Variáveis | Vetores e arrays | Símbolos matemáticos |
Precisão | Aproximada | Exata (frações) |
Sistemas paramétricos | Limitado | Suportado |
Performance | Alta | Lenta em sistemas grandes |
Álgebra simbólica | Não suporta | Totalmente suportada |
Uso de memória | Eficiente | Mais custoso |
✅ Vantagens
🟦 NumPy
- 🔢 Alto desempenho computacional.
- 💻 Ideal para sistemas grandes e aplicações numéricas.
- 🧮 Função
numpy.linalg.solve()
é rápida e confiável. - 🔁 Integração com SciPy, Pandas e Matplotlib.
🟨 SymPy
- 🧠 Ideal para ensino e demonstrações teóricas.
- 📐 Trabalha com frações e variáveis literais.
- 🔎 Resolve sistemas com parâmetros (como \( a \cdot x + y = 1 \)).
- 📝 Permite expressar soluções como vetores paramétricos.
❌ Desvantagens
NumPy
- ⚠️ Pode introduzir erros de arredondamento.
- ❌ Não fornece soluções simbólicas.
- 🔒 Não resolve sistemas com parâmetros literais.
SymPy
- 🐢 Mais lento em sistemas grandes.
- 📉 Menos eficiente em performance computacional.
- 💾 Consome mais memória.
📌 Exemplo de uso
NumPy (cálculo numérico):
import numpy as np
A = np.array([[2, -1], [1, 1]])
b = np.array([1, 3])
x = np.linalg.solve(A, b)
print(x) # [1.333... 1.666...]
SymPy (resolução simbólica):
from sympy import symbols, Eq, solve
x, y = symbols('x y')
eq1 = Eq(2*x - y, 1)
eq2 = Eq(x + y, 3)
sol = solve((eq1, eq2), (x, y))
print(sol) # {x: 4/3, y: 5/3}
🧠 Conclusão
A escolha entre NumPy
e SymPy
depende do propósito:
- 📊 Para aplicações numéricas, simulações e problemas grandes: NumPy.
- 📚 Para análises teóricas, ensino e demonstrações simbólicas: SymPy.
Ambas as bibliotecas são poderosas e complementares. Saber quando usar cada uma é fundamental para aproveitar ao máximo seus recursos.
Comentários
Postar um comentário
Não postar comentários ofensivos e que contenham palavrões. Comente sobre o assunto da postagem que você leu.