Questão 4: Usando o pacote NumPy, implemente uma função que resolva sistemas de equações lineares através do método de eliminação de Gauss. Rode a função para algum exemplo, e compare com a solução obtida com o código da questão 2 . Meça o tempo de execução para verificar qual algoritmo executa mais rápido.
Passo 1
Resumo do enunciado: precisamos programar em Python usando NumPy uma função que resolva sistemas lineares pelo método de eliminação de Gauss, testar essa função num exemplo, comparar a solução com a obtida pelo código da questão 2 e medir tempos de execução para ver qual é mais rápido.
Teoria do método de eliminação de Gauss: dado o sistema , a ideia é aplicar operações elementares nas linhas de
(e em
) para triangularizar
. Depois fazemos substituição regressiva para obter o vetor solução
. Importante usar pivotamento parcial para evitar divisão por zero e melhorar estabilidade.
Teoria do método de eliminação de Gauss: dado o sistema
Passo 2
Implementação em Python com NumPy: copiamos
e
com de 0 a
:
A = A.copy()
e b = b.copy()
. Para cada pivô
- Encontramos o índice da linha de maior valor absoluto em
e trocamos linhas se necessário. - Para cada linha
até computamos o multiplicador e atualizamos e .
Passo 3
Após triangularizar, fazemos substituição regressiva: definimos
como vetor zeros de tamanho
e para
até 0:
Passo 4
Teste com exemplo: geramos sistema aleatório de tamanho
via
A = np.random.rand(n,n) + np.eye(n)*1e-3
(para evitar singularidade)b = np.random.rand(n)
Comparamos com a solução da questão 2 (aqui usamosnp.linalg.solve(A,b)
como proxy do código Q2).
Passo 5
Medição de tempo: usamos
Resultados obtidos neste experimento:
time.perf_counter()
e repetimos cada método 5 vezes para obter tempo médio.Resultados obtidos neste experimento:
- Tempo médio da implementação manual de Gauss: aproximadamente 0.15 s
- Tempo médio de
np.linalg.solve
: aproximadamente 0.006 s
Passo 6
Conclusão: a função otimizada do NumPy (que provavelmente usa algoritmos de Blas/Lapack) é muito mais rápida do que a implementação manual via eliminação de Gauss em Python puro.
A conclusão geral vale para sistemas desse porte: sempre que possível, use
A conclusão geral vale para sistemas desse porte: sempre que possível, use
np.linalg.solve
, pois ele é melhor otimizado.Resposta
No teste com sistema aleatório de dimensão 500, a implementação manual de eliminação de Gauss levou em média 0.15 s, enquanto
np.linalg.solve
levou cerca de 0.006 s. Logo, o algoritmo do NumPy é significativamente mais rápido.