Interpolación trigonométrica#
Sea \(\mathcal{T}_{n}\) el conjunto de todas las combinaciones lineales de las funciones \(\phi_{0}, \phi_{1}, \dots , \phi_{2n−1}\). Este conjunto se denomina conjunto de los polinomios trigonométricos de grado menor o igual a \(n\).
Para una función \(f \in C[−\pi, \pi]\), queremos hallar la aproximación continua por mínimos cuadrados mediante funciones de \(\mathcal{T}_{n}\) de la forma
Dado que el conjunto de funciones \(\{\phi_{0}, \phi_{1}, \dots , \phi_{2n−1}\}\) es ortogonal en \([−\pi, \pi]\) con respecto a \(w(x) \equiv 1\), la selección apropiada de coeficientes es
y
El límite de \(S_{n}(x)\) cuando \(n \to \infty\) se denomina serie de Fourier de \(f\).
Ejemplo 1. Determine el polinomio trigonométrico de \(\mathcal{T}_{n}\) que aproxime
Aproximación trigonométrica discreta#
Suponga que se da un conjunto de \(2m\) pares de datos \(\{(x_{j}, y_{j})\}_{j=0}^{2m-1}\), donde los primeros elementos de los pares dividen equitativamente un intervalo cerrado. Por conveniencia, suponemos que el intervalo es \([-\pi, \pi]\)
Si no es \([-\pi, \pi]\), se podría utilizar una transformación lineal sencilla para convertir los datos a esta forma.
El objetivo en el caso discreto es determinar el polinomio trigonométrico \(S_{n}(x)\) en \(\mathcal{T}_{n}\) que minimice
Teorema 15
Las constantes en la sumatoria
que minimizan la suma de los cuadrados
son
y
Ejemplo 2. Encuentre \(S_{2}(x)\), el polinomio trigonométrico de grado 2 de mínimos cuadrados discretos para
Ejemplo 3. Halle la aproximación de mínimos cuadrados discretos \(S_{3} (x)\) para
utilizando los datos \(\{(x_{j}, y_{j})\}^{9}_{j=0}\), donde \(x_{j} = j/5\) y \(y_{j} = f(x_{j})\).
import numpy as np
import matplotlib.pyplot as plt
def interpolacion_trigonometrica_discreta(x_datos, y_datos, n):
"""
Calcula los coeficientes y evalúa el polinomio trigonométrico S_n(x)
de mínimos cuadrados discretos para un conjunto de 2m datos en [-pi, pi].
Parámetros:
- x_datos: array de nodos x_j (deben tener longitud 2m)
- y_datos: array de valores y_j correspondientes
- n: grado del polinomio trigonométrico (n <= m)
"""
N_puntos = len(x_datos)
if N_puntos % 2 != 0:
raise ValueError("El número de puntos de datos (2m) debe ser par.")
m = N_puntos // 2
# Cálculo de a_k para k = 0, 1, ..., n
a = np.zeros(n + 1)
for k in range(n + 1):
suma = 0.0
for j in range(N_puntos):
suma += y_datos[j] * np.cos(k * x_datos[j])
a[k] = (1.0 / m) * suma
# Cálculo de b_k para k = 1, 2, ..., n-1
b = np.zeros(n) # b[0] no se usa, dejamos espacio por comodidad de índices
for k in range(1, n):
suma = 0.0
for j in range(N_puntos):
suma += y_datos[j] * np.sin(k * x_datos[j])
b[k] = (1.0 / m) * suma
# Función para evaluar el polinomio S_n(x) en cualquier punto o arreglo x
def S_n(x):
resultado = (a[0] / 2.0) + a[n] * np.cos(n * x)
for k in range(1, n):
resultado += a[k] * np.cos(k * x) + b[k] * np.sin(k * x)
return resultado
return a, b, S_n