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
# Suprimir advertencias menores de integración durante los bucles de optimización
import warnings
warnings.filterwarnings("ignore")
# Configurar el estilo de graficación para una mejor visualización
plt.style.use('ggplot')
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
# Definimos 2m puntos en el intervalo de -pi a pi
m_valores = 6
num_pts = 2 * m_valores
xj = -np.pi + (np.arange(num_pts) / m_valores) * np.pi
yj = np.abs(xj)
# Definimos el grado del polinomio trigonometrico (n<=m)
grado_n = 3
coef_a, coef_b, Sn = interpolacion_trigonometrica_discreta(xj, yj, grado_n)
print("Coeficientes ak: ", coef_a)
print("Coeficientes bk: ", coef_b)
x_eval = np.linspace(-np.pi, np.pi, 100)
y_eval = Sn(x_eval)
plt.figure()
plt.plot(x_eval, np.abs(x_eval), label='Funcion abs(x)')
plt.plot(x_eval, y_eval, label='Funcion trigonometrica')
plt.legend()
plt.show()
Coeficientes ak: [ 3.14159265e+00 -1.30273149e+00 7.40148683e-17 -1.74532925e-01]
Coeficientes bk: [0.00000000e+00 2.59052039e-16 2.22044605e-16]