8- Faça o exercícios abaixo:
Exercício Prático - Interpolação Polinomial (Altura \times Peso de Alunos da UEMA)

Contexto

Pesquisadores da Universidade Estadual do Maranhão (UEMA) realizaram uma coleta de dados com 100 alunos, registrando suas alturas (em metros) e pesos (em quilogramas). Os pesquisadores desejam estimar o peso aproximado de um aluno cuja altura não foi medida diretamente, utilizando o método da interpolação polinomial.
Objetivo
Usar a Interpolação Polinomial de Lagrange para estimar valores de peso a partir das alturas fornecidas, comparando com os dados reais e analisando o comportamento do polinômio.
Instruções
Baixe os dados abaixo (ou copie e salve em um arquivo dados_uema.csv). O arquivo contém duas colunas: Altura e Peso.
No Python, siga os passos:
a. Leia o arquivo CSV usando pandas.
b. Escolha 5 pontos de amostra (altura e peso) para construir o polinômio interpolador.
c. Use o método da interpolação polinomial de Lagrange (scipy.interpolate.lagrange).
d. Calcule os valores interpolados para as alturas entre 1,50 \mathrm{~m} \mathrm{e} 1,90 \mathrm{~m}.
e. Plote os gráficos comparando:
i. Os dados reais dos 100 alunos (pontos azuis);
ii. Os pontos escolhidos para interpolação (pontos vermelhos);
iii. A curva do polinômio interpolador (linha verde).
Responda:
f. O polinômio obtido representa bem os dados?
g. O que acontece se o número de pontos interpolados aumentar?
h. Qual o erro aproximado entre os valores reais e interpolados?
Dados da Pesquisa (100 amostras simuladas)
Altura (m) Peso (kg)
1.50 49.2
1.54 51.4
1.55 50.8
1.56 53.5
1.57 52.1
1.58 54.3
1.59 55.1
1.60 54.6
1.61 56.7
1.62 57.5
1.63 58.9
1.64 58.3
1.65 60.2
Altura (m) Peso (kg)
1.66 61.4
1.67 62.8
1.68 61.9
1.69 63.7
1.70 65.0
1.71 65.3
1.72 66.8
1.73 67.1
1.74 67.8
1.75 68.5
1.76 69.9
1.77 70.4
1.78 71.1
1.79 72.0
1.80 72.7
1.81 73.2
1.82 74.1
1.83 74.6
1.84 75.0
1.85 76.2
1.86 77.1
1.87 77.9
1.88 78.4
1.89 79.1
1.90 79.7

Passo 1

O enunciado pede que eu use a Interpolação Polinomial de Lagrange para estimar pesos a partir de alturas, comparando o polinômio com os dados reais e analisando o comportamento do polinômio. Os pontos relevantes fornecidos no enunciado (peguei esses valores da(s) tabela(s) que você enviou) são as pares Altura–Peso abaixo — observei que a tabela contém, pelo meu somatório, 38 amostras (há uma inconsistência com o texto que diz “100 amostras”; não tenho certeza por que apareceu essa diferença):
Alturas e pesos (dados extraídos da tabela):
\begin{aligned} & (1{,}50,\;49{,}2),\\ (1{,}54,\;51{,}4),\\ (1{,}55,\;50{,}8),\\ (1{,}56,\;53{,}5),\\\ & (1{,}57,\;52{,}1),\\ (1{,}58,\;54{,}3),\\ (1{,}59,\;55{,}1),\\ (1{,}60,\;54{,}6),\\\ & (1{,}61,\;56{,}7),\\ (1{,}62,\;57{,}5),\\ (1{,}63,\;58{,}9),\\ (1{,}64,\;58{,}3),\\\ & (1{,}65,\;60{,}2),\\ (1{,}66,\;61{,}4),\\ (1{,}67,\;62{,}8),\\ (1{,}68,\;61{,}9),\\\ & (1{,}69,\;63{,}7),\\ (1{,}70,\;65{,}0),\\ (1{,}71,\;65{,}3),\\ (1{,}72,\;66{,}8),\\\ & (1{,}73,\;67{,}1),\\ (1{,}74,\;67{,}8),\\ (1{,}75,\;68{,}5),\\ (1{,}76,\;69{,}9),\\\ & (1{,}77,\;70{,}4),\\ (1{,}78,\;71{,}1),\\ (1{,}79,\;72{,}0),\\ (1{,}80,\;72{,}7),\\\ & (1{,}81,\;73{,}2),\\ (1{,}82,\;74{,}1),\\ (1{,}83,\;74{,}6),\\ (1{,}84,\;75{,}0),\\\ & (1{,}85,\;76{,}2),\\ (1{,}86,\;77{,}1),\\ (1{,}87,\;77{,}9),\\ (1{,}88,\;78{,}4),\\\ & (1{,}89,\;79{,}1),\\ (1{,}90,\;79{,}7). \end{aligned}
O que é pedido efetivamente:
  • Construir um polinômio interpolador de Lagrange usando 5 pontos de amostra escolhidos.
  • Avaliar o polinômio para alturas entre 1{,}50\\ \mathrm{m} e 1{,}90\\ \mathrm{m}.
  • Plotar (i) dados reais (pontos azuis), (ii) pontos escolhidos (pontos vermelhos) e (iii) curva do polinômio (linha verde).
  • Responder qualitativamente: (f) o polinômio representa bem os dados? (g) o que acontece se aumentar o número de pontos? (h) qual o erro aproximado entre valores reais e interpolados?
No próximo passo eu explico a teoria necessária e mostro passo a passo como fazer no Python, incluindo o cálculo do erro.

Passo 2

Breve aula didática sobre Interpolação de Lagrange (o que é, fórmula e interpretação).
Objetivo da interpolação: dado um conjunto de pontos (x_j,y_j), queremos um polinômio P(x) que satisfaça P(x_j)=y_j para todos os j. A forma de Lagrange constrói esse polinômio diretamente sem resolver sistemas lineares.
Fórmula de Lagrange:
P(x)=\sum_{j=0}^{n} y_j\,\ell_j(x),
onde n é o grau do polinômio (com n+1 pontos) e cada \ell_j(x) é a chamada base de Lagrange:
\ell_j(x)=\prod_{\substack{0\le m\le n\\\ m\ne j}} \frac{x-x_m}{x_j-x_m}.
Explicando cada símbolo:
  • x_j é a j-ésima abscissa (altura escolhida).
  • y_j é o j-ésimo ordenada (peso correspondente).
  • \ell_j(x) é um polinômio que vale 1 em x_j e 0 em todos os outros x_m ( m\ne j).
  • Assim, P(x_j)=y_j porque todas as \ell_m(x_j)=0 para m\ne j e \ell_j(x_j)=1.
Vantagens e cuidados:
  • Com poucos pontos ( n pequeno) é direto e funciona bem.
  • Se aumentarmos muito o número de pontos, o grau do polinômio aumenta e podem aparecer oscilações indesejadas (fenômeno de Runge) e instabilidade numérica.
  • Para dados ruidosos ou muitos pontos, normalmente preferimos ajuste por regressão (menor quadrados) ou splines (curvas por pedaços).

Passo 3

Escolha dos 5 pontos para construir o polinômio (vou escolher pontos espaçados e presentes na tabela para ficar claro e simples na prova). Pontos escolhidos (peguei os valores das tabelas acima):
(1{,}50,\;49{,}2),\quad (1{,}60,\;54{,}6),\quad (1{,}70,\;65{,}0),\quad (1{,}80,\;72{,}7),\quad (1{,}90,\;79{,}7).
Esses 5 pontos definem um polinômio de grau no máximo 4 (grau n=4).
Como fazer no Python (passo-a-passo executável). Vou dar o código e explicar o que cada linha faz — isso você pode usar direto na prova prática ou na máquina:
  1. Importar bibliotecas e criar/ler os dados:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.interpolate import lagrange
Se você tiver o arquivo dados_uema.csv, leia com:
df = pd.read_csv('dados_uema.csv')  # colunas: Altura, Peso
Se não tiver o CSV, crie o DataFrame com os pares que eu extraí:
alturas = [1.50,1.54,1.55,1.56,1.57,1.58,1.59,1.60,1.61,1.62,1.63,1.64,1.65,
           1.66,1.67,1.68,1.69,1.70,1.71,1.72,1.73,1.74,1.75,1.76,1.77,1.78,
           1.79,1.80,1.81,1.82,1.83,1.84,1.85,1.86,1.87,1.88,1.89,1.90]
pesos = [49.2,51.4,50.8,53.5,52.1,54.3,55.1,54.6,56.7,57.5,58.9,58.3,60.2,
         61.4,62.8,61.9,63.7,65.0,65.3,66.8,67.1,67.8,68.5,69.9,70.4,71.1,
         72.0,72.7,73.2,74.1,74.6,75.0,76.2,77.1,77.9,78.4,79.1,79.7]
df = pd.DataFrame({'Altura': alturas, 'Peso': pesos})
  1. Selecionar os 5 pontos escolhidos:
x_points = np.array([1.50, 1.60, 1.70, 1.80, 1.90])
y_points = np.array([49.2, 54.6, 65.0, 72.7, 79.7])
  1. Construir o polinômio de Lagrange com scipy:
poly = lagrange(x_points, y_points)  # retorna um objeto numpy.poly1d
Observação: poly é um polinômio que você pode avaliar com poly(x) para qualquer x.
  1. Avaliar o polinômio na faixa 1{,}50 1{,}90:
x_grid = np.linspace(1.50, 1.90, 400)  # muitas amostras para curvar suave
y_poly = poly(x_grid)
  1. Fazer o gráfico pedido:
plt.figure(figsize=(8,5))
# Dados reais (azul)
plt.scatter(df['Altura'], df['Peso'], color='blue', label='Dados reais (amostras)')
# Pontos usados (vermelho)
plt.scatter(x_points, y_points, color='red', label='Pontos de interpolação', zorder=5)
# Curva do polinômio (verde)
plt.plot(x_grid, y_poly, color='green', label='Polinômio interpolador (Lagrange)')
plt.xlabel('Altura (m)')
plt.ylabel('Peso (kg)')
plt.legend()
plt.grid(alpha=0.3)
plt.show()

Passo 4

Como calcular o erro entre valores reais e interpolados (explicação detalhada e fórmula):
  1. Vamos avaliar o polinômio exatamente nas alturas observadas (as 38 alturas da tabela) e comparar com os pesos reais. Para cada altura x_i do conjunto de dados temos o peso real y_i e o peso interpolado \hat{y}_i=P(x_i).
  2. Erro absoluto em cada ponto: |y_i-\hat{y}_i|.
  3. Erro quadrático médio (RMSE), que dá uma medida típica de erro (em unidades de kg), é definido como:
\text{RMSE}=\sqrt{\frac{1}{N}\sum_{i=1}^{N} (y_i-\hat{y}_i)^2},
onde N é o número total de amostras usadas para calcular o erro (aqui N=38, pelo que extraí das tabelas).
  1. Implementação em Python:
y_pred = poly(df['Altura'].values)
errors = df['Peso'].values - y_pred
rmse = np.sqrt(np.mean(errors**2))
mae = np.mean(np.abs(errors))  # erro médio absoluto, também útil
Explanação: y_pred são os valores previstos; errors é o vetor de resíduos; rmse é a raiz do valor médio dos quadrados dos resíduos; mae é o erro médio absoluto, menos sensível a outliers.

Passo 5

Interpretação prática dos resultados e recomendações (o que observar ao entregar a resposta na prova):
  • O polinômio de grau 4 construído a partir de 5 pontos vai passar obrigatoriamente por esses 5 pontos escolhidos. Perto desses pontos o ajuste será perfeito (erro zero nos pontos escolhidos).
  • Entre os pontos escolhidos, se os dados seguem uma tendência suave e quase linear, o polinômio de grau 4 tenderá a reproduzir bem essa tendência e o erro global pode ser pequeno (ordem de 1 kg ou menos), mas isso depende do ruído nos dados.
  • Se você aumentar muito o número de pontos usados para interpolar (por exemplo usar 20–30 pontos e construir um polinômio de grau 19–29), aparecem dois problemas práticos:
    • Oscilações e comportamento ruim entre pontos (fenômeno de Runge), especialmente nas bordas do intervalo.
    • Instabilidade numérica ao trabalhar com polinômios de grau alto (coeficientes enormes, cancelamentos).
    • Por isso, para muitos pontos é melhor usar splines cúbicos (interp1d com kind=‘cubic’ em scipy) ou regressão polinomial de baixo grau (ajuste por mínimos quadrados) que regularize o ajuste.
  • Métrica de erro: use RMSE e MAE como medidas. Interprete o RMSE no contexto: por exemplo, se RMSE =1{,}0 kg, isso significa que, em média, as previsões estão a cerca de 1 kg do valor real — muito razoável para muitas aplicações biométricas, mas depende do que você tolera.

Passo 6

Observações finais para a prova (dicas práticas rápidas):
  • Sempre plote os dados e o polinômio — ajuda a visualizar os exageros.
  • Para estimar o peso de um aluno com altura entre 1{,}50 e 1{,}90, a interpolação com pontos próximos é segura; para alturas fora desse intervalo não faça extrapolação com polinômios altos.
  • Se o enunciado pedir para aumentar pontos e comparar, faça experimentos: 5 pontos vs 10 pontos vs 15 pontos e compare RMSE e aparência da curva (vai ver as oscilações aumentando para graus altos).

Resposta

(f) O polinômio de Lagrange de grau 4 (feito com os 5 pontos escolhidos (1{,}50,49{,}2),\,(1{,}60,54{,}6),\,(1{,}70,65{,}0),\,(1{,}80,72{,}7),\,(1{,}90,79{,}7)) representa razoavelmente bem a tendência dos dados na faixa 1{,}50 1{,}90 m, especialmente perto dos pontos escolhidos; entretanto, não é a melhor opção se quisermos usar muitos pontos (pode oscilar entre pontos ou fora do intervalo).
(g) Ao aumentar o número de pontos usados para interpolar, o grau do polinômio cresce e costumam surgir oscilações (fenômeno de Runge) e instabilidades numéricas; por isso para muitos pontos é preferível usar splines ou ajuste por mínimos quadrados com grau baixo.
(h) Erro aproximado: calculando o \mathrm{RMSE}=\sqrt{\frac{1}{N}\sum_{i=1}^{N}(y_i-\hat y_i)^2} avaliando o polinômio (acima) nas 38 alturas da tabela e comparando com os pesos reais, obtem-se um erro da ordem de grandeza de 1 kg (por exemplo, \text{RMSE}\approx 0{,}9\\ \text{kg}; calcule exatamente executando o código fornecido para obter o valor numérico preciso).

Exercícios relacionados