Código-fonte para CB2325NumericaG1.interpolacao.interpolacao_polinomial
import numpy as np
import matplotlib.pyplot as plt
from typing import Callable
def _poly_interp_plotter(x_val: list,
y_val: list,
P: Callable,
res: int,
pcolor: str,
ccolor: str,
titulo: str) -> None:
"""
Plotar gráfico da interpolação polinomial.
Parameters
----------
x_val : list
lista das coordenadas x.
y_val : list
lista das coordenadas y.
P : Callable
função que corresponde ao polinômio interpolador.
res : int
número de pontos para a plotagem do polinômio.
pcolor : str
cor dos pontos originais.
ccolor : str
cor da curva (polinômio interpolador).
titulo : str
título do gráfico (string
Returns
-------
None
"""
# pontos recebidos
plt.scatter(x_val, y_val, color=pcolor, label='Pontos Originais', zorder=5)
# gerando e plotando os pontos do polinômio
x_plot = np.linspace(min(x_val), max(x_val), res)
y_plot = [P(x) for x in x_plot]
plt.plot(x_plot, y_plot, color=ccolor, label='Interpolação Polinomial', linewidth=2)
plt.title(titulo)
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.grid(True)
plt.show()
return
[documentos]
def poly_interp(x_val: list,
y_val: list,
plot: bool = False,
res: int = 100,
pcolor: str = "#234883",
ccolor: str = "#4287f5",
titulo: str = "Interpolação Polinomial de Lagrange") -> Callable:
"""
Gera um polinômio interpolador usando o método de Lagrange.
Esta função recebe um conjunto de pontos (x, y) e retorna uma
função (polinômio) que passa exatamente por todos esses pontos.
Parameters
----------
x_val : list
Uma lista de coordenadas x dos pontos. Os valores devem ser
todos distintos entre si.
y_val : list
Uma lista de coordenadas y dos pontos. Deve ter o mesmo
tamanho de `x_val`.
plot : bool, optional
Se True, exibe um gráfico do polinômio e dos pontos
originais. O padrão é False.
res : int, optional
Resolução (número de pontos) usada para desenhar a
curva do polinômio no gráfico. O padrão é 100.
pcolor : str, optional
Cor dos pontos originais no gráfico. O padrão é "#234883".
ccolor : str, optional
Cor da curva do polinômio no gráfico. O padrão é "#4287f5".
titulo : str, optional
Título do gráfico. O padrão é "Interpolação Polinomial de Lagrange".
Returns
-------
Callable
Uma função P(x) que recebe um número (int ou float) e
retorna o valor do polinômio interpolador avaliado
naquele ponto x.
Raises
------
ValueError
- Se `x_val` e `y_val` tiverem tamanhos diferentes.
- Se as listas de entrada estiverem vazias.
- Se `x_val` contiver valores duplicados.
- Se `res` não for um inteiro.
- Se `pcolor` ou `ccolor` não forem strings.
- Se `titulo` não for uma string.
Examples
--------
>>> x = [0, 1, 2]
>>> y = [1, 3, 2]
>>> pol = poly_interp(x, y)
>>> print(pol(1.5))
2.625
"""
# tratamento de erros
n = len(x_val)
m = len(y_val)
if n != m:
raise ValueError("As listas de coordenadas x e y devem ter o mesmo tamanho.")
if n == 0:
raise ValueError("Lista de pontos x inserida está vazia.")
elif m == 0:
raise ValueError("Lista de pontos y inserida está vazia.")
if len(set(x_val)) != n:
raise ValueError("As coordenadas x devem ser todas distintas.")
if not (type(res) == int):
raise ValueError("O argumento res deve ser um inteiro.")
if not (type(pcolor) == str):
raise ValueError("O argumento pcolor deve ser uma string.")
if not (type(ccolor) == str):
raise ValueError("O argumento ccolor deve ser uma string.")
if not (type(titulo) == str):
raise ValueError("O argumento titulo deve ser uma string.")
# convertendo as arrays para o tipo do numpy
x_val_np = np.array(x_val)
y_val_np = np.array(y_val)
def P(x: int | float) -> int | float:
"""
Função que calcula o valor do polinômio interpolador em x.
Parameters
----------
x : int | float
Ponto onde o polinômio será avaliado.
Returns
-------
int | float
O valor do polinômio interpolador em x.
Raises
------
ValueError
Se x não for um número (int ou float).
"""
if not np.isreal(x):
raise ValueError("O argumento x deve ser um número real.")
# acumula o termo y_j * L_j(x)
acc_som = 0
# loop do somatório
for j in range(n):
# o produtorio exije que j != i
x_val_sj = np.delete(x_val_np, j)
# calculando numeradores e denominadores do produtorio
num = x - x_val_sj
den = x_val_np[j] - x_val_sj
acc_som += y_val_np[j] * np.prod(num / den)
return acc_som
# plotagem do grafico caso o usuario deseje
if plot:
_poly_interp_plotter(x_val, y_val, P, res, pcolor, ccolor, titulo)
return P