<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://mat.caminos.upm.es/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alejandro.mates</id>
		<title>MateWiki - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://mat.caminos.upm.es/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alejandro.mates"/>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Especial:Contribuciones/Alejandro.mates"/>
		<updated>2026-04-23T10:39:32Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Ecuaci%C3%B3n_del_calor_RAJ.pdf&amp;diff=104497</id>
		<title>Archivo:Ecuación del calor RAJ.pdf</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Ecuaci%C3%B3n_del_calor_RAJ.pdf&amp;diff=104497"/>
				<updated>2026-04-12T11:20:11Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Ecuaci%C3%B3n_del_calor_RAJ.png&amp;diff=104496</id>
		<title>Archivo:Ecuación del calor RAJ.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Ecuaci%C3%B3n_del_calor_RAJ.png&amp;diff=104496"/>
				<updated>2026-04-12T11:19:22Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor_RAJ&amp;diff=104495</id>
		<title>Ecuación del calor RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor_RAJ&amp;diff=104495"/>
				<updated>2026-04-12T11:17:59Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: Página creada con «{{ TrabajoED | Ecuación del calor. Grupo LÁJ| EDP|2025-26 | Luis García Suárez  Álvaro Moreno Cisneros  Juan Pérez Guerra...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo LÁJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez&lt;br /&gt;
&lt;br /&gt;
Álvaro Moreno Cisneros&lt;br /&gt;
&lt;br /&gt;
Juan Pérez Guerra }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Ecuación del calor RAJ.png||800px]]&lt;br /&gt;
[[Medio:Ecuación del calor RAJ.pdf| PDF del póster]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pandas as pd&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
#Visualización unidimensional&lt;br /&gt;
&lt;br /&gt;
def nucleo_calor(x, t):&lt;br /&gt;
    return (1.0 / np.sqrt(4 * np.pi * t)) * np.exp(-(x**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def condicion_inicial_escalon(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0) &amp;amp; (x &amp;lt;= 1), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def condicion_inicial_gaussiana(x):&lt;br /&gt;
    return np.exp(-x**2)&lt;br /&gt;
&lt;br /&gt;
def resolver_calor_integral(x_eval, t, u0_func, y_min=-10, y_max=10, dy=0.002):&lt;br /&gt;
    y = np.arange(y_min, y_max, dy)&lt;br /&gt;
    u0_y = u0_func(y)&lt;br /&gt;
&lt;br /&gt;
    u_vals = np.zeros_like(x_eval, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i, x in enumerate(x_eval):&lt;br /&gt;
        integrando = nucleo_calor(x - y, t) * u0_y&lt;br /&gt;
        u_vals[i] = np.trapezoid(integrando, y)&lt;br /&gt;
&lt;br /&gt;
    return u_vals&lt;br /&gt;
&lt;br /&gt;
x_dominio = np.linspace(-2, 3, 500)&lt;br /&gt;
tiempos = [0.001, 0.01, 0.1, 0.5, 1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_dominio, condicion_inicial_escalon(x_dominio), 'k--', label='t = 0 (Dato Inicial)')&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u_t = resolver_calor_integral(x_dominio, t, condicion_inicial_escalon)&lt;br /&gt;
    plt.plot(x_dominio, u_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.title(r'Evolución de la Ecuación del Calor por Convolución en $\mathbb{R}$')&lt;br /&gt;
plt.xlabel('Posición x')&lt;br /&gt;
plt.ylabel('Temperatura u(x,t)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
x_vals = np.linspace(-2, 3, 100)&lt;br /&gt;
t_vals = np.linspace(0.001, 2, 100)&lt;br /&gt;
&lt;br /&gt;
X_mesh, T_mesh = np.meshgrid(x_vals, t_vals)&lt;br /&gt;
&lt;br /&gt;
y_int = np.linspace(0, 1, 300)&lt;br /&gt;
&lt;br /&gt;
diffs = X_mesh[:, :, np.newaxis] - y_int[np.newaxis, np.newaxis, :]&lt;br /&gt;
kernel_vals = nucleo_calor(diffs, T_mesh[:, :, np.newaxis])&lt;br /&gt;
u0_y = condicion_inicial_escalon(y_int)[np.newaxis, np.newaxis, :]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U_solution = np.trapezoid(kernel_vals * u0_y, x=y_int, axis=2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fig = plt.figure(figsize=(9, 7))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
surf = ax.plot_surface(X_mesh, T_mesh, U_solution, cmap='viridis',&lt;br /&gt;
                       edgecolor='none', alpha=0.9, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ax.set_title(r'Evolución Espacio-Temporal de la Ecuación del Calor por Convolución en $\mathbb{R}$')&lt;br /&gt;
ax.set_xlabel('Posición x')&lt;br /&gt;
ax.set_ylabel('Tiempo t')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t)')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, label='Temperatura')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Velocidad Infinita de Propagación&lt;br /&gt;
&lt;br /&gt;
x_lejos = np.linspace(1.5, 10, 300)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u_t_lejos = resolver_calor_integral(x_lejos, t, condicion_inicial_escalon)&lt;br /&gt;
    plt.plot(x_lejos, u_t_lejos + 1e-300, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.yscale('log')&lt;br /&gt;
plt.title('Velocidad Infinita de Propagación')&lt;br /&gt;
plt.xlabel('Posición x')&lt;br /&gt;
plt.ylabel('Temperatura u(x,t) - Escala Logarítmica')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, ls=&amp;quot;--&amp;quot;, alpha=0.5)&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
puntos_obs = [-1.0, -0.1, 0.5, 1.1, 2.0]&lt;br /&gt;
tabla_datos = {'Posición (x)': puntos_obs, 'u(x, t=0)': [0.0, 0.0, 1.0, 0.0, 0.0]}&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    valores = resolver_calor_integral(np.array(puntos_obs), t, condicion_inicial_escalon)&lt;br /&gt;
    tabla_datos[f't={t}'] = valores&lt;br /&gt;
&lt;br /&gt;
df = pd.DataFrame(tabla_datos)&lt;br /&gt;
print(&amp;quot;\n--- Tabla de Propagación ---&amp;quot;)&lt;br /&gt;
print(df.to_string(index=False))&lt;br /&gt;
df.to_csv('tabla_propagacion.csv', index=False)&lt;br /&gt;
&lt;br /&gt;
#Comparación del decaimiento&lt;br /&gt;
&lt;br /&gt;
def max_R_t(t):&lt;br /&gt;
    y = np.linspace(-5, 6, 2000)&lt;br /&gt;
    integrando = nucleo_calor(0.5 - y, t) * condicion_inicial_escalon(y)&lt;br /&gt;
    return np.trapezoid(integrando, y)&lt;br /&gt;
&lt;br /&gt;
def max_acotado_t(t, L=5.0, X_centro=0.5, terms=50):&lt;br /&gt;
    val = 0&lt;br /&gt;
    for n in range(1, terms + 1):&lt;br /&gt;
        bn = (2.0 / (n * np.pi)) * (1 - np.cos(n * np.pi * 1.0 / L))&lt;br /&gt;
        val += bn * np.exp(-((n * np.pi / L)**2) * t) * np.sin(n * np.pi * X_centro / L)&lt;br /&gt;
    return val&lt;br /&gt;
&lt;br /&gt;
def norm_L2_R_t(t):&lt;br /&gt;
    x_vals = np.linspace(-15, 15, 1000)&lt;br /&gt;
    y_vals = np.linspace(-1, 2, 400)&lt;br /&gt;
&lt;br /&gt;
    X, Y = np.meshgrid(x_vals, y_vals)&lt;br /&gt;
    K = nucleo_calor(X - Y, t)&lt;br /&gt;
    u0 = condicion_inicial_escalon(Y)&lt;br /&gt;
&lt;br /&gt;
    u_vals = np.trapezoid(K * u0, x=y_vals, axis=0)&lt;br /&gt;
&lt;br /&gt;
    integral_u2 = np.trapezoid(u_vals**2, x=x_vals)&lt;br /&gt;
    return np.sqrt(integral_u2)&lt;br /&gt;
&lt;br /&gt;
def norm_L2_acotado_t(t, L=5.0, terms=50):&lt;br /&gt;
    norm_cuadrado = 0&lt;br /&gt;
    for n in range(1, terms + 1):&lt;br /&gt;
        bn = (2.0 / (n * np.pi)) * (1 - np.cos(n * np.pi * 1.0 / L))&lt;br /&gt;
        lambda_n = (n * np.pi / L)**2&lt;br /&gt;
        norm_cuadrado += (bn**2) * np.exp(-2 * lambda_n * t)&lt;br /&gt;
    return np.sqrt((L / 2.0) * norm_cuadrado)&lt;br /&gt;
&lt;br /&gt;
tiempos = np.linspace(0.1, 50, 100)&lt;br /&gt;
max_R = [max_R_t(t) for t in tiempos]&lt;br /&gt;
max_acotado = [max_acotado_t(t) for t in tiempos]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(9, 6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(tiempos, max_R, label=r'Dominio $\mathbb{R}$ (Decaimiento $t^{-1/2}$)', color='blue', lw=2)&lt;br /&gt;
plt.plot(tiempos, max_acotado, label=r'Dominio Acotado (Decaimiento $e^{-\lambda_1 t}$)', color='red', lw=2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.yscale('log')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.title('Comparativa de Decaimiento de la Temperatura Máxima')&lt;br /&gt;
plt.xlabel('Tiempo t')&lt;br /&gt;
plt.ylabel('Temperatura Máxima - Escala Logarítmica')&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, ls=&amp;quot;--&amp;quot;, alpha=0.5)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
tiempos = np.linspace(0.1, 50, 100)&lt;br /&gt;
norma_R = [norm_L2_R_t(t) for t in tiempos]&lt;br /&gt;
norma_acotado = [norm_L2_acotado_t(t) for t in tiempos]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(9, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(tiempos, norma_R, label=r'Dominio $\mathbb{R}$ (Decaimiento $t^{-1/4}$)', color='blue', lw=2)&lt;br /&gt;
plt.plot(tiempos, norma_acotado, label=r'Dominio Acotado (Decaimiento $e^{-\lambda_1 t}$)', color='red', lw=2)&lt;br /&gt;
&lt;br /&gt;
plt.yscale('log')&lt;br /&gt;
plt.title('Comparativa de Decaimiento en Norma $L^2$')&lt;br /&gt;
plt.xlabel('Tiempo t')&lt;br /&gt;
plt.ylabel('Norma $L^2$ - Escala Logarítmica')&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, ls=&amp;quot;--&amp;quot;, alpha=0.5)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Visualización del Caso bidimensional&lt;br /&gt;
&lt;br /&gt;
def nucleo_calor_2d(x, y, t):&lt;br /&gt;
    return (1.0 / (4 * np.pi * t)) * np.exp(-(x**2 + y**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def u0_gaussiana_2d(x, y):&lt;br /&gt;
    return np.exp(-(x**2 + y**2))&lt;br /&gt;
&lt;br /&gt;
def u0_escalon_2d(x, y):&lt;br /&gt;
    return np.where((np.abs(x) &amp;lt;= 0.5) &amp;amp; (np.abs(y) &amp;lt;= 0.5), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def resolver_calor_convolucion_2d_trapecio(X, Y, t, u0_func,&lt;br /&gt;
                                           xi_min=-2, xi_max=2,&lt;br /&gt;
                                           eta_min=-2, eta_max=2,&lt;br /&gt;
                                           dxi=0.05, deta=0.05):&lt;br /&gt;
&lt;br /&gt;
    xi = np.arange(xi_min, xi_max, dxi)&lt;br /&gt;
    eta = np.arange(eta_min, eta_max, deta)&lt;br /&gt;
    XI, ETA = np.meshgrid(xi, eta)&lt;br /&gt;
&lt;br /&gt;
    u0_vals = u0_func(XI, ETA)&lt;br /&gt;
&lt;br /&gt;
    Z = np.zeros_like(X)&lt;br /&gt;
&lt;br /&gt;
    for i in range(X.shape[0]):&lt;br /&gt;
        for j in range(X.shape[1]):&lt;br /&gt;
&lt;br /&gt;
            kernel = nucleo_calor_2d(X[i, j] - XI, Y[i, j] - ETA, t)&lt;br /&gt;
            integrando = kernel * u0_vals&lt;br /&gt;
&lt;br /&gt;
            integral_eta = np.trapezoid(integrando, eta, axis=0)&lt;br /&gt;
            integral_total = np.trapezoid(integral_eta, xi)&lt;br /&gt;
&lt;br /&gt;
            Z[i, j] = integral_total&lt;br /&gt;
&lt;br /&gt;
    return Z&lt;br /&gt;
&lt;br /&gt;
x_vals = np.linspace(-1, 1, 100)&lt;br /&gt;
y_vals = np.linspace(-1, 1, 100)&lt;br /&gt;
X, Y = np.meshgrid(x_vals, y_vals)&lt;br /&gt;
&lt;br /&gt;
tiempos = [0.01, 0.1, 1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fig = plt.figure(figsize=(18, 8))&lt;br /&gt;
&lt;br /&gt;
for i, t in enumerate(tiempos):&lt;br /&gt;
&lt;br /&gt;
    L = 5 * np.sqrt(t)&lt;br /&gt;
&lt;br /&gt;
    Z = resolver_calor_convolucion_2d_trapecio(&lt;br /&gt;
        X, Y, t,&lt;br /&gt;
        u0_gaussiana_2d,&lt;br /&gt;
        xi_min=-L, xi_max=L,&lt;br /&gt;
        eta_min=-L, eta_max=L,&lt;br /&gt;
        dxi=0.05, deta=0.05&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    ax = fig.add_subplot(1, 3, i+1, projection='3d')&lt;br /&gt;
&lt;br /&gt;
    surf = ax.plot_surface(X, Y, Z, cmap='inferno', edgecolor='none', alpha=0.9)&lt;br /&gt;
&lt;br /&gt;
    ax.set_title(f'Tiempo t = {t}', fontsize=12)&lt;br /&gt;
    ax.set_xlabel('$x_1$', fontsize=14)&lt;br /&gt;
    ax.set_ylabel('$x_2$', fontsize=14)&lt;br /&gt;
    ax.set_zlabel('$u(x,t)$', fontsize=14)&lt;br /&gt;
&lt;br /&gt;
    ax.tick_params(axis='x', labelsize=12)&lt;br /&gt;
    ax.tick_params(axis='y', labelsize=12)&lt;br /&gt;
    ax.tick_params(axis='z', labelsize=12)&lt;br /&gt;
&lt;br /&gt;
    ax.view_init(elev=25, azim=-45)&lt;br /&gt;
&lt;br /&gt;
plt.suptitle(r'Solución por Convolución de la Ecuación del Calor en $\mathbb{R}^2$', fontsize=20, y=0.98)&lt;br /&gt;
plt.tight_layout(rect=[0, 0.03, 1, 0.95], w_pad=4.0)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Series_de_fourier_RAJ.jpeg&amp;diff=104222</id>
		<title>Archivo:Series de fourier RAJ.jpeg</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Series_de_fourier_RAJ.jpeg&amp;diff=104222"/>
				<updated>2026-02-18T21:16:26Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104221</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104221"/>
				<updated>2026-02-18T21:16:01Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Series de fourier RAJ.jpeg||800px]]&lt;br /&gt;
[[Archivo:Poster_Gibbs_RAJ.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se adjunta a continuación el código utilizado para la visualización de las gráficas expuestas durante la presentación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Fourier&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Cesaro&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Lanczos&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Lanczos en [-1, 1]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Lanczos en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Gráficas de Abel&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_fijos = construir_coeficientes_par(f_par_extendida, N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('r (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104220</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104220"/>
				<updated>2026-02-18T21:14:51Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Poster_Gibbs_RAJ.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se adjunta a continuación el código utilizado para la visualización de las gráficas expuestas durante la presentación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Fourier&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Cesaro&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Lanczos&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Lanczos en [-1, 1]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Lanczos en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Gráficas de Abel&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_fijos = construir_coeficientes_par(f_par_extendida, N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('r (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:P%C3%B3ster_Fen%C3%B3meno_de_Gibbs.png&amp;diff=104213</id>
		<title>Archivo:Póster Fenómeno de Gibbs.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:P%C3%B3ster_Fen%C3%B3meno_de_Gibbs.png&amp;diff=104213"/>
				<updated>2026-02-18T21:11:52Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104211</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104211"/>
				<updated>2026-02-18T21:07:47Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Póster Fenómeno de Gibbs.png||800px]]&lt;br /&gt;
[[Archivo:Poster_Gibbs_RAJ.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se adjunta a continuación el código utilizado para la visualización de las gráficas expuestas durante la presentación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Fourier&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Cesaro&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Lanczos&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Lanczos en [-1, 1]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Lanczos en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Gráficas de Abel&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_fijos = construir_coeficientes_par(f_par_extendida, N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('r (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104210</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104210"/>
				<updated>2026-02-18T21:07:25Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Poster_Gibbs_RAJ.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se adjunta a continuación el código utilizado para la visualización de las gráficas expuestas durante la presentación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Fourier&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Cesaro&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Lanczos&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Lanczos en [-1, 1]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Lanczos en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Gráficas de Abel&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_fijos = construir_coeficientes_par(f_par_extendida, N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('r (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Fen%C3%B3meno_de_Gibbs.png&amp;diff=104208</id>
		<title>Archivo:Fenómeno de Gibbs.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Fen%C3%B3meno_de_Gibbs.png&amp;diff=104208"/>
				<updated>2026-02-18T21:06:34Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Poster_Gibbs_RAJ.pdf&amp;diff=104206</id>
		<title>Archivo:Poster Gibbs RAJ.pdf</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Poster_Gibbs_RAJ.pdf&amp;diff=104206"/>
				<updated>2026-02-18T21:06:04Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Poster_Gibbs_RAJ.png&amp;diff=104203</id>
		<title>Archivo:Poster Gibbs RAJ.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Poster_Gibbs_RAJ.png&amp;diff=104203"/>
				<updated>2026-02-18T21:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104201</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104201"/>
				<updated>2026-02-18T21:03:56Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Fenómeno de Gibbs.png||800px]]&lt;br /&gt;
[[Archivo:Poster_Gibbs_RAJ.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se adjunta a continuación el código utilizado para la visualización de las gráficas expuestas durante la presentación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Fourier&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Cesaro&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Lanczos&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Lanczos en [-1, 1]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Lanczos en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Gráficas de Abel&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_fijos = construir_coeficientes_par(f_par_extendida, N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('r (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104154</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104154"/>
				<updated>2026-02-18T19:01:37Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
Se adjunta a continuación el código utilizado para la visualización de las gráficas expuestas durante la presentación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def f_discontinua(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Define la función característica del intervalo [0, 1/4].&lt;br /&gt;
    Retorna 1 si 0 &amp;lt;= x &amp;lt;= 0.25, y 0 en otro caso.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Usamos np.where para vectorizar la operación sobre arrays de numpy&lt;br /&gt;
    return np.where((x &amp;gt;= 0) &amp;amp; (x &amp;lt;= 0.25), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Construye los coeficientes de Fourier para una extensión PAR de la función dada.&lt;br /&gt;
&lt;br /&gt;
    Parámetros:&lt;br /&gt;
    -----------&lt;br /&gt;
    funcion : callable&lt;br /&gt;
        Función f(x) definida en [0, 1].&lt;br /&gt;
    n_terminos : int&lt;br /&gt;
        Número de coeficientes a calcular (incluyendo a0).&lt;br /&gt;
    dx : float&lt;br /&gt;
        Tamaño de la malla para la integración numérica (Sugerencia: 10^-3).&lt;br /&gt;
&lt;br /&gt;
    Retorna:&lt;br /&gt;
    --------&lt;br /&gt;
    coeficientes : list&lt;br /&gt;
        Lista [a0, a1, ..., a_n-1] calculada mediante la regla del trapecio.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 1. Definir la malla de integración [0, 1]&lt;br /&gt;
    # Se usa arange hasta 1 + dx/2 para asegurar que incluye el punto final 1.0&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
&lt;br /&gt;
    # 2. Evaluar la función en la malla&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    # 3. Calcular los coeficientes a_k&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        # Base trigonométrica par: cos(k * pi * x)&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
&lt;br /&gt;
        # Integrando: 2 * f(x) * cos(k*pi*x)&lt;br /&gt;
        # El factor '2' proviene de la simetría par en [-1, 1]&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
&lt;br /&gt;
        # Aproximación de la integral usando la regla del trapecio&lt;br /&gt;
        # Tal como se sugiere en el punto 2 del texto&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# 1. Función de Reconstrucción (Solicitada al inicio)&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye la serie de Fourier de cosenos.&lt;br /&gt;
    S_N(x) = a0/2 + sum(a_k * cos(k*pi*x))&lt;br /&gt;
&lt;br /&gt;
    Parámetros:&lt;br /&gt;
    -----------&lt;br /&gt;
    coeficientes : list&lt;br /&gt;
        Coeficientes [a0, a1, ..., aN] calculados.&lt;br /&gt;
    x_eval : array&lt;br /&gt;
        Puntos donde evaluar la serie (puede ser [-1, 1]).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # 1. Término constante (siempre es a0 / 2)&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # 2. Sumar términos cosenos&lt;br /&gt;
    # La paridad (simetría) en [-1, 1] es automática con cos(k*pi*x)&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# 2. Funciones Auxiliares (Coeficientes y Error)&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Define la función par en todo el eje real.&lt;br /&gt;
    f(x) = 1 si |x| &amp;lt;= 0.25, 0 en otro caso.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes(n_terminos, dx):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula a_k integrando solo en [0, 1] (suficiente por simetría).&lt;br /&gt;
    Usa 'dx' para crear la malla con np.arange (sin linspace).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Malla positiva [0, 1] para la integral&lt;br /&gt;
    x = np.arange(0, 1 + dx/10, dx)&lt;br /&gt;
    y = f_par_extendida(x)&lt;br /&gt;
&lt;br /&gt;
    coefs = []&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * base&lt;br /&gt;
        # Integral numérica&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coefs.append(a_k)&lt;br /&gt;
    return coefs&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Calcula errores L2 y Uniforme en el dominio dado.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    # L2 = sqrt( integral(diff^2) )&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    # Uniforme = max(diff)&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye la Suma de Cesàro (promedio de sumas parciales).&lt;br /&gt;
    Matemáticamente equivale a multiplicar los coeficientes a_k&lt;br /&gt;
    por el peso triangular: (N - k + 1) / (N + 1).&lt;br /&gt;
&lt;br /&gt;
    Parámetros:&lt;br /&gt;
    -----------&lt;br /&gt;
    coeficientes : list&lt;br /&gt;
        [a0, a1, ..., aN] calculados previamente.&lt;br /&gt;
    x_eval : array&lt;br /&gt;
        Puntos de evaluación.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    N = len(coeficientes) - 1  # El índice máximo es N&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # El denominador común del peso es N + 1&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    # 1. Término constante a0/2&lt;br /&gt;
    # El peso de Cesàro para k=0 es (N - 0 + 1)/(N+1) = 1.&lt;br /&gt;
    # Pero recordamos que en la serie el término es a0/2.&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # 2. Términos cosenos con pesos de Fejér&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        # Peso triangular que define la suma de Cesàro&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# --- Función para Método de Lanczos (Factores Sigma) ---&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye usando factores Sigma (sinc).&lt;br /&gt;
    Suaviza Gibbs manteniendo buena pendiente.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # Término a0/2&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    # Términos cosenos multiplicados por sigma = sinc(k/N)&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        # np.sinc(x) calcula sin(pi*x)/(pi*x)&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# --- Función para Método de Abel (Poisson) ---&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye la serie usando Abel con un r fijo dado por el usuario.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # Término a0/2 (r^0 = 1)&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    # Términos cosenos multiplicados por r^k&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# 3. Ejecución y Gráficas (Extensión Par Completa [-1, 1])&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# A. Parámetros Basados en Malla (Sin número fijo de puntos)&lt;br /&gt;
dx_malla = 1e-4      # Tamaño del paso (resolución)&lt;br /&gt;
N_max_calculo = 500    # Máximo N para el análisis de error&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 500]&lt;br /&gt;
&lt;br /&gt;
# B. Construcción del Dominio Completo [-1, 1]&lt;br /&gt;
# Usamos arange: start=-1, stop=1 (con margen), step=dx&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# C. Cálculo de Coeficientes (una sola vez hasta N_max)&lt;br /&gt;
coefs_totales = construir_coeficientes(N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 1: Función y Aproximaciones ---&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
# Dibujar la función original (Exacta)&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original (Par)', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
# Dibujar las aproximaciones para distintos N&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Extensión Par Completa en [-1, 1] (dx={dx_malla})')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 2: Evolución de Errores (L2 y Uniforme) ---&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    # Calcular error sobre todo el intervalo [-1, 1]&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2 [-1, 1]', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme (Max)', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title('Evolución del Error vs Número de Términos')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parámetros globales&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 500]&lt;br /&gt;
&lt;br /&gt;
# Dominio completo [-1, 1] usando arange y dx&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# Calcular coeficientes &amp;quot;crudos&amp;quot; una sola vez&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 1: Aproximación de Cesàro ---&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Función original&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Original f(x)', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    # Para Cesàro de orden N, necesitamos coeficientes hasta N&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    # Reconstrucción usando la función de Cesàro&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'Cesàro N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Sumas de Cesàro (Mitigación de Gibbs) en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x) [Cesàro]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 2: Evolución de Errores (Cesàro) ---&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2 (Cesàro)', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme (Cesàro)', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title('Evolución del Error en Sumas de Cesàro vs N')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --- Configuración (Tomamos los valores del caso anterior) ---&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [5, 20, 50, 100, 500]&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# Calculamos coeficientes (si no existen ya en memoria)&lt;br /&gt;
# Nota: Aquí SÍ usamos dx_malla&lt;br /&gt;
coefs_totales = construir_coeficientes(N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# GRÁFICAS LANCZOS&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# 1. Aproximación Visual&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    # Aquí NO hace falta dx, solo coeficientes y x&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'Lanczos N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title('Método de Lanczos (Factores Sigma)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# 2. Evolución del Error&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    # Aquí usamos dx SOLO para calcular la integral del error L2&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title('Error en Lanczos vs N')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300  # Fijamos un N alto para tener &amp;quot;espacio&amp;quot; de frecuencias&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999] # Variamos r&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# Calculamos coeficientes HASTA N_FIJO&lt;br /&gt;
coefs_fijos = construir_coeficientes(N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# GRÁFICA 1: Aproximación Visual (N fijo, r variable)&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
# Usamos un mapa de colores secuencial (Blues) para ver la progresión de r&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Método de Abel variando r (N fijo = {N_FIJO})')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# GRÁFICA 2: Evolución del Error vs r&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# Generamos muchos valores de r entre 0.5 y 0.999&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Evolución del Error al aumentar r (N={N_FIJO})')&lt;br /&gt;
plt.xlabel('Valor de r')&lt;br /&gt;
plt.ylabel('Error')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Invertimos el eje X si quieres ver el efecto de acercarse a 1,&lt;br /&gt;
# o simplemente observamos que al acercarse a 1 el error L2 baja pero el Uniforme sube (Gibbs).&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Fourier&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Cesaro&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Lanczos&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Lanczos en [-1, 1]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Lanczos en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Gráficas de Abel&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_fijos = construir_coeficientes_par(f_par_extendida, N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('r (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104153</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104153"/>
				<updated>2026-02-18T18:58:00Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def f_discontinua(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Define la función característica del intervalo [0, 1/4].&lt;br /&gt;
    Retorna 1 si 0 &amp;lt;= x &amp;lt;= 0.25, y 0 en otro caso.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Usamos np.where para vectorizar la operación sobre arrays de numpy&lt;br /&gt;
    return np.where((x &amp;gt;= 0) &amp;amp; (x &amp;lt;= 0.25), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Construye los coeficientes de Fourier para una extensión PAR de la función dada.&lt;br /&gt;
&lt;br /&gt;
    Parámetros:&lt;br /&gt;
    -----------&lt;br /&gt;
    funcion : callable&lt;br /&gt;
        Función f(x) definida en [0, 1].&lt;br /&gt;
    n_terminos : int&lt;br /&gt;
        Número de coeficientes a calcular (incluyendo a0).&lt;br /&gt;
    dx : float&lt;br /&gt;
        Tamaño de la malla para la integración numérica (Sugerencia: 10^-3).&lt;br /&gt;
&lt;br /&gt;
    Retorna:&lt;br /&gt;
    --------&lt;br /&gt;
    coeficientes : list&lt;br /&gt;
        Lista [a0, a1, ..., a_n-1] calculada mediante la regla del trapecio.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 1. Definir la malla de integración [0, 1]&lt;br /&gt;
    # Se usa arange hasta 1 + dx/2 para asegurar que incluye el punto final 1.0&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
&lt;br /&gt;
    # 2. Evaluar la función en la malla&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    # 3. Calcular los coeficientes a_k&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        # Base trigonométrica par: cos(k * pi * x)&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
&lt;br /&gt;
        # Integrando: 2 * f(x) * cos(k*pi*x)&lt;br /&gt;
        # El factor '2' proviene de la simetría par en [-1, 1]&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
&lt;br /&gt;
        # Aproximación de la integral usando la regla del trapecio&lt;br /&gt;
        # Tal como se sugiere en el punto 2 del texto&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# 1. Función de Reconstrucción (Solicitada al inicio)&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye la serie de Fourier de cosenos.&lt;br /&gt;
    S_N(x) = a0/2 + sum(a_k * cos(k*pi*x))&lt;br /&gt;
&lt;br /&gt;
    Parámetros:&lt;br /&gt;
    -----------&lt;br /&gt;
    coeficientes : list&lt;br /&gt;
        Coeficientes [a0, a1, ..., aN] calculados.&lt;br /&gt;
    x_eval : array&lt;br /&gt;
        Puntos donde evaluar la serie (puede ser [-1, 1]).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # 1. Término constante (siempre es a0 / 2)&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # 2. Sumar términos cosenos&lt;br /&gt;
    # La paridad (simetría) en [-1, 1] es automática con cos(k*pi*x)&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# 2. Funciones Auxiliares (Coeficientes y Error)&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Define la función par en todo el eje real.&lt;br /&gt;
    f(x) = 1 si |x| &amp;lt;= 0.25, 0 en otro caso.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes(n_terminos, dx):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula a_k integrando solo en [0, 1] (suficiente por simetría).&lt;br /&gt;
    Usa 'dx' para crear la malla con np.arange (sin linspace).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Malla positiva [0, 1] para la integral&lt;br /&gt;
    x = np.arange(0, 1 + dx/10, dx)&lt;br /&gt;
    y = f_par_extendida(x)&lt;br /&gt;
&lt;br /&gt;
    coefs = []&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * base&lt;br /&gt;
        # Integral numérica&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coefs.append(a_k)&lt;br /&gt;
    return coefs&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Calcula errores L2 y Uniforme en el dominio dado.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    # L2 = sqrt( integral(diff^2) )&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    # Uniforme = max(diff)&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye la Suma de Cesàro (promedio de sumas parciales).&lt;br /&gt;
    Matemáticamente equivale a multiplicar los coeficientes a_k&lt;br /&gt;
    por el peso triangular: (N - k + 1) / (N + 1).&lt;br /&gt;
&lt;br /&gt;
    Parámetros:&lt;br /&gt;
    -----------&lt;br /&gt;
    coeficientes : list&lt;br /&gt;
        [a0, a1, ..., aN] calculados previamente.&lt;br /&gt;
    x_eval : array&lt;br /&gt;
        Puntos de evaluación.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    N = len(coeficientes) - 1  # El índice máximo es N&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # El denominador común del peso es N + 1&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    # 1. Término constante a0/2&lt;br /&gt;
    # El peso de Cesàro para k=0 es (N - 0 + 1)/(N+1) = 1.&lt;br /&gt;
    # Pero recordamos que en la serie el término es a0/2.&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # 2. Términos cosenos con pesos de Fejér&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        # Peso triangular que define la suma de Cesàro&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# --- Función para Método de Lanczos (Factores Sigma) ---&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye usando factores Sigma (sinc).&lt;br /&gt;
    Suaviza Gibbs manteniendo buena pendiente.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # Término a0/2&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    # Términos cosenos multiplicados por sigma = sinc(k/N)&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        # np.sinc(x) calcula sin(pi*x)/(pi*x)&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# --- Función para Método de Abel (Poisson) ---&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye la serie usando Abel con un r fijo dado por el usuario.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # Término a0/2 (r^0 = 1)&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    # Términos cosenos multiplicados por r^k&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# 3. Ejecución y Gráficas (Extensión Par Completa [-1, 1])&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# A. Parámetros Basados en Malla (Sin número fijo de puntos)&lt;br /&gt;
dx_malla = 1e-4      # Tamaño del paso (resolución)&lt;br /&gt;
N_max_calculo = 500    # Máximo N para el análisis de error&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 500]&lt;br /&gt;
&lt;br /&gt;
# B. Construcción del Dominio Completo [-1, 1]&lt;br /&gt;
# Usamos arange: start=-1, stop=1 (con margen), step=dx&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# C. Cálculo de Coeficientes (una sola vez hasta N_max)&lt;br /&gt;
coefs_totales = construir_coeficientes(N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 1: Función y Aproximaciones ---&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
# Dibujar la función original (Exacta)&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original (Par)', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
# Dibujar las aproximaciones para distintos N&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Extensión Par Completa en [-1, 1] (dx={dx_malla})')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 2: Evolución de Errores (L2 y Uniforme) ---&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    # Calcular error sobre todo el intervalo [-1, 1]&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2 [-1, 1]', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme (Max)', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title('Evolución del Error vs Número de Términos')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parámetros globales&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 500]&lt;br /&gt;
&lt;br /&gt;
# Dominio completo [-1, 1] usando arange y dx&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# Calcular coeficientes &amp;quot;crudos&amp;quot; una sola vez&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 1: Aproximación de Cesàro ---&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Función original&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Original f(x)', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    # Para Cesàro de orden N, necesitamos coeficientes hasta N&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    # Reconstrucción usando la función de Cesàro&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'Cesàro N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Sumas de Cesàro (Mitigación de Gibbs) en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x) [Cesàro]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 2: Evolución de Errores (Cesàro) ---&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2 (Cesàro)', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme (Cesàro)', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title('Evolución del Error en Sumas de Cesàro vs N')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --- Configuración (Tomamos los valores del caso anterior) ---&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [5, 20, 50, 100, 500]&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# Calculamos coeficientes (si no existen ya en memoria)&lt;br /&gt;
# Nota: Aquí SÍ usamos dx_malla&lt;br /&gt;
coefs_totales = construir_coeficientes(N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# GRÁFICAS LANCZOS&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# 1. Aproximación Visual&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    # Aquí NO hace falta dx, solo coeficientes y x&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'Lanczos N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title('Método de Lanczos (Factores Sigma)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# 2. Evolución del Error&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    # Aquí usamos dx SOLO para calcular la integral del error L2&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title('Error en Lanczos vs N')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300  # Fijamos un N alto para tener &amp;quot;espacio&amp;quot; de frecuencias&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999] # Variamos r&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# Calculamos coeficientes HASTA N_FIJO&lt;br /&gt;
coefs_fijos = construir_coeficientes(N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# GRÁFICA 1: Aproximación Visual (N fijo, r variable)&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
# Usamos un mapa de colores secuencial (Blues) para ver la progresión de r&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Método de Abel variando r (N fijo = {N_FIJO})')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# GRÁFICA 2: Evolución del Error vs r&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# Generamos muchos valores de r entre 0.5 y 0.999&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Evolución del Error al aumentar r (N={N_FIJO})')&lt;br /&gt;
plt.xlabel('Valor de r')&lt;br /&gt;
plt.ylabel('Error')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Invertimos el eje X si quieres ver el efecto de acercarse a 1,&lt;br /&gt;
# o simplemente observamos que al acercarse a 1 el error L2 baja pero el Uniforme sube (Gibbs).&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Fourier&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Cesaro&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Lanczos&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Lanczos en [-1, 1]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Lanczos en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Gráficas de Abel&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_fijos = construir_coeficientes_par(f_par_extendida, N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('r (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104152</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104152"/>
				<updated>2026-02-18T18:55:31Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoEDP | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def f_discontinua(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Define la función característica del intervalo [0, 1/4].&lt;br /&gt;
    Retorna 1 si 0 &amp;lt;= x &amp;lt;= 0.25, y 0 en otro caso.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Usamos np.where para vectorizar la operación sobre arrays de numpy&lt;br /&gt;
    return np.where((x &amp;gt;= 0) &amp;amp; (x &amp;lt;= 0.25), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Construye los coeficientes de Fourier para una extensión PAR de la función dada.&lt;br /&gt;
&lt;br /&gt;
    Parámetros:&lt;br /&gt;
    -----------&lt;br /&gt;
    funcion : callable&lt;br /&gt;
        Función f(x) definida en [0, 1].&lt;br /&gt;
    n_terminos : int&lt;br /&gt;
        Número de coeficientes a calcular (incluyendo a0).&lt;br /&gt;
    dx : float&lt;br /&gt;
        Tamaño de la malla para la integración numérica (Sugerencia: 10^-3).&lt;br /&gt;
&lt;br /&gt;
    Retorna:&lt;br /&gt;
    --------&lt;br /&gt;
    coeficientes : list&lt;br /&gt;
        Lista [a0, a1, ..., a_n-1] calculada mediante la regla del trapecio.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 1. Definir la malla de integración [0, 1]&lt;br /&gt;
    # Se usa arange hasta 1 + dx/2 para asegurar que incluye el punto final 1.0&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
&lt;br /&gt;
    # 2. Evaluar la función en la malla&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    # 3. Calcular los coeficientes a_k&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        # Base trigonométrica par: cos(k * pi * x)&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
&lt;br /&gt;
        # Integrando: 2 * f(x) * cos(k*pi*x)&lt;br /&gt;
        # El factor '2' proviene de la simetría par en [-1, 1]&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
&lt;br /&gt;
        # Aproximación de la integral usando la regla del trapecio&lt;br /&gt;
        # Tal como se sugiere en el punto 2 del texto&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# 1. Función de Reconstrucción (Solicitada al inicio)&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye la serie de Fourier de cosenos.&lt;br /&gt;
    S_N(x) = a0/2 + sum(a_k * cos(k*pi*x))&lt;br /&gt;
&lt;br /&gt;
    Parámetros:&lt;br /&gt;
    -----------&lt;br /&gt;
    coeficientes : list&lt;br /&gt;
        Coeficientes [a0, a1, ..., aN] calculados.&lt;br /&gt;
    x_eval : array&lt;br /&gt;
        Puntos donde evaluar la serie (puede ser [-1, 1]).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # 1. Término constante (siempre es a0 / 2)&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # 2. Sumar términos cosenos&lt;br /&gt;
    # La paridad (simetría) en [-1, 1] es automática con cos(k*pi*x)&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# 2. Funciones Auxiliares (Coeficientes y Error)&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Define la función par en todo el eje real.&lt;br /&gt;
    f(x) = 1 si |x| &amp;lt;= 0.25, 0 en otro caso.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes(n_terminos, dx):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula a_k integrando solo en [0, 1] (suficiente por simetría).&lt;br /&gt;
    Usa 'dx' para crear la malla con np.arange (sin linspace).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Malla positiva [0, 1] para la integral&lt;br /&gt;
    x = np.arange(0, 1 + dx/10, dx)&lt;br /&gt;
    y = f_par_extendida(x)&lt;br /&gt;
&lt;br /&gt;
    coefs = []&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * base&lt;br /&gt;
        # Integral numérica&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coefs.append(a_k)&lt;br /&gt;
    return coefs&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Calcula errores L2 y Uniforme en el dominio dado.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    # L2 = sqrt( integral(diff^2) )&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    # Uniforme = max(diff)&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye la Suma de Cesàro (promedio de sumas parciales).&lt;br /&gt;
    Matemáticamente equivale a multiplicar los coeficientes a_k&lt;br /&gt;
    por el peso triangular: (N - k + 1) / (N + 1).&lt;br /&gt;
&lt;br /&gt;
    Parámetros:&lt;br /&gt;
    -----------&lt;br /&gt;
    coeficientes : list&lt;br /&gt;
        [a0, a1, ..., aN] calculados previamente.&lt;br /&gt;
    x_eval : array&lt;br /&gt;
        Puntos de evaluación.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    N = len(coeficientes) - 1  # El índice máximo es N&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # El denominador común del peso es N + 1&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    # 1. Término constante a0/2&lt;br /&gt;
    # El peso de Cesàro para k=0 es (N - 0 + 1)/(N+1) = 1.&lt;br /&gt;
    # Pero recordamos que en la serie el término es a0/2.&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # 2. Términos cosenos con pesos de Fejér&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        # Peso triangular que define la suma de Cesàro&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# --- Función para Método de Lanczos (Factores Sigma) ---&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye usando factores Sigma (sinc).&lt;br /&gt;
    Suaviza Gibbs manteniendo buena pendiente.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # Término a0/2&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    # Términos cosenos multiplicados por sigma = sinc(k/N)&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        # np.sinc(x) calcula sin(pi*x)/(pi*x)&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# --- Función para Método de Abel (Poisson) ---&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Reconstruye la serie usando Abel con un r fijo dado por el usuario.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    # Término a0/2 (r^0 = 1)&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    # Términos cosenos multiplicados por r^k&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# 3. Ejecución y Gráficas (Extensión Par Completa [-1, 1])&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# A. Parámetros Basados en Malla (Sin número fijo de puntos)&lt;br /&gt;
dx_malla = 1e-4      # Tamaño del paso (resolución)&lt;br /&gt;
N_max_calculo = 500    # Máximo N para el análisis de error&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 500]&lt;br /&gt;
&lt;br /&gt;
# B. Construcción del Dominio Completo [-1, 1]&lt;br /&gt;
# Usamos arange: start=-1, stop=1 (con margen), step=dx&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# C. Cálculo de Coeficientes (una sola vez hasta N_max)&lt;br /&gt;
coefs_totales = construir_coeficientes(N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 1: Función y Aproximaciones ---&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
# Dibujar la función original (Exacta)&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original (Par)', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
# Dibujar las aproximaciones para distintos N&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Extensión Par Completa en [-1, 1] (dx={dx_malla})')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 2: Evolución de Errores (L2 y Uniforme) ---&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    # Calcular error sobre todo el intervalo [-1, 1]&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2 [-1, 1]', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme (Max)', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title('Evolución del Error vs Número de Términos')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parámetros globales&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 500]&lt;br /&gt;
&lt;br /&gt;
# Dominio completo [-1, 1] usando arange y dx&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# Calcular coeficientes &amp;quot;crudos&amp;quot; una sola vez&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 1: Aproximación de Cesàro ---&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Función original&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Original f(x)', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    # Para Cesàro de orden N, necesitamos coeficientes hasta N&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    # Reconstrucción usando la función de Cesàro&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'Cesàro N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Sumas de Cesàro (Mitigación de Gibbs) en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x) [Cesàro]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# --- GRÁFICA 2: Evolución de Errores (Cesàro) ---&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2 (Cesàro)', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme (Cesàro)', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title('Evolución del Error en Sumas de Cesàro vs N')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --- Configuración (Tomamos los valores del caso anterior) ---&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [5, 20, 50, 100, 500]&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# Calculamos coeficientes (si no existen ya en memoria)&lt;br /&gt;
# Nota: Aquí SÍ usamos dx_malla&lt;br /&gt;
coefs_totales = construir_coeficientes(N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# GRÁFICAS LANCZOS&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# 1. Aproximación Visual&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    # Aquí NO hace falta dx, solo coeficientes y x&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'Lanczos N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title('Método de Lanczos (Factores Sigma)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# 2. Evolución del Error&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    # Aquí usamos dx SOLO para calcular la integral del error L2&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title('Error en Lanczos vs N')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300  # Fijamos un N alto para tener &amp;quot;espacio&amp;quot; de frecuencias&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999] # Variamos r&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
# Calculamos coeficientes HASTA N_FIJO&lt;br /&gt;
coefs_fijos = construir_coeficientes(N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# GRÁFICA 1: Aproximación Visual (N fijo, r variable)&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
# Usamos un mapa de colores secuencial (Blues) para ver la progresión de r&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Método de Abel variando r (N fijo = {N_FIJO})')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# GRÁFICA 2: Evolución del Error vs r&lt;br /&gt;
# ---------------------------------------------------------&lt;br /&gt;
# Generamos muchos valores de r entre 0.5 y 0.999&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Evolución del Error al aumentar r (N={N_FIJO})')&lt;br /&gt;
plt.xlabel('Valor de r')&lt;br /&gt;
plt.ylabel('Error')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Invertimos el eje X si quieres ver el efecto de acercarse a 1,&lt;br /&gt;
# o simplemente observamos que al acercarse a 1 el error L2 baja pero el Uniforme sube (Gibbs).&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import scipy.integrate&lt;br /&gt;
&lt;br /&gt;
def construir_coeficientes_par(funcion, n_terminos, dx=1e-3):&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(0, 1 + dx/2, dx)&lt;br /&gt;
    y = funcion(x)&lt;br /&gt;
    coeficientes = []&lt;br /&gt;
&lt;br /&gt;
    for k in range(n_terminos):&lt;br /&gt;
        termino_base = np.cos(k * np.pi * x)&lt;br /&gt;
        integrando = 2 * y * termino_base&lt;br /&gt;
        a_k = scipy.integrate.trapezoid(integrando, dx=dx)&lt;br /&gt;
        coeficientes.append(a_k)&lt;br /&gt;
&lt;br /&gt;
    return coeficientes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def reconstruir_serie_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx = (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
        y_approx += a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f_par_extendida(x):&lt;br /&gt;
&lt;br /&gt;
    return np.where(np.abs(x) &amp;lt;= 0.25, 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def calcular_errores_completo(y_real, y_aprox, dx):&lt;br /&gt;
&lt;br /&gt;
    diff = np.abs(y_real - y_aprox)&lt;br /&gt;
    err_l2 = np.sqrt(scipy.integrate.trapezoid(diff**2, dx=dx))&lt;br /&gt;
    err_unif = np.max(diff)&lt;br /&gt;
    return err_l2, err_unif&lt;br /&gt;
&lt;br /&gt;
def reconstruir_cesaro_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    denominador = N + 1&lt;br /&gt;
&lt;br /&gt;
    a0 = coeficientes[0]&lt;br /&gt;
    y_approx += (a0 / 2) * np.ones_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        a_k = coeficientes[k]&lt;br /&gt;
&lt;br /&gt;
        peso = (N - k + 1) / denominador&lt;br /&gt;
&lt;br /&gt;
        y_approx += peso * a_k * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_lanczos_par(coeficientes, x_eval):&lt;br /&gt;
&lt;br /&gt;
    N = len(coeficientes) - 1&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        sigma = np.sinc(k / N)&lt;br /&gt;
        y_approx += sigma * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
def reconstruir_abel_r_variable(coeficientes, x_eval, r):&lt;br /&gt;
&lt;br /&gt;
    y_approx = np.zeros_like(x_eval)&lt;br /&gt;
&lt;br /&gt;
    y_approx += (coeficientes[0] / 2)&lt;br /&gt;
&lt;br /&gt;
    for k in range(1, len(coeficientes)):&lt;br /&gt;
        peso = r**k&lt;br /&gt;
        y_approx += peso * coeficientes[k] * np.cos(k * np.pi * x_eval)&lt;br /&gt;
&lt;br /&gt;
    return y_approx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Fourier&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(12, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_aprox, label=f'N={n}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('f(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_aprox = reconstruir_serie_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_aprox, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Fourier en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Cesaro&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.6)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.magma(np.linspace(0, 0.85, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_cesaro, label=f'N={n}', color=colores[i], linewidth=2)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('S_N(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_cesaro = reconstruir_cesaro_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_cesaro, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Errores de Cesàro en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Gráficas de Lanczos&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_max_calculo = 500&lt;br /&gt;
lista_N_dibujar = [1, 5, 20, 50, 100, 300]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_totales = construir_coeficientes_par(f_par_extendida, N_max_calculo + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.viridis(np.linspace(0, 0.9, len(lista_N_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(lista_N_dibujar):&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_lanczos, label=f'N={n}', color=colores[i])&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Lanczos en [-1, 1]')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
rango_n = np.arange(1, N_max_calculo + 1)&lt;br /&gt;
&lt;br /&gt;
for n in rango_n:&lt;br /&gt;
    coefs_n = coefs_totales[:n+1]&lt;br /&gt;
    y_lanczos = reconstruir_lanczos_par(coefs_n, x_completo)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_lanczos, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(rango_n, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(rango_n, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Lanczos en [-1, 1]')&lt;br /&gt;
plt.xlabel('N (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Gráficas de Abel&lt;br /&gt;
&lt;br /&gt;
dx_malla = 1e-4&lt;br /&gt;
N_FIJO = 300&lt;br /&gt;
lista_r_dibujar = [0.6, 0.8, 0.9, 0.95, 0.99, 0.999]&lt;br /&gt;
&lt;br /&gt;
x_completo = np.arange(-1, 1 + dx_malla/10, dx_malla)&lt;br /&gt;
y_real = f_par_extendida(x_completo)&lt;br /&gt;
&lt;br /&gt;
coefs_fijos = construir_coeficientes_par(f_par_extendida, N_FIJO + 1, dx_malla)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_completo, y_real, 'k-', linewidth=2, label='Función Original', alpha=0.3)&lt;br /&gt;
&lt;br /&gt;
colores = plt.cm.Blues(np.linspace(0.4, 1.0, len(lista_r_dibujar)))&lt;br /&gt;
&lt;br /&gt;
for i, r_val in enumerate(lista_r_dibujar):&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    plt.plot(x_completo, y_abel, label=f'r={r_val}', color=colores[i], linewidth=1.5)&lt;br /&gt;
&lt;br /&gt;
plt.title(f'Gráfica de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('A_r(x)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
r_range = np.linspace(0.5, 0.999, 100)&lt;br /&gt;
&lt;br /&gt;
errores_l2 = []&lt;br /&gt;
errores_inf = []&lt;br /&gt;
&lt;br /&gt;
for r_val in r_range:&lt;br /&gt;
    y_abel = reconstruir_abel_r_variable(coefs_fijos, x_completo, r_val)&lt;br /&gt;
&lt;br /&gt;
    l2, unif = calcular_errores_completo(y_real, y_abel, dx_malla)&lt;br /&gt;
    errores_l2.append(l2)&lt;br /&gt;
    errores_inf.append(unif)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.loglog(r_range, errores_l2, 'b-o', label='Error L2', markersize=4)&lt;br /&gt;
plt.loglog(r_range, errores_inf, 'r-s', label='Error Uniforme', markersize=4)&lt;br /&gt;
plt.title(f'Errores de Abel en [-1, 1]')&lt;br /&gt;
plt.xlabel('r (log)')&lt;br /&gt;
plt.ylabel('Error (log)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, alpha=0.3)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104151</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104151"/>
				<updated>2026-02-18T18:53:49Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoEDP | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104150</id>
		<title>Series de Fourier RAJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_RAJ&amp;diff=104150"/>
				<updated>2026-02-18T18:53:39Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: Página creada con «{{ TrabajoEDP | Series de Fourier. Grupo RAJ| EDP|2025-26 | Rodrigo Gallardo García  Alejandro Cogollor Torres  Javier Martín...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoEDP | Series de Fourier. Grupo RAJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Rodrigo Gallardo García&lt;br /&gt;
&lt;br /&gt;
Alejandro Cogollor Torres&lt;br /&gt;
&lt;br /&gt;
Javier Martín Pérez }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Series de fourier LÁJ.jpeg||800px]]&lt;br /&gt;
[[Archivo:Series de fourier LÁJ.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=EDP-Trabajo_1&amp;diff=104094</id>
		<title>EDP-Trabajo 1</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=EDP-Trabajo_1&amp;diff=104094"/>
				<updated>2026-02-17T08:53:26Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: Página reemplazada por «hola»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;hola&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=EDP-Trabajo_1&amp;diff=104093</id>
		<title>EDP-Trabajo 1</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=EDP-Trabajo_1&amp;diff=104093"/>
				<updated>2026-02-17T08:52:45Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo LÁJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez&lt;br /&gt;
&lt;br /&gt;
Álvaro Moreno Cisneros&lt;br /&gt;
&lt;br /&gt;
Juan Pérez Guerra }}&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=EDP-Trabajo_1&amp;diff=104074</id>
		<title>EDP-Trabajo 1</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=EDP-Trabajo_1&amp;diff=104074"/>
				<updated>2026-02-16T17:23:40Z</updated>
		
		<summary type="html">&lt;p&gt;Alejandro.mates: Página creada con «hola»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;hola&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	</feed>