<?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=%C3%81lvaro+Moreno</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=%C3%81lvaro+Moreno"/>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Especial:Contribuciones/%C3%81lvaro_Moreno"/>
		<updated>2026-04-23T09:11:48Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_Calor_L%C3%81J&amp;diff=104434</id>
		<title>Ecuación del Calor LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_Calor_L%C3%81J&amp;diff=104434"/>
				<updated>2026-04-08T06:43:13Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &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 LÁJ.png||800px]]&lt;br /&gt;
[[Medio:Ecuación del calor LÁJ.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;
from scipy.integrate import trapezoid&lt;br /&gt;
from matplotlib import cm&lt;br /&gt;
&lt;br /&gt;
# Ecuación del calor acotada-----------------------------------------------------------------------&lt;br /&gt;
def Eca_Acotada(L,alpha,n_terms,f):&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Aproxima la solución de la ecuación del calor u_t -alpha * u_xx = 0, con &lt;br /&gt;
    condición inicial f(x) y condiciones frontera dirichlet homogéneas&lt;br /&gt;
&lt;br /&gt;
    Inputs: &lt;br /&gt;
        L: longitud de la barra&lt;br /&gt;
        alpha: constante&lt;br /&gt;
        n_terms: número de términos para la serie de Fourier&lt;br /&gt;
        f: condición inicial&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 1. Preparar la malla con T en el eje &amp;quot;X&amp;quot; y X en el eje &amp;quot;Y&amp;quot;&lt;br /&gt;
    t_plot = np.linspace(0, 0.1, 100)&lt;br /&gt;
    x_plot = np.linspace(0, L, 100)&lt;br /&gt;
    T, X = np.meshgrid(t_plot, x_plot)&lt;br /&gt;
&lt;br /&gt;
    # 2. Cálculo de coeficientes a_n con la fórmula del trapecio&lt;br /&gt;
    x_fine = np.linspace(0, L, 1000)&lt;br /&gt;
    y_init = f(x_fine)&lt;br /&gt;
    a = np.zeros(n_terms + 1)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        integrando = y_init * np.sin(n * np.pi * x_fine / L)&lt;br /&gt;
        a[n] = (2/L) * trapezoid(integrando, x=x_fine)&lt;br /&gt;
&lt;br /&gt;
    # 3. Calcular la solución U(T, X)&lt;br /&gt;
    U = np.zeros_like(T)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        term_exp = np.exp(-alpha * (n * np.pi / L)**2 * T)&lt;br /&gt;
        term_sin = np.sin(n * np.pi * X / L)&lt;br /&gt;
        U += a[n] * term_exp * term_sin&lt;br /&gt;
&lt;br /&gt;
    # 4. Graficar&lt;br /&gt;
    fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
    ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
    # Ahora graficamos T en el primer eje y X en el segundo&lt;br /&gt;
    surf = ax.plot_surface(T, X, U, cmap=cm.inferno, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
    ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
    ax.set_ylabel('Posición (x)')&lt;br /&gt;
    ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
    ax.set_title('Visualización: Tiempo vs Posición')&lt;br /&gt;
    fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
&lt;br /&gt;
    ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parámetros &lt;br /&gt;
L = 1.0        &lt;br /&gt;
alpha = 1.0    &lt;br /&gt;
n_terms = 50   &lt;br /&gt;
&lt;br /&gt;
# Dato inicial&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0.3) &amp;amp; (x &amp;lt;= 0.7), 10.0, 0.0)&lt;br /&gt;
# def f(x):&lt;br /&gt;
#     return 1.0 - 2.0 * np.abs(0.5 - x)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# LLamamos a la función&lt;br /&gt;
Eca_Acotada(L,alpha,n_terms,f)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Ecuación del calor no acotada-----------------------------------------------------------------------&lt;br /&gt;
# Visualizar como la solución fundamental tiende a la delta de Dirac------------------------&lt;br /&gt;
# Parámetros&lt;br /&gt;
alpha = 1.0  # Difusividad térmica&lt;br /&gt;
&lt;br /&gt;
# Definición de la solución fundamental&lt;br /&gt;
def solucion_fundamental(x, t, alpha):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula el valor de la solución fundamental en (x, t).&lt;br /&gt;
    Representa la distribución de calor partiendo de una masa puntual en x=0.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Evitamos división por cero si t=0&lt;br /&gt;
    if t &amp;lt;= 0:&lt;br /&gt;
        return np.zeros_like(x)&lt;br /&gt;
    &lt;br /&gt;
    coeficiente = 1.0 / np.sqrt(4 * np.pi * alpha * t)&lt;br /&gt;
    exponente = - (x**2) / (4 * alpha * t)&lt;br /&gt;
    return coeficiente * np.exp(exponente)&lt;br /&gt;
&lt;br /&gt;
# Configuración de la visualización&lt;br /&gt;
x = np.linspace(-2, 2, 1000)&lt;br /&gt;
# Tiempos que se acercan a cero para ver la Delta de Dirac&lt;br /&gt;
tiempos = [0.1, 0.05, 0.01, 0.005, 0.001] &lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u = solucion_fundamental(x, t, alpha)&lt;br /&gt;
    plt.plot(x, u, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.title('Convergencia de la Solución Fundamental a la Delta de Dirac')&lt;br /&gt;
plt.xlabel('Posición (x)')&lt;br /&gt;
plt.ylabel('Temperatura (u)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, linestyle=':')&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Visualizar la solución fundamental en 3D----------------&lt;br /&gt;
# Parámetros&lt;br /&gt;
alpha = 1.0&lt;br /&gt;
&lt;br /&gt;
# 1. Crear malla de puntos (T en el primer eje, X en el segundo)&lt;br /&gt;
t_plot = np.linspace(0.005, 0.1, 100)&lt;br /&gt;
x_plot = np.linspace(-2, 2, 100)&lt;br /&gt;
T, X = np.meshgrid(t_plot, x_plot) # Invertimos el orden para el intercambio&lt;br /&gt;
&lt;br /&gt;
# 2. Calcular la solución fundamental&lt;br /&gt;
U = (1.0 / np.sqrt(4 * np.pi * alpha * T)) * np.exp(-(X**2) / (4 * alpha * T))&lt;br /&gt;
&lt;br /&gt;
# 3. Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficamos T en el eje X del gráfico, X en el eje Y&lt;br /&gt;
surf = ax.plot_surface(T, X, U, cmap=cm.viridis, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
# Etiquetas corregidas&lt;br /&gt;
ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
ax.set_ylabel('Posición (x)')&lt;br /&gt;
ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
ax.set_title('Núcleo de Calor: Evolución del Pico (t -&amp;gt; 0)')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
&lt;br /&gt;
ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Visualizar solución de la ecuación del calor no acotada----------------&lt;br /&gt;
&lt;br /&gt;
# 1. Definición del núcleo y dato inicial&lt;br /&gt;
def kernel(x, t, alpha=1.0):&lt;br /&gt;
    return (1.0 / np.sqrt(4 * np.pi * alpha * t)) * np.exp(-(x**2) / (4 * alpha * t))&lt;br /&gt;
&lt;br /&gt;
def u0(y):&lt;br /&gt;
    # Dato inicial&lt;br /&gt;
    return np.where((y &amp;gt;= 0) &amp;amp; (y &amp;lt;= 1), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
# 2. Configuración de la malla&lt;br /&gt;
t_range = np.linspace(0.001, 1, 50)  # Eje T&lt;br /&gt;
x_range = np.linspace(-2, 3, 60)      # Eje X&lt;br /&gt;
T, X = np.meshgrid(t_range, x_range)&lt;br /&gt;
&lt;br /&gt;
# Espacio de integración para la convolución (eje y)&lt;br /&gt;
y_int = np.linspace(-4, 5, 500)&lt;br /&gt;
u_initial_values = u0(y_int)&lt;br /&gt;
&lt;br /&gt;
# 3. Cálculo de la superficie U(T, X)&lt;br /&gt;
U = np.zeros_like(X)&lt;br /&gt;
&lt;br /&gt;
for i in range(len(x_range)):&lt;br /&gt;
    for j in range(len(t_range)):&lt;br /&gt;
        curr_x = X[i, j]&lt;br /&gt;
        curr_t = T[i, j]&lt;br /&gt;
        # Realizamos la convolución numérica para cada punto (x, t)&lt;br /&gt;
        integrando = kernel(curr_x - y_int, curr_t) * u_initial_values&lt;br /&gt;
        U[i, j] = trapezoid(integrando, x=y_int)&lt;br /&gt;
&lt;br /&gt;
# 4. Graficar en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficamos con Tiempo en el primer eje y Posición en el segundo&lt;br /&gt;
surf = ax.plot_surface(T, X, U, cmap=cm.plasma, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
ax.set_ylabel('Posición (x)')&lt;br /&gt;
ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
ax.set_title('Solución por Convolución: Disipación de un bloque de calor')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
ax.view_init(elev=30, azim=-130)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Ver como el máximo va disminuyendo a lo largo del tiempo&lt;br /&gt;
maximos = [np.max(U[:, j]) for j in range(len(t_range))]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(8, 4))&lt;br /&gt;
plt.plot(t_range, maximos, color='red', linewidth=2)&lt;br /&gt;
plt.axhline(y=1.0, color='black', linestyle='--', label='Máximo Inicial (t=0)')&lt;br /&gt;
plt.title('Validación del Principio del Máximo')&lt;br /&gt;
plt.xlabel('Tiempo (t)')&lt;br /&gt;
plt.ylabel('Temperatura Máxima alcanzada')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_Calor_L%C3%81J&amp;diff=104433</id>
		<title>Ecuación del Calor LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_Calor_L%C3%81J&amp;diff=104433"/>
				<updated>2026-04-08T06:41:05Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &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 LÁJ.jpeg||800px]]&lt;br /&gt;
[[Medio:Ecuación del calor LÁJ.png | 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;
from scipy.integrate import trapezoid&lt;br /&gt;
from matplotlib import cm&lt;br /&gt;
&lt;br /&gt;
# Ecuación del calor acotada-----------------------------------------------------------------------&lt;br /&gt;
def Eca_Acotada(L,alpha,n_terms,f):&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Aproxima la solución de la ecuación del calor u_t -alpha * u_xx = 0, con &lt;br /&gt;
    condición inicial f(x) y condiciones frontera dirichlet homogéneas&lt;br /&gt;
&lt;br /&gt;
    Inputs: &lt;br /&gt;
        L: longitud de la barra&lt;br /&gt;
        alpha: constante&lt;br /&gt;
        n_terms: número de términos para la serie de Fourier&lt;br /&gt;
        f: condición inicial&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 1. Preparar la malla con T en el eje &amp;quot;X&amp;quot; y X en el eje &amp;quot;Y&amp;quot;&lt;br /&gt;
    t_plot = np.linspace(0, 0.1, 100)&lt;br /&gt;
    x_plot = np.linspace(0, L, 100)&lt;br /&gt;
    T, X = np.meshgrid(t_plot, x_plot)&lt;br /&gt;
&lt;br /&gt;
    # 2. Cálculo de coeficientes a_n con la fórmula del trapecio&lt;br /&gt;
    x_fine = np.linspace(0, L, 1000)&lt;br /&gt;
    y_init = f(x_fine)&lt;br /&gt;
    a = np.zeros(n_terms + 1)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        integrando = y_init * np.sin(n * np.pi * x_fine / L)&lt;br /&gt;
        a[n] = (2/L) * trapezoid(integrando, x=x_fine)&lt;br /&gt;
&lt;br /&gt;
    # 3. Calcular la solución U(T, X)&lt;br /&gt;
    U = np.zeros_like(T)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        term_exp = np.exp(-alpha * (n * np.pi / L)**2 * T)&lt;br /&gt;
        term_sin = np.sin(n * np.pi * X / L)&lt;br /&gt;
        U += a[n] * term_exp * term_sin&lt;br /&gt;
&lt;br /&gt;
    # 4. Graficar&lt;br /&gt;
    fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
    ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
    # Ahora graficamos T en el primer eje y X en el segundo&lt;br /&gt;
    surf = ax.plot_surface(T, X, U, cmap=cm.inferno, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
    ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
    ax.set_ylabel('Posición (x)')&lt;br /&gt;
    ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
    ax.set_title('Visualización: Tiempo vs Posición')&lt;br /&gt;
    fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
&lt;br /&gt;
    ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parámetros &lt;br /&gt;
L = 1.0        &lt;br /&gt;
alpha = 1.0    &lt;br /&gt;
n_terms = 50   &lt;br /&gt;
&lt;br /&gt;
# Dato inicial&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0.3) &amp;amp; (x &amp;lt;= 0.7), 10.0, 0.0)&lt;br /&gt;
# def f(x):&lt;br /&gt;
#     return 1.0 - 2.0 * np.abs(0.5 - x)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# LLamamos a la función&lt;br /&gt;
Eca_Acotada(L,alpha,n_terms,f)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Ecuación del calor no acotada-----------------------------------------------------------------------&lt;br /&gt;
# Visualizar como la solución fundamental tiende a la delta de Dirac------------------------&lt;br /&gt;
# Parámetros&lt;br /&gt;
alpha = 1.0  # Difusividad térmica&lt;br /&gt;
&lt;br /&gt;
# Definición de la solución fundamental&lt;br /&gt;
def solucion_fundamental(x, t, alpha):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula el valor de la solución fundamental en (x, t).&lt;br /&gt;
    Representa la distribución de calor partiendo de una masa puntual en x=0.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Evitamos división por cero si t=0&lt;br /&gt;
    if t &amp;lt;= 0:&lt;br /&gt;
        return np.zeros_like(x)&lt;br /&gt;
    &lt;br /&gt;
    coeficiente = 1.0 / np.sqrt(4 * np.pi * alpha * t)&lt;br /&gt;
    exponente = - (x**2) / (4 * alpha * t)&lt;br /&gt;
    return coeficiente * np.exp(exponente)&lt;br /&gt;
&lt;br /&gt;
# Configuración de la visualización&lt;br /&gt;
x = np.linspace(-2, 2, 1000)&lt;br /&gt;
# Tiempos que se acercan a cero para ver la Delta de Dirac&lt;br /&gt;
tiempos = [0.1, 0.05, 0.01, 0.005, 0.001] &lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u = solucion_fundamental(x, t, alpha)&lt;br /&gt;
    plt.plot(x, u, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.title('Convergencia de la Solución Fundamental a la Delta de Dirac')&lt;br /&gt;
plt.xlabel('Posición (x)')&lt;br /&gt;
plt.ylabel('Temperatura (u)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, linestyle=':')&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Visualizar la solución fundamental en 3D----------------&lt;br /&gt;
# Parámetros&lt;br /&gt;
alpha = 1.0&lt;br /&gt;
&lt;br /&gt;
# 1. Crear malla de puntos (T en el primer eje, X en el segundo)&lt;br /&gt;
t_plot = np.linspace(0.005, 0.1, 100)&lt;br /&gt;
x_plot = np.linspace(-2, 2, 100)&lt;br /&gt;
T, X = np.meshgrid(t_plot, x_plot) # Invertimos el orden para el intercambio&lt;br /&gt;
&lt;br /&gt;
# 2. Calcular la solución fundamental&lt;br /&gt;
U = (1.0 / np.sqrt(4 * np.pi * alpha * T)) * np.exp(-(X**2) / (4 * alpha * T))&lt;br /&gt;
&lt;br /&gt;
# 3. Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficamos T en el eje X del gráfico, X en el eje Y&lt;br /&gt;
surf = ax.plot_surface(T, X, U, cmap=cm.viridis, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
# Etiquetas corregidas&lt;br /&gt;
ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
ax.set_ylabel('Posición (x)')&lt;br /&gt;
ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
ax.set_title('Núcleo de Calor: Evolución del Pico (t -&amp;gt; 0)')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
&lt;br /&gt;
ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Visualizar solución de la ecuación del calor no acotada----------------&lt;br /&gt;
&lt;br /&gt;
# 1. Definición del núcleo y dato inicial&lt;br /&gt;
def kernel(x, t, alpha=1.0):&lt;br /&gt;
    return (1.0 / np.sqrt(4 * np.pi * alpha * t)) * np.exp(-(x**2) / (4 * alpha * t))&lt;br /&gt;
&lt;br /&gt;
def u0(y):&lt;br /&gt;
    # Dato inicial&lt;br /&gt;
    return np.where((y &amp;gt;= 0) &amp;amp; (y &amp;lt;= 1), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
# 2. Configuración de la malla&lt;br /&gt;
t_range = np.linspace(0.001, 1, 50)  # Eje T&lt;br /&gt;
x_range = np.linspace(-2, 3, 60)      # Eje X&lt;br /&gt;
T, X = np.meshgrid(t_range, x_range)&lt;br /&gt;
&lt;br /&gt;
# Espacio de integración para la convolución (eje y)&lt;br /&gt;
y_int = np.linspace(-4, 5, 500)&lt;br /&gt;
u_initial_values = u0(y_int)&lt;br /&gt;
&lt;br /&gt;
# 3. Cálculo de la superficie U(T, X)&lt;br /&gt;
U = np.zeros_like(X)&lt;br /&gt;
&lt;br /&gt;
for i in range(len(x_range)):&lt;br /&gt;
    for j in range(len(t_range)):&lt;br /&gt;
        curr_x = X[i, j]&lt;br /&gt;
        curr_t = T[i, j]&lt;br /&gt;
        # Realizamos la convolución numérica para cada punto (x, t)&lt;br /&gt;
        integrando = kernel(curr_x - y_int, curr_t) * u_initial_values&lt;br /&gt;
        U[i, j] = trapezoid(integrando, x=y_int)&lt;br /&gt;
&lt;br /&gt;
# 4. Graficar en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficamos con Tiempo en el primer eje y Posición en el segundo&lt;br /&gt;
surf = ax.plot_surface(T, X, U, cmap=cm.plasma, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
ax.set_ylabel('Posición (x)')&lt;br /&gt;
ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
ax.set_title('Solución por Convolución: Disipación de un bloque de calor')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
ax.view_init(elev=30, azim=-130)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Ver como el máximo va disminuyendo a lo largo del tiempo&lt;br /&gt;
maximos = [np.max(U[:, j]) for j in range(len(t_range))]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(8, 4))&lt;br /&gt;
plt.plot(t_range, maximos, color='red', linewidth=2)&lt;br /&gt;
plt.axhline(y=1.0, color='black', linestyle='--', label='Máximo Inicial (t=0)')&lt;br /&gt;
plt.title('Validación del Principio del Máximo')&lt;br /&gt;
plt.xlabel('Tiempo (t)')&lt;br /&gt;
plt.ylabel('Temperatura Máxima alcanzada')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Ecuaci%C3%B3n_del_calor_L%C3%81J.png&amp;diff=104432</id>
		<title>Archivo:Ecuación del calor LÁJ.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Ecuaci%C3%B3n_del_calor_L%C3%81J.png&amp;diff=104432"/>
				<updated>2026-04-08T06:40:39Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Ecuaci%C3%B3n_del_calor_L%C3%81J.pdf&amp;diff=104431</id>
		<title>Archivo:Ecuación del calor LÁJ.pdf</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Ecuaci%C3%B3n_del_calor_L%C3%81J.pdf&amp;diff=104431"/>
				<updated>2026-04-08T06:37:10Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: Trabajo ecuación del calor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Trabajo ecuación del calor&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_Calor_L%C3%81J&amp;diff=104430</id>
		<title>Ecuación del Calor LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_Calor_L%C3%81J&amp;diff=104430"/>
				<updated>2026-04-08T06:35:43Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: 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 LÁJ.jpeg||800px]]&lt;br /&gt;
[[Medio:Ecuación del calor LÁJ.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;
from scipy.integrate import trapezoid&lt;br /&gt;
from matplotlib import cm&lt;br /&gt;
&lt;br /&gt;
# Ecuación del calor acotada-----------------------------------------------------------------------&lt;br /&gt;
def Eca_Acotada(L,alpha,n_terms,f):&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Aproxima la solución de la ecuación del calor u_t -alpha * u_xx = 0, con &lt;br /&gt;
    condición inicial f(x) y condiciones frontera dirichlet homogéneas&lt;br /&gt;
&lt;br /&gt;
    Inputs: &lt;br /&gt;
        L: longitud de la barra&lt;br /&gt;
        alpha: constante&lt;br /&gt;
        n_terms: número de términos para la serie de Fourier&lt;br /&gt;
        f: condición inicial&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 1. Preparar la malla con T en el eje &amp;quot;X&amp;quot; y X en el eje &amp;quot;Y&amp;quot;&lt;br /&gt;
    t_plot = np.linspace(0, 0.1, 100)&lt;br /&gt;
    x_plot = np.linspace(0, L, 100)&lt;br /&gt;
    T, X = np.meshgrid(t_plot, x_plot)&lt;br /&gt;
&lt;br /&gt;
    # 2. Cálculo de coeficientes a_n con la fórmula del trapecio&lt;br /&gt;
    x_fine = np.linspace(0, L, 1000)&lt;br /&gt;
    y_init = f(x_fine)&lt;br /&gt;
    a = np.zeros(n_terms + 1)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        integrando = y_init * np.sin(n * np.pi * x_fine / L)&lt;br /&gt;
        a[n] = (2/L) * trapezoid(integrando, x=x_fine)&lt;br /&gt;
&lt;br /&gt;
    # 3. Calcular la solución U(T, X)&lt;br /&gt;
    U = np.zeros_like(T)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        term_exp = np.exp(-alpha * (n * np.pi / L)**2 * T)&lt;br /&gt;
        term_sin = np.sin(n * np.pi * X / L)&lt;br /&gt;
        U += a[n] * term_exp * term_sin&lt;br /&gt;
&lt;br /&gt;
    # 4. Graficar&lt;br /&gt;
    fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
    ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
    # Ahora graficamos T en el primer eje y X en el segundo&lt;br /&gt;
    surf = ax.plot_surface(T, X, U, cmap=cm.inferno, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
    ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
    ax.set_ylabel('Posición (x)')&lt;br /&gt;
    ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
    ax.set_title('Visualización: Tiempo vs Posición')&lt;br /&gt;
    fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
&lt;br /&gt;
    ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parámetros &lt;br /&gt;
L = 1.0        &lt;br /&gt;
alpha = 1.0    &lt;br /&gt;
n_terms = 50   &lt;br /&gt;
&lt;br /&gt;
# Dato inicial&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0.3) &amp;amp; (x &amp;lt;= 0.7), 10.0, 0.0)&lt;br /&gt;
# def f(x):&lt;br /&gt;
#     return 1.0 - 2.0 * np.abs(0.5 - x)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# LLamamos a la función&lt;br /&gt;
Eca_Acotada(L,alpha,n_terms,f)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Ecuación del calor no acotada-----------------------------------------------------------------------&lt;br /&gt;
# Visualizar como la solución fundamental tiende a la delta de Dirac------------------------&lt;br /&gt;
# Parámetros&lt;br /&gt;
alpha = 1.0  # Difusividad térmica&lt;br /&gt;
&lt;br /&gt;
# Definición de la solución fundamental&lt;br /&gt;
def solucion_fundamental(x, t, alpha):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula el valor de la solución fundamental en (x, t).&lt;br /&gt;
    Representa la distribución de calor partiendo de una masa puntual en x=0.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    # Evitamos división por cero si t=0&lt;br /&gt;
    if t &amp;lt;= 0:&lt;br /&gt;
        return np.zeros_like(x)&lt;br /&gt;
    &lt;br /&gt;
    coeficiente = 1.0 / np.sqrt(4 * np.pi * alpha * t)&lt;br /&gt;
    exponente = - (x**2) / (4 * alpha * t)&lt;br /&gt;
    return coeficiente * np.exp(exponente)&lt;br /&gt;
&lt;br /&gt;
# Configuración de la visualización&lt;br /&gt;
x = np.linspace(-2, 2, 1000)&lt;br /&gt;
# Tiempos que se acercan a cero para ver la Delta de Dirac&lt;br /&gt;
tiempos = [0.1, 0.05, 0.01, 0.005, 0.001] &lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u = solucion_fundamental(x, t, alpha)&lt;br /&gt;
    plt.plot(x, u, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.title('Convergencia de la Solución Fundamental a la Delta de Dirac')&lt;br /&gt;
plt.xlabel('Posición (x)')&lt;br /&gt;
plt.ylabel('Temperatura (u)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, linestyle=':')&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Visualizar la solución fundamental en 3D----------------&lt;br /&gt;
# Parámetros&lt;br /&gt;
alpha = 1.0&lt;br /&gt;
&lt;br /&gt;
# 1. Crear malla de puntos (T en el primer eje, X en el segundo)&lt;br /&gt;
t_plot = np.linspace(0.005, 0.1, 100)&lt;br /&gt;
x_plot = np.linspace(-2, 2, 100)&lt;br /&gt;
T, X = np.meshgrid(t_plot, x_plot) # Invertimos el orden para el intercambio&lt;br /&gt;
&lt;br /&gt;
# 2. Calcular la solución fundamental&lt;br /&gt;
U = (1.0 / np.sqrt(4 * np.pi * alpha * T)) * np.exp(-(X**2) / (4 * alpha * T))&lt;br /&gt;
&lt;br /&gt;
# 3. Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficamos T en el eje X del gráfico, X en el eje Y&lt;br /&gt;
surf = ax.plot_surface(T, X, U, cmap=cm.viridis, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
# Etiquetas corregidas&lt;br /&gt;
ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
ax.set_ylabel('Posición (x)')&lt;br /&gt;
ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
ax.set_title('Núcleo de Calor: Evolución del Pico (t -&amp;gt; 0)')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
&lt;br /&gt;
ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Visualizar solución de la ecuación del calor no acotada----------------&lt;br /&gt;
&lt;br /&gt;
# 1. Definición del núcleo y dato inicial&lt;br /&gt;
def kernel(x, t, alpha=1.0):&lt;br /&gt;
    return (1.0 / np.sqrt(4 * np.pi * alpha * t)) * np.exp(-(x**2) / (4 * alpha * t))&lt;br /&gt;
&lt;br /&gt;
def u0(y):&lt;br /&gt;
    # Dato inicial&lt;br /&gt;
    return np.where((y &amp;gt;= 0) &amp;amp; (y &amp;lt;= 1), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
# 2. Configuración de la malla&lt;br /&gt;
t_range = np.linspace(0.001, 1, 50)  # Eje T&lt;br /&gt;
x_range = np.linspace(-2, 3, 60)      # Eje X&lt;br /&gt;
T, X = np.meshgrid(t_range, x_range)&lt;br /&gt;
&lt;br /&gt;
# Espacio de integración para la convolución (eje y)&lt;br /&gt;
y_int = np.linspace(-4, 5, 500)&lt;br /&gt;
u_initial_values = u0(y_int)&lt;br /&gt;
&lt;br /&gt;
# 3. Cálculo de la superficie U(T, X)&lt;br /&gt;
U = np.zeros_like(X)&lt;br /&gt;
&lt;br /&gt;
for i in range(len(x_range)):&lt;br /&gt;
    for j in range(len(t_range)):&lt;br /&gt;
        curr_x = X[i, j]&lt;br /&gt;
        curr_t = T[i, j]&lt;br /&gt;
        # Realizamos la convolución numérica para cada punto (x, t)&lt;br /&gt;
        integrando = kernel(curr_x - y_int, curr_t) * u_initial_values&lt;br /&gt;
        U[i, j] = trapezoid(integrando, x=y_int)&lt;br /&gt;
&lt;br /&gt;
# 4. Graficar en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficamos con Tiempo en el primer eje y Posición en el segundo&lt;br /&gt;
surf = ax.plot_surface(T, X, U, cmap=cm.plasma, linewidth=0, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Tiempo (t)')&lt;br /&gt;
ax.set_ylabel('Posición (x)')&lt;br /&gt;
ax.set_zlabel('Temperatura (u)')&lt;br /&gt;
ax.set_title('Solución por Convolución: Disipación de un bloque de calor')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
ax.view_init(elev=30, azim=-130)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Ver como el máximo va disminuyendo a lo largo del tiempo&lt;br /&gt;
maximos = [np.max(U[:, j]) for j in range(len(t_range))]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(8, 4))&lt;br /&gt;
plt.plot(t_range, maximos, color='red', linewidth=2)&lt;br /&gt;
plt.axhline(y=1.0, color='black', linestyle='--', label='Máximo Inicial (t=0)')&lt;br /&gt;
plt.title('Validación del Principio del Máximo')&lt;br /&gt;
plt.xlabel('Tiempo (t)')&lt;br /&gt;
plt.ylabel('Temperatura Máxima alcanzada')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104364</id>
		<title>Series de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104364"/>
				<updated>2026-02-19T08:41:39Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &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;
[[Archivo:Series de fourier LÁJ.jpeg||800px]]&lt;br /&gt;
[[Medio:Series de fourier LÁJ corregido.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. La función serie_de_fourier_definitiva aproxima una función dada en un intervalo mediante una serie de Fourier, la función comparar_fourier_cesaro es la que da las gráficas de la última parte y la función base_trigonométrica aunque no se ha incluído en el póster ilustra como funciona la base trigonométrica.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import trapezoid&lt;br /&gt;
&lt;br /&gt;
def base_trigonometrica(n):&lt;br /&gt;
	#Puntos donde se grafica&lt;br /&gt;
	x = np.linspace(-1,1,1000)&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
&lt;br /&gt;
	#Primer término de la serie&lt;br /&gt;
	plt.plot(x, np.full_like(x, 0.5), label='1/2 (n=0)', linewidth=2, color='black')&lt;br /&gt;
&lt;br /&gt;
	#Términos trigonométricos&lt;br /&gt;
	for n in range(1,n):&lt;br /&gt;
		plt.plot(x, np.cos(n*np.pi*x), color = 'r', linestyle='-')&lt;br /&gt;
		plt.plot(x, np.sin(n*np.pi*x), color = 'b', linestyle='-')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Primeros términos de la base trigonométrica {1/2, cos(nπx), sin(nπx)}')&lt;br /&gt;
	plt.xlabel('x')&lt;br /&gt;
	plt.ylabel('f(x)')&lt;br /&gt;
	plt.axhline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.axvline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.grid(True, linestyle=':', alpha=0.6)&lt;br /&gt;
	plt.legend(['1/2','cos','sin'], loc = 'upper right', bbox_to_anchor = (1,1))&lt;br /&gt;
	plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
	# Mostrar resultado&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def serie_fourier_definitiva(f,L,n):&lt;br /&gt;
&lt;br /&gt;
	#Puntos donde se grafica y sus valores exactos&lt;br /&gt;
	x = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
	f_ev = f(x)&lt;br /&gt;
&lt;br /&gt;
	def serie_fourier(funcion,x_val,n_terms):&lt;br /&gt;
		fn = np.zeros_like(x_val)&lt;br /&gt;
		f_eval = funcion(x_val)&lt;br /&gt;
&lt;br /&gt;
		c0 = trapezoid(2/L * f_eval,x_val)&lt;br /&gt;
		fn = c0/2&lt;br /&gt;
		for k in range(1,n_terms+1):&lt;br /&gt;
			#Coeficientes&lt;br /&gt;
			cn = trapezoid(2/L * f_eval * np.cos(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
			dn = trapezoid(2/L * f_eval * np.sin(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
&lt;br /&gt;
			#Sumar términos&lt;br /&gt;
			fn +=  cn* np.cos(2*k*np.pi*x_val/L) + dn * np.sin(2*k*np.pi*x_val/L)&lt;br /&gt;
&lt;br /&gt;
		return fn&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)&lt;br /&gt;
&lt;br /&gt;
	for i in n:&lt;br /&gt;
		fn_ev = serie_fourier(f,x,i)&lt;br /&gt;
		plt.plot(x,fn_ev, label=f'n = {i}')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Aproximación de f(x) mediante serie de Fourier')&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;
	#Cálculo de errores&lt;br /&gt;
	n_error = []&lt;br /&gt;
	for i in range(1,100):&lt;br /&gt;
		n_error.append(i)&lt;br /&gt;
&lt;br /&gt;
	error_l2 = []&lt;br /&gt;
	error_inf = []&lt;br /&gt;
&lt;br /&gt;
	for i in n_error:&lt;br /&gt;
		f_n = serie_fourier(f,x,i)&lt;br /&gt;
		dif = f_ev - f_n&lt;br /&gt;
&lt;br /&gt;
		error_l2.append(np.sqrt(trapezoid(dif**2,x)))&lt;br /&gt;
		error_inf.append(round(float(np.max(np.abs(dif))),6))&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(n_error,error_l2, linewidth=2)&lt;br /&gt;
	plt.title('Error $L^2$')&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;
def comparar_fourier_cesaro(func, L, n_terms, nombre_funcion=&amp;quot;Función&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula y grafica la aproximación de Fourier estándar vs Sumas de Cesàro.&lt;br /&gt;
    &lt;br /&gt;
    func: Función original a aproximar.&lt;br /&gt;
    L: Longitud del intervalo [-L/2, L/2].&lt;br /&gt;
    n_terms: Número máximo de coeficientes (n).&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def get_coefficients(n):&lt;br /&gt;
        # Integración por método del trapecio como se indica en el documento &lt;br /&gt;
        x_int = np.linspace(-L/2, L/2, 2000)&lt;br /&gt;
        y_int = func(x_int)&lt;br /&gt;
        &lt;br /&gt;
        # Coeficiente c0&lt;br /&gt;
        c0 = (2/L) * trapezoid(y_int, x_int)&lt;br /&gt;
        &lt;br /&gt;
        an = []&lt;br /&gt;
        bn = []&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            cos_term = np.cos(2 * np.pi * i * x_int / L)&lt;br /&gt;
            sin_term = np.sin(2 * np.pi * i * x_int / L)&lt;br /&gt;
            an.append((2/L) * trapezoid(y_int * cos_term, x_int))&lt;br /&gt;
            bn.append((2/L) * trapezoid(y_int * sin_term, x_int))&lt;br /&gt;
        return c0, an, bn&lt;br /&gt;
&lt;br /&gt;
    # Obtener coeficientes&lt;br /&gt;
    c0, an, bn = get_coefficients(n_terms)&lt;br /&gt;
    &lt;br /&gt;
    # Construir sumas parciales S_k para Cesàro&lt;br /&gt;
    x_range = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
    sumas_parciales = []&lt;br /&gt;
    current_sum = np.full_like(x_range, c0 / 2)&lt;br /&gt;
    sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n_terms):&lt;br /&gt;
        term = an[i] * np.cos(2 * np.pi * (i+1) * x_range / L) + \&lt;br /&gt;
               bn[i] * np.sin(2 * np.pi * (i+1) * x_range / L)&lt;br /&gt;
        current_sum += term&lt;br /&gt;
        sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    # Calcular Suma de Cesàro (Promedio de las sumas parciales)&lt;br /&gt;
    sigma_n = np.mean(sumas_parciales, axis=0)&lt;br /&gt;
    &lt;br /&gt;
    # Gráfica&lt;br /&gt;
    plt.figure(figsize=(12, 6))&lt;br /&gt;
    plt.plot(x_range, func(x_range), 'k--', label=f&amp;quot;Original: {nombre_funcion}&amp;quot;, alpha=0.6)&lt;br /&gt;
    plt.plot(x_range, current_sum, label=f&amp;quot;Fourier Estándar (n={n_terms})&amp;quot;, color='red', alpha=0.5)&lt;br /&gt;
    plt.plot(x_range, sigma_n, label=f&amp;quot;Suma de Cesàro (n={n_terms})&amp;quot;, color='blue', linewidth=2)&lt;br /&gt;
    &lt;br /&gt;
    plt.title(f&amp;quot;Aproximación de {nombre_funcion}: Fourier vs Cesàro&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    plt.grid(True, linestyle='--', alpha=0.7)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Lo que se ejecuta---------------------------------------------------------&lt;br /&gt;
base_trigonometrica(6)&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
	lista = []&lt;br /&gt;
	for i in x:&lt;br /&gt;
		if i &amp;lt; 0:&lt;br /&gt;
			lista.append(0)&lt;br /&gt;
		else:&lt;br /&gt;
			lista.append(1)&lt;br /&gt;
	return np.array(lista)&lt;br /&gt;
&lt;br /&gt;
def MW(x):&lt;br /&gt;
	n = 200&lt;br /&gt;
	a = 1/2&lt;br /&gt;
	b = 13&lt;br /&gt;
&lt;br /&gt;
	suma = 0&lt;br /&gt;
	for i in range(n):&lt;br /&gt;
		suma += a**i * np.cos(b**i * np.pi*x)&lt;br /&gt;
&lt;br /&gt;
	return suma&lt;br /&gt;
&lt;br /&gt;
def g(x):&lt;br /&gt;
	return x**2&lt;br /&gt;
&lt;br /&gt;
serie_fourier_definitiva(f,10,[1,5,10,100])&lt;br /&gt;
comparar_fourier_cesaro(f, 10, 50, &amp;quot;Función Discontinua (Escalón)&amp;quot;)&lt;br /&gt;
comparar_fourier_cesaro(MW, 10, 100, &amp;quot;Monstruo de Weierstrass&amp;quot;)&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Series_de_fourier_L%C3%81J_corregido.pdf&amp;diff=104363</id>
		<title>Archivo:Series de fourier LÁJ corregido.pdf</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Series_de_fourier_L%C3%81J_corregido.pdf&amp;diff=104363"/>
				<updated>2026-02-19T08:37:38Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104072</id>
		<title>Series de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104072"/>
				<updated>2026-02-16T16:34:59Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &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;
[[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;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. La función serie_de_fourier_definitiva aproxima una función dada en un intervalo mediante una serie de Fourier, la función comparar_fourier_cesaro es la que da las gráficas de la última parte y la función base_trigonométrica aunque no se ha incluído en el póster ilustra como funciona la base trigonométrica.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import trapezoid&lt;br /&gt;
&lt;br /&gt;
def base_trigonometrica(n):&lt;br /&gt;
	#Puntos donde se grafica&lt;br /&gt;
	x = np.linspace(-1,1,1000)&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
&lt;br /&gt;
	#Primer término de la serie&lt;br /&gt;
	plt.plot(x, np.full_like(x, 0.5), label='1/2 (n=0)', linewidth=2, color='black')&lt;br /&gt;
&lt;br /&gt;
	#Términos trigonométricos&lt;br /&gt;
	for n in range(1,n):&lt;br /&gt;
		plt.plot(x, np.cos(n*np.pi*x), color = 'r', linestyle='-')&lt;br /&gt;
		plt.plot(x, np.sin(n*np.pi*x), color = 'b', linestyle='-')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Primeros términos de la base trigonométrica {1/2, cos(nπx), sin(nπx)}')&lt;br /&gt;
	plt.xlabel('x')&lt;br /&gt;
	plt.ylabel('f(x)')&lt;br /&gt;
	plt.axhline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.axvline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.grid(True, linestyle=':', alpha=0.6)&lt;br /&gt;
	plt.legend(['1/2','cos','sin'], loc = 'upper right', bbox_to_anchor = (1,1))&lt;br /&gt;
	plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
	# Mostrar resultado&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def serie_fourier_definitiva(f,L,n):&lt;br /&gt;
&lt;br /&gt;
	#Puntos donde se grafica y sus valores exactos&lt;br /&gt;
	x = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
	f_ev = f(x)&lt;br /&gt;
&lt;br /&gt;
	def serie_fourier(funcion,x_val,n_terms):&lt;br /&gt;
		fn = np.zeros_like(x_val)&lt;br /&gt;
		f_eval = funcion(x_val)&lt;br /&gt;
&lt;br /&gt;
		c0 = trapezoid(2/L * f_eval,x_val)&lt;br /&gt;
		fn = c0/2&lt;br /&gt;
		for k in range(1,n_terms+1):&lt;br /&gt;
			#Coeficientes&lt;br /&gt;
			cn = trapezoid(2/L * f_eval * np.cos(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
			dn = trapezoid(2/L * f_eval * np.sin(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
&lt;br /&gt;
			#Sumar términos&lt;br /&gt;
			fn +=  cn* np.cos(2*k*np.pi*x_val/L) + dn * np.sin(2*k*np.pi*x_val/L)&lt;br /&gt;
&lt;br /&gt;
		return fn&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)&lt;br /&gt;
&lt;br /&gt;
	for i in n:&lt;br /&gt;
		fn_ev = serie_fourier(f,x,i)&lt;br /&gt;
		plt.plot(x,fn_ev, label=f'n = {i}')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Aproximación de f(x) mediante serie de Fourier')&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;
	#Cálculo de errores&lt;br /&gt;
	n_error = []&lt;br /&gt;
	for i in range(1,100):&lt;br /&gt;
		n_error.append(i)&lt;br /&gt;
&lt;br /&gt;
	error_l2 = []&lt;br /&gt;
	error_inf = []&lt;br /&gt;
&lt;br /&gt;
	for i in n_error:&lt;br /&gt;
		f_n = serie_fourier(f,x,i)&lt;br /&gt;
		dif = f_ev - f_n&lt;br /&gt;
&lt;br /&gt;
		error_l2.append(np.sqrt(trapezoid(dif**2,x)))&lt;br /&gt;
		error_inf.append(round(float(np.max(np.abs(dif))),6))&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(n_error,error_l2, linewidth=2)&lt;br /&gt;
	plt.title('Error $L^2$')&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;
def comparar_fourier_cesaro(func, L, n_terms, nombre_funcion=&amp;quot;Función&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula y grafica la aproximación de Fourier estándar vs Sumas de Cesàro.&lt;br /&gt;
    &lt;br /&gt;
    func: Función original a aproximar.&lt;br /&gt;
    L: Longitud del intervalo [-L/2, L/2].&lt;br /&gt;
    n_terms: Número máximo de coeficientes (n).&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def get_coefficients(n):&lt;br /&gt;
        # Integración por método del trapecio como se indica en el documento &lt;br /&gt;
        x_int = np.linspace(-L/2, L/2, 2000)&lt;br /&gt;
        y_int = func(x_int)&lt;br /&gt;
        &lt;br /&gt;
        # Coeficiente c0&lt;br /&gt;
        c0 = (2/L) * trapezoid(y_int, x_int)&lt;br /&gt;
        &lt;br /&gt;
        an = []&lt;br /&gt;
        bn = []&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            cos_term = np.cos(2 * np.pi * i * x_int / L)&lt;br /&gt;
            sin_term = np.sin(2 * np.pi * i * x_int / L)&lt;br /&gt;
            an.append((2/L) * trapezoid(y_int * cos_term, x_int))&lt;br /&gt;
            bn.append((2/L) * trapezoid(y_int * sin_term, x_int))&lt;br /&gt;
        return c0, an, bn&lt;br /&gt;
&lt;br /&gt;
    # Obtener coeficientes&lt;br /&gt;
    c0, an, bn = get_coefficients(n_terms)&lt;br /&gt;
    &lt;br /&gt;
    # Construir sumas parciales S_k para Cesàro&lt;br /&gt;
    x_range = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
    sumas_parciales = []&lt;br /&gt;
    current_sum = np.full_like(x_range, c0 / 2)&lt;br /&gt;
    sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n_terms):&lt;br /&gt;
        term = an[i] * np.cos(2 * np.pi * (i+1) * x_range / L) + \&lt;br /&gt;
               bn[i] * np.sin(2 * np.pi * (i+1) * x_range / L)&lt;br /&gt;
        current_sum += term&lt;br /&gt;
        sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    # Calcular Suma de Cesàro (Promedio de las sumas parciales)&lt;br /&gt;
    sigma_n = np.mean(sumas_parciales, axis=0)&lt;br /&gt;
    &lt;br /&gt;
    # Gráfica&lt;br /&gt;
    plt.figure(figsize=(12, 6))&lt;br /&gt;
    plt.plot(x_range, func(x_range), 'k--', label=f&amp;quot;Original: {nombre_funcion}&amp;quot;, alpha=0.6)&lt;br /&gt;
    plt.plot(x_range, current_sum, label=f&amp;quot;Fourier Estándar (n={n_terms})&amp;quot;, color='red', alpha=0.5)&lt;br /&gt;
    plt.plot(x_range, sigma_n, label=f&amp;quot;Suma de Cesàro (n={n_terms})&amp;quot;, color='blue', linewidth=2)&lt;br /&gt;
    &lt;br /&gt;
    plt.title(f&amp;quot;Aproximación de {nombre_funcion}: Fourier vs Cesàro&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    plt.grid(True, linestyle='--', alpha=0.7)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Lo que se ejecuta---------------------------------------------------------&lt;br /&gt;
base_trigonometrica(6)&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
	lista = []&lt;br /&gt;
	for i in x:&lt;br /&gt;
		if i &amp;lt; 0:&lt;br /&gt;
			lista.append(0)&lt;br /&gt;
		else:&lt;br /&gt;
			lista.append(1)&lt;br /&gt;
	return np.array(lista)&lt;br /&gt;
&lt;br /&gt;
def MW(x):&lt;br /&gt;
	n = 200&lt;br /&gt;
	a = 1/2&lt;br /&gt;
	b = 13&lt;br /&gt;
&lt;br /&gt;
	suma = 0&lt;br /&gt;
	for i in range(n):&lt;br /&gt;
		suma += a**i * np.cos(b**i * np.pi*x)&lt;br /&gt;
&lt;br /&gt;
	return suma&lt;br /&gt;
&lt;br /&gt;
def g(x):&lt;br /&gt;
	return x**2&lt;br /&gt;
&lt;br /&gt;
serie_fourier_definitiva(f,10,[1,5,10,100])&lt;br /&gt;
comparar_fourier_cesaro(f, 10, 50, &amp;quot;Función Discontinua (Escalón)&amp;quot;)&lt;br /&gt;
comparar_fourier_cesaro(MW, 10, 100, &amp;quot;Monstruo de Weierstrass&amp;quot;)&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Serie_de_Fourier_L%C3%81J&amp;diff=104071</id>
		<title>Serie de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Serie_de_Fourier_L%C3%81J&amp;diff=104071"/>
				<updated>2026-02-16T16:33:30Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: Álvaro Moreno trasladó la página Serie de Fourier LÁJ a Series de Fourier LÁJ: Errata en el título&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECCIÓN [[Series de Fourier LÁJ]]&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104070</id>
		<title>Series de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104070"/>
				<updated>2026-02-16T16:33:30Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: Álvaro Moreno trasladó la página Serie de Fourier LÁJ a Series de Fourier LÁJ: Errata en el título&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, Álvaro Moreno Cisneros, Juan Pérez Guerra }}&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;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. La función serie_de_fourier_definitiva aproxima una función dada en un intervalo mediante una serie de Fourier, la función comparar_fourier_cesaro es la que da las gráficas de la última parte y la función base_trigonométrica aunque no se ha incluído en el póster ilustra como funciona la base trigonométrica.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import trapezoid&lt;br /&gt;
&lt;br /&gt;
def base_trigonometrica(n):&lt;br /&gt;
	#Puntos donde se grafica&lt;br /&gt;
	x = np.linspace(-1,1,1000)&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
&lt;br /&gt;
	#Primer término de la serie&lt;br /&gt;
	plt.plot(x, np.full_like(x, 0.5), label='1/2 (n=0)', linewidth=2, color='black')&lt;br /&gt;
&lt;br /&gt;
	#Términos trigonométricos&lt;br /&gt;
	for n in range(1,n):&lt;br /&gt;
		plt.plot(x, np.cos(n*np.pi*x), color = 'r', linestyle='-')&lt;br /&gt;
		plt.plot(x, np.sin(n*np.pi*x), color = 'b', linestyle='-')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Primeros términos de la base trigonométrica {1/2, cos(nπx), sin(nπx)}')&lt;br /&gt;
	plt.xlabel('x')&lt;br /&gt;
	plt.ylabel('f(x)')&lt;br /&gt;
	plt.axhline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.axvline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.grid(True, linestyle=':', alpha=0.6)&lt;br /&gt;
	plt.legend(['1/2','cos','sin'], loc = 'upper right', bbox_to_anchor = (1,1))&lt;br /&gt;
	plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
	# Mostrar resultado&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def serie_fourier_definitiva(f,L,n):&lt;br /&gt;
&lt;br /&gt;
	#Puntos donde se grafica y sus valores exactos&lt;br /&gt;
	x = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
	f_ev = f(x)&lt;br /&gt;
&lt;br /&gt;
	def serie_fourier(funcion,x_val,n_terms):&lt;br /&gt;
		fn = np.zeros_like(x_val)&lt;br /&gt;
		f_eval = funcion(x_val)&lt;br /&gt;
&lt;br /&gt;
		c0 = trapezoid(2/L * f_eval,x_val)&lt;br /&gt;
		fn = c0/2&lt;br /&gt;
		for k in range(1,n_terms+1):&lt;br /&gt;
			#Coeficientes&lt;br /&gt;
			cn = trapezoid(2/L * f_eval * np.cos(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
			dn = trapezoid(2/L * f_eval * np.sin(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
&lt;br /&gt;
			#Sumar términos&lt;br /&gt;
			fn +=  cn* np.cos(2*k*np.pi*x_val/L) + dn * np.sin(2*k*np.pi*x_val/L)&lt;br /&gt;
&lt;br /&gt;
		return fn&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)&lt;br /&gt;
&lt;br /&gt;
	for i in n:&lt;br /&gt;
		fn_ev = serie_fourier(f,x,i)&lt;br /&gt;
		plt.plot(x,fn_ev, label=f'n = {i}')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Aproximación de f(x) mediante serie de Fourier')&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;
	#Cálculo de errores&lt;br /&gt;
	n_error = []&lt;br /&gt;
	for i in range(1,100):&lt;br /&gt;
		n_error.append(i)&lt;br /&gt;
&lt;br /&gt;
	error_l2 = []&lt;br /&gt;
	error_inf = []&lt;br /&gt;
&lt;br /&gt;
	for i in n_error:&lt;br /&gt;
		f_n = serie_fourier(f,x,i)&lt;br /&gt;
		dif = f_ev - f_n&lt;br /&gt;
&lt;br /&gt;
		error_l2.append(np.sqrt(trapezoid(dif**2,x)))&lt;br /&gt;
		error_inf.append(round(float(np.max(np.abs(dif))),6))&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(n_error,error_l2, linewidth=2)&lt;br /&gt;
	plt.title('Error $L^2$')&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;
def comparar_fourier_cesaro(func, L, n_terms, nombre_funcion=&amp;quot;Función&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula y grafica la aproximación de Fourier estándar vs Sumas de Cesàro.&lt;br /&gt;
    &lt;br /&gt;
    func: Función original a aproximar.&lt;br /&gt;
    L: Longitud del intervalo [-L/2, L/2].&lt;br /&gt;
    n_terms: Número máximo de coeficientes (n).&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def get_coefficients(n):&lt;br /&gt;
        # Integración por método del trapecio como se indica en el documento &lt;br /&gt;
        x_int = np.linspace(-L/2, L/2, 2000)&lt;br /&gt;
        y_int = func(x_int)&lt;br /&gt;
        &lt;br /&gt;
        # Coeficiente c0&lt;br /&gt;
        c0 = (2/L) * trapezoid(y_int, x_int)&lt;br /&gt;
        &lt;br /&gt;
        an = []&lt;br /&gt;
        bn = []&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            cos_term = np.cos(2 * np.pi * i * x_int / L)&lt;br /&gt;
            sin_term = np.sin(2 * np.pi * i * x_int / L)&lt;br /&gt;
            an.append((2/L) * trapezoid(y_int * cos_term, x_int))&lt;br /&gt;
            bn.append((2/L) * trapezoid(y_int * sin_term, x_int))&lt;br /&gt;
        return c0, an, bn&lt;br /&gt;
&lt;br /&gt;
    # Obtener coeficientes&lt;br /&gt;
    c0, an, bn = get_coefficients(n_terms)&lt;br /&gt;
    &lt;br /&gt;
    # Construir sumas parciales S_k para Cesàro&lt;br /&gt;
    x_range = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
    sumas_parciales = []&lt;br /&gt;
    current_sum = np.full_like(x_range, c0 / 2)&lt;br /&gt;
    sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n_terms):&lt;br /&gt;
        term = an[i] * np.cos(2 * np.pi * (i+1) * x_range / L) + \&lt;br /&gt;
               bn[i] * np.sin(2 * np.pi * (i+1) * x_range / L)&lt;br /&gt;
        current_sum += term&lt;br /&gt;
        sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    # Calcular Suma de Cesàro (Promedio de las sumas parciales)&lt;br /&gt;
    sigma_n = np.mean(sumas_parciales, axis=0)&lt;br /&gt;
    &lt;br /&gt;
    # Gráfica&lt;br /&gt;
    plt.figure(figsize=(12, 6))&lt;br /&gt;
    plt.plot(x_range, func(x_range), 'k--', label=f&amp;quot;Original: {nombre_funcion}&amp;quot;, alpha=0.6)&lt;br /&gt;
    plt.plot(x_range, current_sum, label=f&amp;quot;Fourier Estándar (n={n_terms})&amp;quot;, color='red', alpha=0.5)&lt;br /&gt;
    plt.plot(x_range, sigma_n, label=f&amp;quot;Suma de Cesàro (n={n_terms})&amp;quot;, color='blue', linewidth=2)&lt;br /&gt;
    &lt;br /&gt;
    plt.title(f&amp;quot;Aproximación de {nombre_funcion}: Fourier vs Cesàro&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    plt.grid(True, linestyle='--', alpha=0.7)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Lo que se ejecuta---------------------------------------------------------&lt;br /&gt;
base_trigonometrica(6)&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
	lista = []&lt;br /&gt;
	for i in x:&lt;br /&gt;
		if i &amp;lt; 0:&lt;br /&gt;
			lista.append(0)&lt;br /&gt;
		else:&lt;br /&gt;
			lista.append(1)&lt;br /&gt;
	return np.array(lista)&lt;br /&gt;
&lt;br /&gt;
def MW(x):&lt;br /&gt;
	n = 200&lt;br /&gt;
	a = 1/2&lt;br /&gt;
	b = 13&lt;br /&gt;
&lt;br /&gt;
	suma = 0&lt;br /&gt;
	for i in range(n):&lt;br /&gt;
		suma += a**i * np.cos(b**i * np.pi*x)&lt;br /&gt;
&lt;br /&gt;
	return suma&lt;br /&gt;
&lt;br /&gt;
def g(x):&lt;br /&gt;
	return x**2&lt;br /&gt;
&lt;br /&gt;
serie_fourier_definitiva(f,10,[1,5,10,100])&lt;br /&gt;
comparar_fourier_cesaro(f, 10, 50, &amp;quot;Función Discontinua (Escalón)&amp;quot;)&lt;br /&gt;
comparar_fourier_cesaro(MW, 10, 100, &amp;quot;Monstruo de Weierstrass&amp;quot;)&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104069</id>
		<title>Series de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104069"/>
				<updated>2026-02-16T16:31:59Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &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, Álvaro Moreno Cisneros, Juan Pérez Guerra }}&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;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. La función serie_de_fourier_definitiva aproxima una función dada en un intervalo mediante una serie de Fourier, la función comparar_fourier_cesaro es la que da las gráficas de la última parte y la función base_trigonométrica aunque no se ha incluído en el póster ilustra como funciona la base trigonométrica.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import trapezoid&lt;br /&gt;
&lt;br /&gt;
def base_trigonometrica(n):&lt;br /&gt;
	#Puntos donde se grafica&lt;br /&gt;
	x = np.linspace(-1,1,1000)&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
&lt;br /&gt;
	#Primer término de la serie&lt;br /&gt;
	plt.plot(x, np.full_like(x, 0.5), label='1/2 (n=0)', linewidth=2, color='black')&lt;br /&gt;
&lt;br /&gt;
	#Términos trigonométricos&lt;br /&gt;
	for n in range(1,n):&lt;br /&gt;
		plt.plot(x, np.cos(n*np.pi*x), color = 'r', linestyle='-')&lt;br /&gt;
		plt.plot(x, np.sin(n*np.pi*x), color = 'b', linestyle='-')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Primeros términos de la base trigonométrica {1/2, cos(nπx), sin(nπx)}')&lt;br /&gt;
	plt.xlabel('x')&lt;br /&gt;
	plt.ylabel('f(x)')&lt;br /&gt;
	plt.axhline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.axvline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.grid(True, linestyle=':', alpha=0.6)&lt;br /&gt;
	plt.legend(['1/2','cos','sin'], loc = 'upper right', bbox_to_anchor = (1,1))&lt;br /&gt;
	plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
	# Mostrar resultado&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def serie_fourier_definitiva(f,L,n):&lt;br /&gt;
&lt;br /&gt;
	#Puntos donde se grafica y sus valores exactos&lt;br /&gt;
	x = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
	f_ev = f(x)&lt;br /&gt;
&lt;br /&gt;
	def serie_fourier(funcion,x_val,n_terms):&lt;br /&gt;
		fn = np.zeros_like(x_val)&lt;br /&gt;
		f_eval = funcion(x_val)&lt;br /&gt;
&lt;br /&gt;
		c0 = trapezoid(2/L * f_eval,x_val)&lt;br /&gt;
		fn = c0/2&lt;br /&gt;
		for k in range(1,n_terms+1):&lt;br /&gt;
			#Coeficientes&lt;br /&gt;
			cn = trapezoid(2/L * f_eval * np.cos(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
			dn = trapezoid(2/L * f_eval * np.sin(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
&lt;br /&gt;
			#Sumar términos&lt;br /&gt;
			fn +=  cn* np.cos(2*k*np.pi*x_val/L) + dn * np.sin(2*k*np.pi*x_val/L)&lt;br /&gt;
&lt;br /&gt;
		return fn&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)&lt;br /&gt;
&lt;br /&gt;
	for i in n:&lt;br /&gt;
		fn_ev = serie_fourier(f,x,i)&lt;br /&gt;
		plt.plot(x,fn_ev, label=f'n = {i}')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Aproximación de f(x) mediante serie de Fourier')&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;
	#Cálculo de errores&lt;br /&gt;
	n_error = []&lt;br /&gt;
	for i in range(1,100):&lt;br /&gt;
		n_error.append(i)&lt;br /&gt;
&lt;br /&gt;
	error_l2 = []&lt;br /&gt;
	error_inf = []&lt;br /&gt;
&lt;br /&gt;
	for i in n_error:&lt;br /&gt;
		f_n = serie_fourier(f,x,i)&lt;br /&gt;
		dif = f_ev - f_n&lt;br /&gt;
&lt;br /&gt;
		error_l2.append(np.sqrt(trapezoid(dif**2,x)))&lt;br /&gt;
		error_inf.append(round(float(np.max(np.abs(dif))),6))&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(n_error,error_l2, linewidth=2)&lt;br /&gt;
	plt.title('Error $L^2$')&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;
def comparar_fourier_cesaro(func, L, n_terms, nombre_funcion=&amp;quot;Función&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula y grafica la aproximación de Fourier estándar vs Sumas de Cesàro.&lt;br /&gt;
    &lt;br /&gt;
    func: Función original a aproximar.&lt;br /&gt;
    L: Longitud del intervalo [-L/2, L/2].&lt;br /&gt;
    n_terms: Número máximo de coeficientes (n).&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def get_coefficients(n):&lt;br /&gt;
        # Integración por método del trapecio como se indica en el documento &lt;br /&gt;
        x_int = np.linspace(-L/2, L/2, 2000)&lt;br /&gt;
        y_int = func(x_int)&lt;br /&gt;
        &lt;br /&gt;
        # Coeficiente c0&lt;br /&gt;
        c0 = (2/L) * trapezoid(y_int, x_int)&lt;br /&gt;
        &lt;br /&gt;
        an = []&lt;br /&gt;
        bn = []&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            cos_term = np.cos(2 * np.pi * i * x_int / L)&lt;br /&gt;
            sin_term = np.sin(2 * np.pi * i * x_int / L)&lt;br /&gt;
            an.append((2/L) * trapezoid(y_int * cos_term, x_int))&lt;br /&gt;
            bn.append((2/L) * trapezoid(y_int * sin_term, x_int))&lt;br /&gt;
        return c0, an, bn&lt;br /&gt;
&lt;br /&gt;
    # Obtener coeficientes&lt;br /&gt;
    c0, an, bn = get_coefficients(n_terms)&lt;br /&gt;
    &lt;br /&gt;
    # Construir sumas parciales S_k para Cesàro&lt;br /&gt;
    x_range = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
    sumas_parciales = []&lt;br /&gt;
    current_sum = np.full_like(x_range, c0 / 2)&lt;br /&gt;
    sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n_terms):&lt;br /&gt;
        term = an[i] * np.cos(2 * np.pi * (i+1) * x_range / L) + \&lt;br /&gt;
               bn[i] * np.sin(2 * np.pi * (i+1) * x_range / L)&lt;br /&gt;
        current_sum += term&lt;br /&gt;
        sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    # Calcular Suma de Cesàro (Promedio de las sumas parciales)&lt;br /&gt;
    sigma_n = np.mean(sumas_parciales, axis=0)&lt;br /&gt;
    &lt;br /&gt;
    # Gráfica&lt;br /&gt;
    plt.figure(figsize=(12, 6))&lt;br /&gt;
    plt.plot(x_range, func(x_range), 'k--', label=f&amp;quot;Original: {nombre_funcion}&amp;quot;, alpha=0.6)&lt;br /&gt;
    plt.plot(x_range, current_sum, label=f&amp;quot;Fourier Estándar (n={n_terms})&amp;quot;, color='red', alpha=0.5)&lt;br /&gt;
    plt.plot(x_range, sigma_n, label=f&amp;quot;Suma de Cesàro (n={n_terms})&amp;quot;, color='blue', linewidth=2)&lt;br /&gt;
    &lt;br /&gt;
    plt.title(f&amp;quot;Aproximación de {nombre_funcion}: Fourier vs Cesàro&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    plt.grid(True, linestyle='--', alpha=0.7)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Lo que se ejecuta---------------------------------------------------------&lt;br /&gt;
base_trigonometrica(6)&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
	lista = []&lt;br /&gt;
	for i in x:&lt;br /&gt;
		if i &amp;lt; 0:&lt;br /&gt;
			lista.append(0)&lt;br /&gt;
		else:&lt;br /&gt;
			lista.append(1)&lt;br /&gt;
	return np.array(lista)&lt;br /&gt;
&lt;br /&gt;
def MW(x):&lt;br /&gt;
	n = 200&lt;br /&gt;
	a = 1/2&lt;br /&gt;
	b = 13&lt;br /&gt;
&lt;br /&gt;
	suma = 0&lt;br /&gt;
	for i in range(n):&lt;br /&gt;
		suma += a**i * np.cos(b**i * np.pi*x)&lt;br /&gt;
&lt;br /&gt;
	return suma&lt;br /&gt;
&lt;br /&gt;
def g(x):&lt;br /&gt;
	return x**2&lt;br /&gt;
&lt;br /&gt;
serie_fourier_definitiva(f,10,[1,5,10,100])&lt;br /&gt;
comparar_fourier_cesaro(f, 10, 50, &amp;quot;Función Discontinua (Escalón)&amp;quot;)&lt;br /&gt;
comparar_fourier_cesaro(MW, 10, 100, &amp;quot;Monstruo de Weierstrass&amp;quot;)&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104068</id>
		<title>Series de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104068"/>
				<updated>2026-02-16T16:30:17Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo 6-A | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez, Álvaro Moreno Cisneros, Juan Pérez Guerra }}&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;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. La función serie_de_fourier_definitiva aproxima una función dada en un intervalo mediante una serie de Fourier, la función comparar_fourier_cesaro es la que da las gráficas de la última parte y la función base_trigonométrica aunque no se ha incluído en el póster ilustra como funciona la base trigonométrica.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import trapezoid&lt;br /&gt;
&lt;br /&gt;
def base_trigonometrica(n):&lt;br /&gt;
	#Puntos donde se grafica&lt;br /&gt;
	x = np.linspace(-1,1,1000)&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
&lt;br /&gt;
	#Primer término de la serie&lt;br /&gt;
	plt.plot(x, np.full_like(x, 0.5), label='1/2 (n=0)', linewidth=2, color='black')&lt;br /&gt;
&lt;br /&gt;
	#Términos trigonométricos&lt;br /&gt;
	for n in range(1,n):&lt;br /&gt;
		plt.plot(x, np.cos(n*np.pi*x), color = 'r', linestyle='-')&lt;br /&gt;
		plt.plot(x, np.sin(n*np.pi*x), color = 'b', linestyle='-')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Primeros términos de la base trigonométrica {1/2, cos(nπx), sin(nπx)}')&lt;br /&gt;
	plt.xlabel('x')&lt;br /&gt;
	plt.ylabel('f(x)')&lt;br /&gt;
	plt.axhline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.axvline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.grid(True, linestyle=':', alpha=0.6)&lt;br /&gt;
	plt.legend(['1/2','cos','sin'], loc = 'upper right', bbox_to_anchor = (1,1))&lt;br /&gt;
	plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
	# Mostrar resultado&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def serie_fourier_definitiva(f,L,n):&lt;br /&gt;
&lt;br /&gt;
	#Puntos donde se grafica y sus valores exactos&lt;br /&gt;
	x = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
	f_ev = f(x)&lt;br /&gt;
&lt;br /&gt;
	def serie_fourier(funcion,x_val,n_terms):&lt;br /&gt;
		fn = np.zeros_like(x_val)&lt;br /&gt;
		f_eval = funcion(x_val)&lt;br /&gt;
&lt;br /&gt;
		c0 = trapezoid(2/L * f_eval,x_val)&lt;br /&gt;
		fn = c0/2&lt;br /&gt;
		for k in range(1,n_terms+1):&lt;br /&gt;
			#Coeficientes&lt;br /&gt;
			cn = trapezoid(2/L * f_eval * np.cos(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
			dn = trapezoid(2/L * f_eval * np.sin(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
&lt;br /&gt;
			#Sumar términos&lt;br /&gt;
			fn +=  cn* np.cos(2*k*np.pi*x_val/L) + dn * np.sin(2*k*np.pi*x_val/L)&lt;br /&gt;
&lt;br /&gt;
		return fn&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)&lt;br /&gt;
&lt;br /&gt;
	for i in n:&lt;br /&gt;
		fn_ev = serie_fourier(f,x,i)&lt;br /&gt;
		plt.plot(x,fn_ev, label=f'n = {i}')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Aproximación de f(x) mediante serie de Fourier')&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;
	#Cálculo de errores&lt;br /&gt;
	n_error = []&lt;br /&gt;
	for i in range(1,100):&lt;br /&gt;
		n_error.append(i)&lt;br /&gt;
&lt;br /&gt;
	error_l2 = []&lt;br /&gt;
	error_inf = []&lt;br /&gt;
&lt;br /&gt;
	for i in n_error:&lt;br /&gt;
		f_n = serie_fourier(f,x,i)&lt;br /&gt;
		dif = f_ev - f_n&lt;br /&gt;
&lt;br /&gt;
		error_l2.append(np.sqrt(trapezoid(dif**2,x)))&lt;br /&gt;
		error_inf.append(round(float(np.max(np.abs(dif))),6))&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(n_error,error_l2, linewidth=2)&lt;br /&gt;
	plt.title('Error $L^2$')&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;
def comparar_fourier_cesaro(func, L, n_terms, nombre_funcion=&amp;quot;Función&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula y grafica la aproximación de Fourier estándar vs Sumas de Cesàro.&lt;br /&gt;
    &lt;br /&gt;
    func: Función original a aproximar.&lt;br /&gt;
    L: Longitud del intervalo [-L/2, L/2].&lt;br /&gt;
    n_terms: Número máximo de coeficientes (n).&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def get_coefficients(n):&lt;br /&gt;
        # Integración por método del trapecio como se indica en el documento &lt;br /&gt;
        x_int = np.linspace(-L/2, L/2, 2000)&lt;br /&gt;
        y_int = func(x_int)&lt;br /&gt;
        &lt;br /&gt;
        # Coeficiente c0&lt;br /&gt;
        c0 = (2/L) * trapezoid(y_int, x_int)&lt;br /&gt;
        &lt;br /&gt;
        an = []&lt;br /&gt;
        bn = []&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            cos_term = np.cos(2 * np.pi * i * x_int / L)&lt;br /&gt;
            sin_term = np.sin(2 * np.pi * i * x_int / L)&lt;br /&gt;
            an.append((2/L) * trapezoid(y_int * cos_term, x_int))&lt;br /&gt;
            bn.append((2/L) * trapezoid(y_int * sin_term, x_int))&lt;br /&gt;
        return c0, an, bn&lt;br /&gt;
&lt;br /&gt;
    # Obtener coeficientes&lt;br /&gt;
    c0, an, bn = get_coefficients(n_terms)&lt;br /&gt;
    &lt;br /&gt;
    # Construir sumas parciales S_k para Cesàro&lt;br /&gt;
    x_range = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
    sumas_parciales = []&lt;br /&gt;
    current_sum = np.full_like(x_range, c0 / 2)&lt;br /&gt;
    sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n_terms):&lt;br /&gt;
        term = an[i] * np.cos(2 * np.pi * (i+1) * x_range / L) + \&lt;br /&gt;
               bn[i] * np.sin(2 * np.pi * (i+1) * x_range / L)&lt;br /&gt;
        current_sum += term&lt;br /&gt;
        sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    # Calcular Suma de Cesàro (Promedio de las sumas parciales)&lt;br /&gt;
    sigma_n = np.mean(sumas_parciales, axis=0)&lt;br /&gt;
    &lt;br /&gt;
    # Gráfica&lt;br /&gt;
    plt.figure(figsize=(12, 6))&lt;br /&gt;
    plt.plot(x_range, func(x_range), 'k--', label=f&amp;quot;Original: {nombre_funcion}&amp;quot;, alpha=0.6)&lt;br /&gt;
    plt.plot(x_range, current_sum, label=f&amp;quot;Fourier Estándar (n={n_terms})&amp;quot;, color='red', alpha=0.5)&lt;br /&gt;
    plt.plot(x_range, sigma_n, label=f&amp;quot;Suma de Cesàro (n={n_terms})&amp;quot;, color='blue', linewidth=2)&lt;br /&gt;
    &lt;br /&gt;
    plt.title(f&amp;quot;Aproximación de {nombre_funcion}: Fourier vs Cesàro&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    plt.grid(True, linestyle='--', alpha=0.7)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Lo que se ejecuta---------------------------------------------------------&lt;br /&gt;
base_trigonometrica(6)&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
	lista = []&lt;br /&gt;
	for i in x:&lt;br /&gt;
		if i &amp;lt; 0:&lt;br /&gt;
			lista.append(0)&lt;br /&gt;
		else:&lt;br /&gt;
			lista.append(1)&lt;br /&gt;
	return np.array(lista)&lt;br /&gt;
&lt;br /&gt;
def MW(x):&lt;br /&gt;
	n = 200&lt;br /&gt;
	a = 1/2&lt;br /&gt;
	b = 13&lt;br /&gt;
&lt;br /&gt;
	suma = 0&lt;br /&gt;
	for i in range(n):&lt;br /&gt;
		suma += a**i * np.cos(b**i * np.pi*x)&lt;br /&gt;
&lt;br /&gt;
	return suma&lt;br /&gt;
&lt;br /&gt;
def g(x):&lt;br /&gt;
	return x**2&lt;br /&gt;
&lt;br /&gt;
serie_fourier_definitiva(f,10,[1,5,10,100])&lt;br /&gt;
comparar_fourier_cesaro(f, 10, 50, &amp;quot;Función Discontinua (Escalón)&amp;quot;)&lt;br /&gt;
comparar_fourier_cesaro(MW, 10, 100, &amp;quot;Monstruo de Weierstrass&amp;quot;)&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104067</id>
		<title>Series de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104067"/>
				<updated>2026-02-16T16:26:17Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo 6-A | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez, Álvaro Moreno Cisneros, Juan Pérez Guerra }}&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;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from scipy.integrate import trapezoid&lt;br /&gt;
&lt;br /&gt;
def base_trigonometrica(n):&lt;br /&gt;
	#Puntos donde se grafica&lt;br /&gt;
	x = np.linspace(-1,1,1000)&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
&lt;br /&gt;
	#Primer término de la serie&lt;br /&gt;
	plt.plot(x, np.full_like(x, 0.5), label='1/2 (n=0)', linewidth=2, color='black')&lt;br /&gt;
&lt;br /&gt;
	#Términos trigonométricos&lt;br /&gt;
	for n in range(1,n):&lt;br /&gt;
		plt.plot(x, np.cos(n*np.pi*x), color = 'r', linestyle='-')&lt;br /&gt;
		plt.plot(x, np.sin(n*np.pi*x), color = 'b', linestyle='-')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Primeros términos de la base trigonométrica {1/2, cos(nπx), sin(nπx)}')&lt;br /&gt;
	plt.xlabel('x')&lt;br /&gt;
	plt.ylabel('f(x)')&lt;br /&gt;
	plt.axhline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.axvline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.grid(True, linestyle=':', alpha=0.6)&lt;br /&gt;
	plt.legend(['1/2','cos','sin'], loc = 'upper right', bbox_to_anchor = (1,1))&lt;br /&gt;
	plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
	# Mostrar resultado&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def serie_fourier_definitiva(f,L,n):&lt;br /&gt;
&lt;br /&gt;
	#Puntos donde se grafica y sus valores exactos&lt;br /&gt;
	x = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
	f_ev = f(x)&lt;br /&gt;
&lt;br /&gt;
	def serie_fourier(funcion,x_val,n_terms):&lt;br /&gt;
		fn = np.zeros_like(x_val)&lt;br /&gt;
		f_eval = funcion(x_val)&lt;br /&gt;
&lt;br /&gt;
		c0 = trapezoid(2/L * f_eval,x_val)&lt;br /&gt;
		fn = c0/2&lt;br /&gt;
		for k in range(1,n_terms+1):&lt;br /&gt;
			#Coeficientes&lt;br /&gt;
			cn = trapezoid(2/L * f_eval * np.cos(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
			dn = trapezoid(2/L * f_eval * np.sin(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
&lt;br /&gt;
			#Sumar términos&lt;br /&gt;
			fn +=  cn* np.cos(2*k*np.pi*x_val/L) + dn * np.sin(2*k*np.pi*x_val/L)&lt;br /&gt;
&lt;br /&gt;
		return fn&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)&lt;br /&gt;
&lt;br /&gt;
	for i in n:&lt;br /&gt;
		fn_ev = serie_fourier(f,x,i)&lt;br /&gt;
		plt.plot(x,fn_ev, label=f'n = {i}')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Aproximación de f(x) mediante serie de Fourier')&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;
	#Cálculo de errores&lt;br /&gt;
	n_error = []&lt;br /&gt;
	for i in range(1,100):&lt;br /&gt;
		n_error.append(i)&lt;br /&gt;
&lt;br /&gt;
	error_l2 = []&lt;br /&gt;
	error_inf = []&lt;br /&gt;
&lt;br /&gt;
	for i in n_error:&lt;br /&gt;
		f_n = serie_fourier(f,x,i)&lt;br /&gt;
		dif = f_ev - f_n&lt;br /&gt;
&lt;br /&gt;
		error_l2.append(np.sqrt(trapezoid(dif**2,x)))&lt;br /&gt;
		error_inf.append(round(float(np.max(np.abs(dif))),6))&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(n_error,error_l2, linewidth=2)&lt;br /&gt;
	plt.title('Error $L^2$')&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;
def comparar_fourier_cesaro(func, L, n_terms, nombre_funcion=&amp;quot;Función&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calcula y grafica la aproximación de Fourier estándar vs Sumas de Cesàro.&lt;br /&gt;
    &lt;br /&gt;
    func: Función original a aproximar.&lt;br /&gt;
    L: Longitud del intervalo [-L/2, L/2].&lt;br /&gt;
    n_terms: Número máximo de coeficientes (n).&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    def get_coefficients(n):&lt;br /&gt;
        # Integración por método del trapecio como se indica en el documento &lt;br /&gt;
        x_int = np.linspace(-L/2, L/2, 2000)&lt;br /&gt;
        y_int = func(x_int)&lt;br /&gt;
        &lt;br /&gt;
        # Coeficiente c0&lt;br /&gt;
        c0 = (2/L) * trapezoid(y_int, x_int)&lt;br /&gt;
        &lt;br /&gt;
        an = []&lt;br /&gt;
        bn = []&lt;br /&gt;
        for i in range(1, n + 1):&lt;br /&gt;
            cos_term = np.cos(2 * np.pi * i * x_int / L)&lt;br /&gt;
            sin_term = np.sin(2 * np.pi * i * x_int / L)&lt;br /&gt;
            an.append((2/L) * trapezoid(y_int * cos_term, x_int))&lt;br /&gt;
            bn.append((2/L) * trapezoid(y_int * sin_term, x_int))&lt;br /&gt;
        return c0, an, bn&lt;br /&gt;
&lt;br /&gt;
    # Obtener coeficientes&lt;br /&gt;
    c0, an, bn = get_coefficients(n_terms)&lt;br /&gt;
    &lt;br /&gt;
    # Construir sumas parciales S_k para Cesàro&lt;br /&gt;
    x_range = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
    sumas_parciales = []&lt;br /&gt;
    current_sum = np.full_like(x_range, c0 / 2)&lt;br /&gt;
    sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    for i in range(n_terms):&lt;br /&gt;
        term = an[i] * np.cos(2 * np.pi * (i+1) * x_range / L) + \&lt;br /&gt;
               bn[i] * np.sin(2 * np.pi * (i+1) * x_range / L)&lt;br /&gt;
        current_sum += term&lt;br /&gt;
        sumas_parciales.append(current_sum.copy())&lt;br /&gt;
    &lt;br /&gt;
    # Calcular Suma de Cesàro (Promedio de las sumas parciales)&lt;br /&gt;
    sigma_n = np.mean(sumas_parciales, axis=0)&lt;br /&gt;
    &lt;br /&gt;
    # Gráfica&lt;br /&gt;
    plt.figure(figsize=(12, 6))&lt;br /&gt;
    plt.plot(x_range, func(x_range), 'k--', label=f&amp;quot;Original: {nombre_funcion}&amp;quot;, alpha=0.6)&lt;br /&gt;
    plt.plot(x_range, current_sum, label=f&amp;quot;Fourier Estándar (n={n_terms})&amp;quot;, color='red', alpha=0.5)&lt;br /&gt;
    plt.plot(x_range, sigma_n, label=f&amp;quot;Suma de Cesàro (n={n_terms})&amp;quot;, color='blue', linewidth=2)&lt;br /&gt;
    &lt;br /&gt;
    plt.title(f&amp;quot;Aproximación de {nombre_funcion}: Fourier vs Cesàro&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    plt.grid(True, linestyle='--', alpha=0.7)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Lo que se ejecuta---------------------------------------------------------&lt;br /&gt;
base_trigonometrica(6)&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
	lista = []&lt;br /&gt;
	for i in x:&lt;br /&gt;
		if i &amp;lt; 0:&lt;br /&gt;
			lista.append(0)&lt;br /&gt;
		else:&lt;br /&gt;
			lista.append(1)&lt;br /&gt;
	return np.array(lista)&lt;br /&gt;
&lt;br /&gt;
def MW(x):&lt;br /&gt;
	n = 200&lt;br /&gt;
	a = 1/2&lt;br /&gt;
	b = 13&lt;br /&gt;
&lt;br /&gt;
	suma = 0&lt;br /&gt;
	for i in range(n):&lt;br /&gt;
		suma += a**i * np.cos(b**i * np.pi*x)&lt;br /&gt;
&lt;br /&gt;
	return suma&lt;br /&gt;
&lt;br /&gt;
def g(x):&lt;br /&gt;
	return x**2&lt;br /&gt;
&lt;br /&gt;
serie_fourier_definitiva(f,10,[1,5,10,100])&lt;br /&gt;
comparar_fourier_cesaro(f, 10, 50, &amp;quot;Función Discontinua (Escalón)&amp;quot;)&lt;br /&gt;
comparar_fourier_cesaro(MW, 10, 100, &amp;quot;Monstruo de Weierstrass&amp;quot;)&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104066</id>
		<title>Series de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104066"/>
				<updated>2026-02-16T16:21:46Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Series de Fourier. Grupo 6-A | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez, Álvaro Moreno Cisneros, Juan Pérez Guerra }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Series de fourier LÁJ.jpeg||800px]]]&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;
from scipy.integrate import trapezoid&lt;br /&gt;
&lt;br /&gt;
def base_trigonometrica(n):&lt;br /&gt;
	#Puntos donde se grafica&lt;br /&gt;
	x = np.linspace(-1,1,1000)&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
&lt;br /&gt;
	#Primer término de la serie&lt;br /&gt;
	plt.plot(x, np.full_like(x, 0.5), label='1/2 (n=0)', linewidth=2, color='black')&lt;br /&gt;
&lt;br /&gt;
	#Términos trigonométricos&lt;br /&gt;
	for n in range(1,n):&lt;br /&gt;
		plt.plot(x, np.cos(n*np.pi*x), color = 'r', linestyle='-')&lt;br /&gt;
		plt.plot(x, np.sin(n*np.pi*x), color = 'b', linestyle='-')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Primeros términos de la base trigonométrica {1/2, cos(nπx), sin(nπx)}')&lt;br /&gt;
	plt.xlabel('x')&lt;br /&gt;
	plt.ylabel('f(x)')&lt;br /&gt;
	plt.axhline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.axvline(0, color='black', linewidth=0.5)&lt;br /&gt;
	plt.grid(True, linestyle=':', alpha=0.6)&lt;br /&gt;
	plt.legend(['1/2','cos','sin'], loc = 'upper right', bbox_to_anchor = (1,1))&lt;br /&gt;
	plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
	# Mostrar resultado&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
def aproximar_funcion_cont(n_array):&lt;br /&gt;
	def f(x):&lt;br /&gt;
		return 1 - 2*np.abs(1/2 - x)&lt;br /&gt;
&lt;br /&gt;
	#Puntos donde se grafica y sus valores exactos&lt;br /&gt;
	x = np.linspace(0,1,1000)&lt;br /&gt;
	f_ev = f(x)&lt;br /&gt;
&lt;br /&gt;
	def serie_fourier(funcion,x_val,n_terms):&lt;br /&gt;
		fn = np.zeros_like(x_val)&lt;br /&gt;
		f_eval = funcion(x_val)&lt;br /&gt;
&lt;br /&gt;
		for k in range(1,n_terms+1):&lt;br /&gt;
			#Integración númerica con método del trapecio&lt;br /&gt;
			integrando = 2*f_eval*np.sin(k*np.pi*x_val)&lt;br /&gt;
			ak = trapezoid(integrando,x_val)&lt;br /&gt;
&lt;br /&gt;
			#Sumar término&lt;br /&gt;
			fn += ak * np.sin(k*np.pi*x_val)&lt;br /&gt;
&lt;br /&gt;
		return fn&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)&lt;br /&gt;
&lt;br /&gt;
	for i in n_array:&lt;br /&gt;
		fn_ev = serie_fourier(f,x,i)&lt;br /&gt;
		plt.plot(x,fn_ev, label=f'n = {i}')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Aproximación de f(x) mediante Serie de Fourier (Senos)')&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;
	#Cálculo de errores&lt;br /&gt;
	n_error = []&lt;br /&gt;
	for i in range(1,100):&lt;br /&gt;
		n_error.append(i)&lt;br /&gt;
&lt;br /&gt;
	error_l2 = []&lt;br /&gt;
	error_inf = []&lt;br /&gt;
&lt;br /&gt;
	for i in n_error:&lt;br /&gt;
		f_n = serie_fourier(f,x,i)&lt;br /&gt;
		dif = f_ev - f_n&lt;br /&gt;
&lt;br /&gt;
		error_l2.append(np.sqrt(trapezoid(dif**2,x)))&lt;br /&gt;
		error_inf.append(round(float(np.max(np.abs(dif))),6))&lt;br /&gt;
&lt;br /&gt;
	fig, ax = plt.subplots(1,2,figsize = (10,4))&lt;br /&gt;
&lt;br /&gt;
	#Error L2&lt;br /&gt;
	ax[0].plot(n_error, error_l2, label='Error $L^2$')&lt;br /&gt;
	ax[0].set_title('Error $L^2$')&lt;br /&gt;
&lt;br /&gt;
	#Error Linf&lt;br /&gt;
	ax[1].plot(n_error, error_inf, label='Error Uniforme ($L^{infty}$)')&lt;br /&gt;
	ax[1].set_title('Error $L^{inf}$')&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
def serie_fourier_definitiva(f,L,n):&lt;br /&gt;
&lt;br /&gt;
	#Puntos donde se grafica y sus valores exactos&lt;br /&gt;
	x = np.linspace(-L/2,L/2,1000)&lt;br /&gt;
	f_ev = f(x)&lt;br /&gt;
&lt;br /&gt;
	def serie_fourier(funcion,x_val,n_terms):&lt;br /&gt;
		fn = np.zeros_like(x_val)&lt;br /&gt;
		f_eval = funcion(x_val)&lt;br /&gt;
&lt;br /&gt;
		c0 = trapezoid(2/L * f_eval,x_val)&lt;br /&gt;
		fn = c0/2&lt;br /&gt;
		for k in range(1,n_terms+1):&lt;br /&gt;
			#Coeficientes&lt;br /&gt;
			cn = trapezoid(2/L * f_eval * np.cos(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
			dn = trapezoid(2/L * f_eval * np.sin(2*k*np.pi*x_val/L),x_val)&lt;br /&gt;
&lt;br /&gt;
			#Sumar términos&lt;br /&gt;
			fn +=  cn* np.cos(2*k*np.pi*x_val/L) + dn * np.sin(2*k*np.pi*x_val/L)&lt;br /&gt;
&lt;br /&gt;
		return fn&lt;br /&gt;
&lt;br /&gt;
	#Gráfica&lt;br /&gt;
	plt.figure(figsize = (10,6))&lt;br /&gt;
	plt.plot(x,f_ev,'k--', label='f(x) original', linewidth=2)&lt;br /&gt;
&lt;br /&gt;
	for i in n:&lt;br /&gt;
		fn_ev = serie_fourier(f,x,i)&lt;br /&gt;
		plt.plot(x,fn_ev, label=f'n = {i}')&lt;br /&gt;
&lt;br /&gt;
	plt.title('Aproximación de f(x) mediante serie de Fourier')&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;
	#Cálculo de errores&lt;br /&gt;
	n_error = []&lt;br /&gt;
	for i in range(1,100):&lt;br /&gt;
		n_error.append(i)&lt;br /&gt;
&lt;br /&gt;
	error_l2 = []&lt;br /&gt;
	error_inf = []&lt;br /&gt;
&lt;br /&gt;
	for i in n_error:&lt;br /&gt;
		f_n = serie_fourier(f,x,i)&lt;br /&gt;
		dif = f_ev - f_n&lt;br /&gt;
&lt;br /&gt;
		error_l2.append(np.sqrt(trapezoid(dif**2,x)))&lt;br /&gt;
		error_inf.append(round(float(np.max(np.abs(dif))),6))&lt;br /&gt;
&lt;br /&gt;
	fig, ax = plt.subplots(1,2,figsize = (10,4))&lt;br /&gt;
&lt;br /&gt;
	#Error L2&lt;br /&gt;
	ax[0].plot(n_error, error_l2, label='Error $L^2$')&lt;br /&gt;
	ax[0].set_title('Error $L^2$')&lt;br /&gt;
&lt;br /&gt;
	#Error Linf&lt;br /&gt;
	ax[1].plot(n_error, error_inf, label='Error Uniforme ($L^{infty}$)')&lt;br /&gt;
	ax[1].set_title('Error $L^{inf}$')&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Lo que se ejecuta&lt;br /&gt;
# base_trigonometrica(6)&lt;br /&gt;
#aproximar_funcion_cont([1,5,10])&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
	lista = []&lt;br /&gt;
	for i in x:&lt;br /&gt;
		if i &amp;lt; 0:&lt;br /&gt;
			lista.append(0)&lt;br /&gt;
		else:&lt;br /&gt;
			lista.append(1)&lt;br /&gt;
	return np.array(lista)&lt;br /&gt;
&lt;br /&gt;
def MW(x):&lt;br /&gt;
	n = 200&lt;br /&gt;
	a = 1/2&lt;br /&gt;
	b = 13&lt;br /&gt;
&lt;br /&gt;
	suma = 0&lt;br /&gt;
	for i in range(n):&lt;br /&gt;
		suma += a**i * np.cos(b**i * np.pi*x)&lt;br /&gt;
&lt;br /&gt;
	return suma&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
serie_fourier_definitiva(MW,20,[1,5,10,200])&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>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104065</id>
		<title>Series de Fourier LÁJ</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_L%C3%81J&amp;diff=104065"/>
				<updated>2026-02-16T16:10:14Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: Página creada con «{{ TrabajoED | Series de Fourier. Grupo 6-A | 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 | Series de Fourier. Grupo 6-A | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez, Álvaro Moreno Cisneros, Juan Pérez Guerra }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Series de fourier LÁJ.jpeg||800px]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Series_de_fourier_L%C3%81J.jpeg&amp;diff=104064</id>
		<title>Archivo:Series de fourier LÁJ.jpeg</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Series_de_fourier_L%C3%81J.jpeg&amp;diff=104064"/>
				<updated>2026-02-16T16:03:41Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Series_de_fourier_L%C3%81J.pdf&amp;diff=104063</id>
		<title>Archivo:Series de fourier LÁJ.pdf</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Series_de_fourier_L%C3%81J.pdf&amp;diff=104063"/>
				<updated>2026-02-16T16:02:05Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Serie_de_Fourier_L%C3%81J.pdf&amp;diff=104062</id>
		<title>Archivo:Serie de Fourier LÁJ.pdf</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Serie_de_Fourier_L%C3%81J.pdf&amp;diff=104062"/>
				<updated>2026-02-16T15:58:28Z</updated>
		
		<summary type="html">&lt;p&gt;Álvaro Moreno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Álvaro Moreno</name></author>	</entry>

	</feed>