Diferencia entre revisiones de «Series de Fourier LÁJ»

De MateWiki
Saltar a: navegación, buscar
 
(No se muestran 5 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
{{ TrabajoED | Series de Fourier. Grupo 6-A | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez, Álvaro Moreno Cisneros, Juan Pérez Guerra }}
+
{{ TrabajoED | Series de Fourier. Grupo LÁJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez
  
[[Archivo:Series de fourier LÁJ.jpeg||800px]]]
+
Álvaro Moreno Cisneros
  
<source lang="python" line>
+
Juan Pérez Guerra }}
  
 +
[[Archivo:Series de fourier LÁJ.jpeg||800px]]
 +
[[Medio:Series de fourier LÁJ corregido.pdf | PDF del póster]]
 +
 +
 +
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. La función serie_de_fourier_definitiva aproxima una función dada en un intervalo mediante una serie de Fourier, la función comparar_fourier_cesaro es la que da las gráficas de la última parte y la función base_trigonométrica aunque no se ha incluído en el póster ilustra como funciona la base trigonométrica.
 +
 +
<source lang="python" line>
 
import numpy as np
 
import numpy as np
 
import matplotlib.pyplot as plt
 
import matplotlib.pyplot as plt
Línea 34: Línea 41:
 
plt.show()
 
plt.show()
  
def aproximar_funcion_cont(n_array):
 
def f(x):
 
return 1 - 2*np.abs(1/2 - x)
 
 
#Puntos donde se grafica y sus valores exactos
 
x = np.linspace(0,1,1000)
 
f_ev = f(x)
 
 
def serie_fourier(funcion,x_val,n_terms):
 
fn = np.zeros_like(x_val)
 
f_eval = funcion(x_val)
 
 
for k in range(1,n_terms+1):
 
#Integración númerica con método del trapecio
 
integrando = 2*f_eval*np.sin(k*np.pi*x_val)
 
ak = trapezoid(integrando,x_val)
 
 
#Sumar término
 
fn += ak * np.sin(k*np.pi*x_val)
 
 
return fn
 
 
#Gráfica
 
plt.figure(figsize = (10,6))
 
plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)
 
 
for i in n_array:
 
fn_ev = serie_fourier(f,x,i)
 
plt.plot(x,fn_ev, label=f'n = {i}')
 
 
plt.title('Aproximación de f(x) mediante Serie de Fourier (Senos)')
 
plt.legend()
 
plt.grid(True, alpha=0.3)
 
plt.show()
 
 
#Cálculo de errores
 
n_error = []
 
for i in range(1,100):
 
n_error.append(i)
 
 
error_l2 = []
 
error_inf = []
 
 
for i in n_error:
 
f_n = serie_fourier(f,x,i)
 
dif = f_ev - f_n
 
 
error_l2.append(np.sqrt(trapezoid(dif**2,x)))
 
error_inf.append(round(float(np.max(np.abs(dif))),6))
 
 
fig, ax = plt.subplots(1,2,figsize = (10,4))
 
 
#Error L2
 
ax[0].plot(n_error, error_l2, label='Error $L^2$')
 
ax[0].set_title('Error $L^2$')
 
 
#Error Linf
 
ax[1].plot(n_error, error_inf, label='Error Uniforme ($L^{infty}$)')
 
ax[1].set_title('Error $L^{inf}$')
 
 
 
plt.show()
 
  
 
def serie_fourier_definitiva(f,L,n):
 
def serie_fourier_definitiva(f,L,n):
Línea 147: Línea 92:
 
error_inf.append(round(float(np.max(np.abs(dif))),6))
 
error_inf.append(round(float(np.max(np.abs(dif))),6))
  
fig, ax = plt.subplots(1,2,figsize = (10,4))
+
#Gráfica
 +
plt.figure(figsize = (10,6))
 +
plt.plot(n_error,error_l2, linewidth=2)
 +
plt.title('Error $L^2$')
 +
plt.legend()
 +
plt.grid(True, alpha=0.3)
 +
plt.show()
  
#Error L2
+
def comparar_fourier_cesaro(func, L, n_terms, nombre_funcion="Función"):
ax[0].plot(n_error, error_l2, label='Error $L^2$')
+
    """
ax[0].set_title('Error $L^2$')
+
    Calcula y grafica la aproximación de Fourier estándar vs Sumas de Cesàro.
 +
   
 +
    func: Función original a aproximar.
 +
    L: Longitud del intervalo [-L/2, L/2].
 +
    n_terms: Número máximo de coeficientes (n).
 +
   
 +
    """
 +
   
 +
    def get_coefficients(n):
 +
        # Integración por método del trapecio como se indica en el documento
 +
        x_int = np.linspace(-L/2, L/2, 2000)
 +
        y_int = func(x_int)
 +
       
 +
        # Coeficiente c0
 +
        c0 = (2/L) * trapezoid(y_int, x_int)
 +
       
 +
        an = []
 +
        bn = []
 +
        for i in range(1, n + 1):
 +
            cos_term = np.cos(2 * np.pi * i * x_int / L)
 +
            sin_term = np.sin(2 * np.pi * i * x_int / L)
 +
            an.append((2/L) * trapezoid(y_int * cos_term, x_int))
 +
            bn.append((2/L) * trapezoid(y_int * sin_term, x_int))
 +
        return c0, an, bn
  
#Error Linf
+
    # Obtener coeficientes
ax[1].plot(n_error, error_inf, label='Error Uniforme ($L^{infty}$)')
+
    c0, an, bn = get_coefficients(n_terms)
ax[1].set_title('Error $L^{inf}$')
+
   
 +
    # Construir sumas parciales S_k para Cesàro
 +
    x_range = np.linspace(-L/2,L/2,1000)
 +
    sumas_parciales = []
 +
    current_sum = np.full_like(x_range, c0 / 2)
 +
    sumas_parciales.append(current_sum.copy())
 +
   
 +
    for i in range(n_terms):
 +
        term = an[i] * np.cos(2 * np.pi * (i+1) * x_range / L) + \
 +
              bn[i] * np.sin(2 * np.pi * (i+1) * x_range / L)
 +
        current_sum += term
 +
        sumas_parciales.append(current_sum.copy())
 +
   
 +
    # Calcular Suma de Cesàro (Promedio de las sumas parciales)
 +
    sigma_n = np.mean(sumas_parciales, axis=0)
 +
   
 +
    # Gráfica
 +
    plt.figure(figsize=(12, 6))
 +
    plt.plot(x_range, func(x_range), 'k--', label=f"Original: {nombre_funcion}", alpha=0.6)
 +
    plt.plot(x_range, current_sum, label=f"Fourier Estándar (n={n_terms})", color='red', alpha=0.5)
 +
    plt.plot(x_range, sigma_n, label=f"Suma de Cesàro (n={n_terms})", color='blue', linewidth=2)
 +
   
 +
    plt.title(f"Aproximación de {nombre_funcion}: Fourier vs Cesàro")
 +
    plt.xlabel("x")
 +
    plt.ylabel("f(x)")
 +
    plt.grid(True, linestyle='--', alpha=0.7)
 +
    plt.show()
  
 
plt.show()
 
  
  
#Lo que se ejecuta
+
#Lo que se ejecuta---------------------------------------------------------
# base_trigonometrica(6)
+
base_trigonometrica(6)
#aproximar_funcion_cont([1,5,10])
+
  
 
def f(x):
 
def f(x):
Línea 184: Línea 181:
  
 
return suma
 
return suma
 +
 +
def g(x):
 +
return x**2
 +
 +
serie_fourier_definitiva(f,10,[1,5,10,100])
 +
comparar_fourier_cesaro(f, 10, 50, "Función Discontinua (Escalón)")
 +
comparar_fourier_cesaro(MW, 10, 100, "Monstruo de Weierstrass")
 +
  
  
serie_fourier_definitiva(MW,20,[1,5,10,200])
 
 
</source>
 
</source>
  
 
[[Categoría:EDP]]
 
[[Categoría:EDP]]
 
[[Categoría:EDP25/26]]
 
[[Categoría:EDP25/26]]

Revisión actual del 10:41 19 feb 2026

Trabajo realizado por estudiantes
Título Series de Fourier. Grupo LÁJ
Asignatura EDP
Curso 2025-26
Autores Luis García Suárez

Álvaro Moreno Cisneros

Juan Pérez Guerra

Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura


Series de fourier LÁJ.jpeg PDF del póster


Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. La función serie_de_fourier_definitiva aproxima una función dada en un intervalo mediante una serie de Fourier, la función comparar_fourier_cesaro es la que da las gráficas de la última parte y la función base_trigonométrica aunque no se ha incluído en el póster ilustra como funciona la base trigonométrica.

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import trapezoid

def base_trigonometrica(n):
	#Puntos donde se grafica
	x = np.linspace(-1,1,1000)
	plt.figure(figsize = (10,6))

	#Primer término de la serie
	plt.plot(x, np.full_like(x, 0.5), label='1/2 (n=0)', linewidth=2, color='black')

	#Términos trigonométricos
	for n in range(1,n):
		plt.plot(x, np.cos(n*np.pi*x), color = 'r', linestyle='-')
		plt.plot(x, np.sin(n*np.pi*x), color = 'b', linestyle='-')

	plt.title('Primeros términos de la base trigonométrica {1/2, cos(nπx), sin(nπx)}')
	plt.xlabel('x')
	plt.ylabel('f(x)')
	plt.axhline(0, color='black', linewidth=0.5)
	plt.axvline(0, color='black', linewidth=0.5)
	plt.grid(True, linestyle=':', alpha=0.6)
	plt.legend(['1/2','cos','sin'], loc = 'upper right', bbox_to_anchor = (1,1))
	plt.tight_layout()

	# Mostrar resultado
	plt.show()


def serie_fourier_definitiva(f,L,n):

	#Puntos donde se grafica y sus valores exactos
	x = np.linspace(-L/2,L/2,1000)
	f_ev = f(x)

	def serie_fourier(funcion,x_val,n_terms):
		fn = np.zeros_like(x_val)
		f_eval = funcion(x_val)

		c0 = trapezoid(2/L * f_eval,x_val)
		fn = c0/2
		for k in range(1,n_terms+1):
			#Coeficientes
			cn = trapezoid(2/L * f_eval * np.cos(2*k*np.pi*x_val/L),x_val)
			dn = trapezoid(2/L * f_eval * np.sin(2*k*np.pi*x_val/L),x_val)

			#Sumar términos
			fn +=  cn* np.cos(2*k*np.pi*x_val/L) + dn * np.sin(2*k*np.pi*x_val/L)

		return fn

	#Gráfica
	plt.figure(figsize = (10,6))
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)

	for i in n:
		fn_ev = serie_fourier(f,x,i)
		plt.plot(x,fn_ev, label=f'n = {i}')

	plt.title('Aproximación de f(x) mediante serie de Fourier')
	plt.legend()
	plt.grid(True, alpha=0.3)
	plt.show()

	#Cálculo de errores
	n_error = []
	for i in range(1,100):
		n_error.append(i)

	error_l2 = []
	error_inf = []

	for i in n_error:
		f_n = serie_fourier(f,x,i)
		dif = f_ev - f_n

		error_l2.append(np.sqrt(trapezoid(dif**2,x)))
		error_inf.append(round(float(np.max(np.abs(dif))),6))

	#Gráfica
	plt.figure(figsize = (10,6))
	plt.plot(n_error,error_l2, linewidth=2)
	plt.title('Error $L^2$')
	plt.legend()
	plt.grid(True, alpha=0.3)
	plt.show()

def comparar_fourier_cesaro(func, L, n_terms, nombre_funcion="Función"):
    """
    Calcula y grafica la aproximación de Fourier estándar vs Sumas de Cesàro.
    
    func: Función original a aproximar.
    L: Longitud del intervalo [-L/2, L/2].
    n_terms: Número máximo de coeficientes (n).
    
    """
    
    def get_coefficients(n):
        # Integración por método del trapecio como se indica en el documento 
        x_int = np.linspace(-L/2, L/2, 2000)
        y_int = func(x_int)
        
        # Coeficiente c0
        c0 = (2/L) * trapezoid(y_int, x_int)
        
        an = []
        bn = []
        for i in range(1, n + 1):
            cos_term = np.cos(2 * np.pi * i * x_int / L)
            sin_term = np.sin(2 * np.pi * i * x_int / L)
            an.append((2/L) * trapezoid(y_int * cos_term, x_int))
            bn.append((2/L) * trapezoid(y_int * sin_term, x_int))
        return c0, an, bn

    # Obtener coeficientes
    c0, an, bn = get_coefficients(n_terms)
    
    # Construir sumas parciales S_k para Cesàro
    x_range = np.linspace(-L/2,L/2,1000)
    sumas_parciales = []
    current_sum = np.full_like(x_range, c0 / 2)
    sumas_parciales.append(current_sum.copy())
    
    for i in range(n_terms):
        term = an[i] * np.cos(2 * np.pi * (i+1) * x_range / L) + \
               bn[i] * np.sin(2 * np.pi * (i+1) * x_range / L)
        current_sum += term
        sumas_parciales.append(current_sum.copy())
    
    # Calcular Suma de Cesàro (Promedio de las sumas parciales)
    sigma_n = np.mean(sumas_parciales, axis=0)
    
    # Gráfica
    plt.figure(figsize=(12, 6))
    plt.plot(x_range, func(x_range), 'k--', label=f"Original: {nombre_funcion}", alpha=0.6)
    plt.plot(x_range, current_sum, label=f"Fourier Estándar (n={n_terms})", color='red', alpha=0.5)
    plt.plot(x_range, sigma_n, label=f"Suma de Cesàro (n={n_terms})", color='blue', linewidth=2)
    
    plt.title(f"Aproximación de {nombre_funcion}: Fourier vs Cesàro")
    plt.xlabel("x")
    plt.ylabel("f(x)")
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.show()



#Lo que se ejecuta---------------------------------------------------------
base_trigonometrica(6)

def f(x):
	lista = []
	for i in x:
		if i < 0:
			lista.append(0)
		else:
			lista.append(1)
	return np.array(lista)

def MW(x):
	n = 200
	a = 1/2
	b = 13

	suma = 0
	for i in range(n):
		suma += a**i * np.cos(b**i * np.pi*x)

	return suma

def g(x):
	return x**2

serie_fourier_definitiva(f,10,[1,5,10,100])
comparar_fourier_cesaro(f, 10, 50, "Función Discontinua (Escalón)")
comparar_fourier_cesaro(MW, 10, 100, "Monstruo de Weierstrass")