Resolução de sistemas lineares
Resolva Ax=b usando np.linalg.solve e compare com a abordagem ingênua de inversão e multiplicação quanto à estabilidade numérica.
Resolução de sistemas lineares é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Pandas & NumPy Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que é um sistema linear?
Um sistema de equações lineares pode ser escrito na forma matricial como Ax = b, em que A é a matriz de coeficientes, x é o vetor de incógnitas e b é o vetor do lado direito. Por exemplo, duas equações com duas incógnitas podem ser expressas como uma equação matricial 2×2. Resolver o sistema significa encontrar x tal que A multiplicado por x seja igual a b. O np.linalg.solve(A, b) do NumPy trata isso de maneira eficiente e precisa.
import numpy as np
# System: 2x + y = 5
# x + 3y = 10
A = np.array([[2.0, 1.0],
[1.0, 3.0]])
b = np.array([5.0, 10.0])
x = np.linalg.solve(A, b)
print('Solution x:', x)
print('Verify A @ x == b:', np.allclose(A @ x, b))Por que não usar a inversa?
Matematicamente, a solução de Ax = b é x = A⁻¹b. Porém, calcular np.linalg.inv(A) @ b é mais lento e menos preciso do que chamar diretamente np.linalg.solve(A, b). solve() usa internamente a decomposição LU, que exige menos operações e acumula menos erro de ponto flutuante. Regra prática: se você estiver resolvendo x em Ax=b, use sempre solve, nunca inv.
import numpy as np
A = np.random.rand(100, 100)
b = np.random.rand(100)
# Avoid this pattern
x_inv = np.linalg.inv(A) @ b
# Prefer this
x_solve = np.linalg.solve(A, b)
print('Max difference:', np.max(np.abs(x_inv - x_solve)))
# solve is faster AND more accurateRequisitos de solve()
np.linalg.solve(A, b) exige que A seja quadrada e não singular. Se A for singular (o determinante for zero), a função gera np.linalg.LinAlgError: Singular matrix. A é singular quando as linhas são linearmente dependentes — por exemplo, quando uma equação é simplesmente um múltiplo de outra. Verifique sempre se o seu sistema está bem formulado antes de chamar solve. Se A não for quadrada, use np.linalg.lstsq() em vez disso.
import numpy as np
# Well-posed system
A = np.array([[1.0, 2.0], [3.0, 4.0]])
b = np.array([5.0, 6.0])
print('Solution:', np.linalg.solve(A, b))
# Singular system (row 2 = 3 * row 1)
A_singular = np.array([[1.0, 2.0], [3.0, 6.0]])
try:
np.linalg.solve(A_singular, b)
except np.linalg.LinAlgError as e:
print('Error:', e)Decomposição LU por trás dos bastidores
np.linalg.solve aplica internamente a decomposição LU: fatora A em uma matriz triangular inferior L e uma matriz triangular superior U, de modo que A = LU. A resolução então se transforma em duas resoluções triangulares mais simples (substituição progressiva e regressiva), que são muito mais eficientes do que repetir a eliminação gaussiana desde o início. Esse é o mesmo algoritmo usado pelo MATLAB, pelo Fortran LAPACK e por praticamente todas as bibliotecas de computação científica.
import numpy as np
from scipy import linalg
A = np.array([[2.0, 1.0, -1.0],
[-3.0, -1.0, 2.0],
[-2.0, 1.0, 2.0]])
b = np.array([8.0, -11.0, -3.0])
# NumPy solve (uses LAPACK dgesv under the hood)
x = np.linalg.solve(A, b)
print('Solution:', x)
print('Check:', np.allclose(A @ x, b))Resolvendo vários lados direitos
np.linalg.solve(A, B) pode lidar com uma matriz B com várias colunas, resolvendo cada coluna simultaneamente. Se B tiver dimensão (n, k), o resultado X terá dimensão (n, k), em que cada coluna de X é a solução para a coluna correspondente de B. Isso é útil em simulações físicas e aprendizado de máquina, quando é necessário resolver a mesma matriz de coeficientes com muitos lados direitos diferentes.
import numpy as np
A = np.array([[3.0, 1.0],
[1.0, 2.0]])
# Three right-hand side vectors at once
B = np.array([[9.0, 3.0, 6.0],
[8.0, 4.0, 2.0]])
X = np.linalg.solve(A, B)
print('Solutions X shape:', X.shape) # (2, 3)
print('Verify A @ X == B:', np.allclose(A @ X, B))Mínimos quadrados com np.linalg.lstsq()
Quando o sistema é sobredeterminado (tem mais equações do que incógnitas), não existe uma solução exata. np.linalg.lstsq(A, b) encontra o x que minimiza a soma dos resíduos ao quadrado ||Ax - b||² — exatamente o que a regressão linear calcula. Ele retorna a solução x, os resíduos, o posto e os valores singulares. O argumento rcond=None suprime um aviso de obsolescência e define o limite para tratar valores singulares como zero.
import numpy as np
# Over-determined: 4 equations, 2 unknowns
A = np.array([[1.0, 1.0],
[1.0, 2.0],
[1.0, 3.0],
[1.0, 4.0]])
b = np.array([2.0, 2.5, 3.5, 4.5])
x, residuals, rank, sv = np.linalg.lstsq(A, b, rcond=None)
print('Least-squares solution:', x)
print('Residuals:', residuals)
print('Rank:', rank)Aplicando solve() na regressão linear
As equações normais dos mínimos quadrados ordinários são A.T @ A @ x = A.T @ b, que formam um sistema quadrado solucionável com np.linalg.solve. Isso produz o mesmo resultado que lstsq quando A.T @ A é bem condicionada. Na prática, lstsq é preferível porque usa SVD e permanece estável mesmo quando as colunas são quase colineares, mas as equações normais ajudam você a compreender a matemática por trás da regressão.
import numpy as np
np.random.seed(0)
X = np.column_stack([np.ones(50), np.random.rand(50) * 10])
y = 3.0 + 2.0 * X[:, 1] + np.random.randn(50)
# Solve normal equations
coeffs = np.linalg.solve(X.T @ X, X.T @ y)
print('Intercept:', round(coeffs[0], 3))
print('Slope:', round(coeffs[1], 3))Verificando o número de condição
Antes de resolver, é uma boa prática verificar o número de condição com np.linalg.cond(A). Um número de condição próximo de 1 significa que o sistema é bem condicionado e que a solução é confiável. Um número de condição muito grande (por exemplo, 1e12) significa que a matriz está quase singular: pequenas alterações em b produzem grandes alterações em x, e a solução pode não ser numericamente confiável. Nesse caso, considere a regularização (regressão ridge) ou o uso de um solucionador mais robusto.
import numpy as np
# Well-conditioned
A1 = np.array([[2.0, 1.0], [1.0, 3.0]])
print('Condition number (well):', np.linalg.cond(A1))
# Ill-conditioned (nearly linearly dependent rows)
A2 = np.array([[1.0, 1.0], [1.0, 1.0001]])
print('Condition number (ill):', np.linalg.cond(A2))Sistemas esparsos: quando não usar linalg
Para sistemas muito grandes em que A tem principalmente entradas nulas (uma matriz esparsa), armazenar a matriz completa desperdiça memória, e usar np.linalg.solve denso é lento. O SciPy fornece scipy.sparse e scipy.sparse.linalg.spsolve, que exploram a esparsidade para sistemas enormes, como modelos de elementos finitos ou problemas de redes. Entender quando sua matriz é esparsa é uma consideração importante de desempenho na computação científica.
import numpy as np
# Dense solve is fine for small-to-medium systems
A = np.random.rand(200, 200)
b = np.random.rand(200)
x = np.linalg.solve(A, b)
print('Dense solve OK, solution shape:', x.shape)
# For large sparse systems, use scipy.sparse.linalg.spsolve instead
# from scipy.sparse.linalg import spsolve
# x = spsolve(A_sparse, b)Interpretando o vetor de solução
Depois de obter o vetor solução x de np.linalg.solve(A, b), verifique-o sempre calculando A @ x e comparando-o com b usando np.allclose(A @ x, b). Na aritmética de ponto flutuante, raramente se obtém uma igualdade exata — allclose verifica se os valores estão dentro de uma pequena tolerância. O resíduo ||Ax - b|| deve estar próximo de epsilon de máquina vezes a escala do problema em um sistema bem condicionado.
import numpy as np
A = np.array([[4.0, 3.0, 2.0],
[1.0, 5.0, 3.0],
[2.0, 1.0, 6.0]])
b = np.array([10.0, 20.0, 15.0])
x = np.linalg.solve(A, b)
print('Solution:', np.round(x, 4))
# Residual check
residual = np.linalg.norm(A @ x - b)
print('Residual ||Ax - b||:', residual)
print('Valid:', np.allclose(A @ x, b))Resolução em fluxos de processamento de aprendizado de máquina
Os resolvedores lineares aparecem em todo o aprendizado de máquina: a regressão linear resolve as equações normais, os processos gaussianos resolvem sistemas de matrizes de núcleo e os filtros de Kalman resolvem equações de atualização de estado. Ao compreender np.linalg.solve e lstsq, você pode implementar esses algoritmos do zero e depurá-los quando os resultados forem inesperados. O módulo linalg do NumPy oferece as mesmas ferramentas numéricas usadas em bibliotecas científicas de produção.
import numpy as np
# Ridge regression: (X.T @ X + lambda * I) @ w = X.T @ y
np.random.seed(42)
X = np.random.rand(100, 5)
y = np.random.rand(100)
lambda_reg = 0.1
n_features = X.shape[1]
A = X.T @ X + lambda_reg * np.eye(n_features)
bvec = X.T @ y
w = np.linalg.solve(A, bvec)
print('Ridge regression weights:', np.round(w, 4))Verificação rápida
Teste sua compreensão dos conceitos de análise de dados desta lição.
Recapitulação da lição
Nesta lição, você aprendeu que np.linalg.solve(A, b) resolve com eficiência sistemas lineares quadrados usando decomposição LU, que np.linalg.lstsq() encontra a solução de mínimos quadrados para sistemas sobredeterminados e que o número de condição mede a estabilidade numérica — valores altos alertam para matrizes quase singulares. A seguir, exploraremos os autovalores e o SVD, que fundamentam o PCA e muitos algoritmos de aprendizado de máquina.
Aprenda Python com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 30
- Aulas
- 120
Perguntas Frequentes
A aula “Resolução de sistemas lineares” é grátis?
Sim — o texto completo de “Resolução de sistemas lineares” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Pandas & NumPy Academy, atualize para CoddyKit PRO. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que vou aprender em “Resolução de sistemas lineares”?
Resolva Ax=b usando np.linalg.solve e compare com a abordagem ingênua de inversão e multiplicação quanto à estabilidade numérica. Você pratica Pandas & NumPy Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Pandas & NumPy Academy?
Nenhuma experiência prévia é necessária. Pandas & NumPy Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Resolução de sistemas lineares”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Pandas & NumPy Academy?
Sim. Cada aula de Pandas & NumPy Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Multiplicação de matrizes com np.matmul e @
- Determinantes, inversas e transpostas
- Resolução de sistemas lineares
- Visão geral de autovalores e SVD