Este repositório contém a resolução do trabalho prático da disciplina de Cálculo Numérico (SME0104), ministrada pela Professora Cynthia Lage Ferreira. O objetivo deste trabalho é aplicar os conceitos aprendidos em aula para solucionar uma série de problemas por meio da implementação de métodos numéricos em Python, utilizando a plataforma Colab.
O trabalho é composto por cinco exercícios que abordam os seguintes tópicos:
- Sistemas Lineares
- Zeros de Funções e Sistemas Não Lineares
- Decomposição em Valores Singulares (SVD)
- Interpolação
- Mínimos Quadrados
A seguir, cada exercício é detalhado conforme as especificações do enunciado.
Neste exercício, o objetivo é realizar uma análise comparativa detalhada entre duas funções Python, func1
e func2
, que implementam a decomposição LU de uma matriz A.
A tarefa consiste em:
- Analisar e comentar os códigos de
func1
efunc2
para explicar suas operações. - Aplicar ambas as funções a uma matriz de dimensão
$n=2000$ e um parâmetro$p=2$ , gerada conforme o exemplo fornecido. - Discutir as diferenças entre as funções e apresentar conclusões baseadas nos resultados obtidos, incluindo a análise do tempo de execução e da precisão da decomposição.
Este exercício aborda o problema de determinar a altura do impacto de um projétil em uma elevação. O perfil das elevações é dado pela função
As duas abordagens solicitadas para resolver o problema são:
-
a) Formulação como Raiz de Função Não Linear:
- Formular o problema de modo que a solução seja a raiz de uma função
$f: \mathbb{R} \rightarrow \mathbb{R}$ . - Utilizar o Método da Bisseção, com precisão de 0.001 e um máximo de 5 iterações, para encontrar a raiz e, consequentemente, a altura do impacto.
- Formular o problema de modo que a solução seja a raiz de uma função
-
b) Formulação como Raiz de Sistema Não Linear:
- Formular o problema de modo que sua solução seja uma raiz de uma função
$F: \mathbb{R}^2 \rightarrow \mathbb{R}^2$ . - Utilizar o Método de Newton para Sistemas, com precisão de 0.001, para aproximar a raiz e a altura do impacto.
- Formular o problema de modo que sua solução seja uma raiz de uma função
Para ambas as partes, é necessário apresentar os códigos, os critérios de parada e uma comparação detalhada entre as soluções encontradas.
Este exercício explora a Decomposição em Valores Singulares (SVD) de uma matriz
As tarefas são:
-
a) Implementar em código o Método de Francis para cálculo de autovalores e autovetores, utilizando a função
numpy.linalg.qr
. -
b) Desenvolver um código que calcule a decomposição SVD de uma matriz
$A_{m \times n}$ qualquer, utilizando a rotina do Método de Francis implementada no item anterior. A sugestão é aplicar o método em$AA^T$ ou$A^T A$ e derivar o restante da decomposição. -
c) Aplicar a SVD para compressão de imagens. Para isso, deve-se:
- Carregar a imagem em escala de cinza
cat.png
usando a biblioteca Matplotlib. - Comprimir a imagem utilizando a decomposição SVD implementada e a função
numpy.linalg.svd
. - A compressão deve ser feita representando a imagem com 50% e 70% menos valores singulares.
- Plotar a imagem original e as imagens comprimidas para comparação.
- Carregar a imagem em escala de cinza
O foco deste exercício é a análise de diferentes métodos de interpolação para a função
As etapas do exercício são:
- a) Implementar os métodos de interpolação de Lagrange e de Newton.
- b) Utilizar as implementações para interpolar a função com base em 11 pontos igualmente espaçados, exibir os gráficos e justificar teoricamente por que os resultados são idênticos.
- c) Repetir o processo com 21 pontos igualmente espaçados, plotar o gráfico comparativo com a função exata e analisar o fenômeno resultante.
- d) Utilizar a função
scipy.interpolate.interp1d
para calcular a interpolação por spline linear e cúbica com 21 pontos. Apresentar os gráficos e comparar com os resultados anteriores. - e) Repetir os itens b) e c) utilizando nós de Chebyshev. Comentar por que os resultados obtidos com esses nós são superiores aos anteriores.
Neste último exercício, o objetivo é ajustar modelos matemáticos a um conjunto de dados de casos acumulados de Covid-19 no Brasil, de 26 de fevereiro a 18 de junho de 2020, utilizando o método dos mínimos quadrados.
As tarefas são:
-
a) Explicar o funcionamento dos códigos
mmq
emmq_QR
fornecidos, que resolvem o problema de mínimos quadrados. -
b) Ajustar uma função exponencial da forma
$g(x) = ab^x$ aos dados do período completo. -
c) Ajustar polinômios de grau
$m=4, 5, 6$ aos dados do período completo. - d) Calcular o erro de truncamento para os ajustes dos itens b) e c) e comparar os resultados.
- e) Repetir a análise dos itens b), c) e d) considerando apenas os primeiros 20 dias dos dados.
- f) Repetir a análise dos itens b), c) e d) considerando apenas os últimos 50 dias dos dados.
- g) Comparar todos os resultados obtidos e discutir as informações que os diferentes ajustes fornecem sobre a evolução da pandemia nos períodos analisados.
Nota de Autoria
Este projeto foi desenvolvido para a disciplina de Cálculo Numérico (SME0104) na USP, sob a orientação da Prof.ª Cynthia Lage Ferreira. O trabalho foi submetido academicamente em conformidade com as regras da disciplina, em dupla. O código e o relatório contidos neste repositório refletem a minha contribuição individual para o projeto.