<?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=Paulasanchezjauregui</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=Paulasanchezjauregui"/>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Especial:Contribuciones/Paulasanchezjauregui"/>
		<updated>2026-04-23T10:39:44Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Fotocpp.jpeg&amp;diff=104644</id>
		<title>Archivo:Fotocpp.jpeg</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Fotocpp.jpeg&amp;diff=104644"/>
				<updated>2026-04-15T07:36:52Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuacion_del_Calor_CPP&amp;diff=104638</id>
		<title>Ecuacion del Calor CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuacion_del_Calor_CPP&amp;diff=104638"/>
				<updated>2026-04-13T08:36:08Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: /* EV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo CPP| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula Sánchez&lt;br /&gt;
&lt;br /&gt;
Paula Mellado&lt;br /&gt;
&lt;br /&gt;
Clara García-Hoz}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo: cpp.jpeg||800px]]&lt;br /&gt;
&lt;br /&gt;
===Evolución Datos Iniciales ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# 1. Definimos el dominio&lt;br /&gt;
x = np.linspace(-2, 2, 1000)&lt;br /&gt;
&lt;br /&gt;
# Número de modos de Fourier&lt;br /&gt;
N = 80&lt;br /&gt;
&lt;br /&gt;
# Fijamos semilla para reproducibilidad&lt;br /&gt;
np.random.seed(0)&lt;br /&gt;
&lt;br /&gt;
# 2. Coeficientes aleatorios&lt;br /&gt;
# Generamos coeficientes con decaimiento 1/n (Esto permite tener bastante ruido al inicio)&lt;br /&gt;
a = np.random.normal(0, 1, N) / np.arange(1, N+1)&lt;br /&gt;
b = np.random.normal(0, 1, N) / np.arange(1, N+1)&lt;br /&gt;
&lt;br /&gt;
# 3. Solución de la ecuación del calor&lt;br /&gt;
def u(x, t):&lt;br /&gt;
    resultado = np.zeros_like(x)&lt;br /&gt;
    &lt;br /&gt;
    for n in range(1, N+1):&lt;br /&gt;
        modo = a[n-1]*np.cos(n*x) + b[n-1]*np.sin(n*x)&lt;br /&gt;
        resultado += modo * np.exp(-n**2 * t)&lt;br /&gt;
        &lt;br /&gt;
    return resultado&lt;br /&gt;
&lt;br /&gt;
# 4. Instantes de tiempo&lt;br /&gt;
tiempos = [0, 0.005, 0.02, 0.1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 5. Representación gráfica&lt;br /&gt;
plt.figure(figsize=(10,6))&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    plt.plot(x, u(x, t), label=f&amp;quot;t = {t}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.title(&amp;quot;Evolución temporal de la solución&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;u(x,t)&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Comportamiento del promedio  ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# 1. Definimos el tiempo&lt;br /&gt;
t = np.linspace(0.01, 1.2, 1000)&lt;br /&gt;
&lt;br /&gt;
# 2. Modos considerados&lt;br /&gt;
n_values = [1, 2, 3, 4]&lt;br /&gt;
&lt;br /&gt;
# Valores esperados de los coeficientes&lt;br /&gt;
E_an = [1.0, -0.8, 0.5, -0.3]&lt;br /&gt;
&lt;br /&gt;
# 3. Cálculo del promedio total&lt;br /&gt;
esperanza_total = np.zeros_like(t)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
for i, n in enumerate(n_values):&lt;br /&gt;
    &lt;br /&gt;
    # Contribución de cada modo&lt;br /&gt;
    contribucion = E_an[i] * np.exp(-(n**2) * t)&lt;br /&gt;
    &lt;br /&gt;
    # Sumamos al promedio total&lt;br /&gt;
    esperanza_total += contribucion&lt;br /&gt;
    &lt;br /&gt;
    # Dibujamos cada modo&lt;br /&gt;
    plt.plot(t, contribucion, '--', alpha=0.7,&lt;br /&gt;
             label=f'Modo n={n}')&lt;br /&gt;
&lt;br /&gt;
# 4. Dibujamos el promedio total&lt;br /&gt;
plt.plot(t, esperanza_total, color='black', linewidth=3,&lt;br /&gt;
         label='Promedio total')&lt;br /&gt;
&lt;br /&gt;
# Línea horizontal en 0&lt;br /&gt;
plt.axhline(0, linestyle='-', alpha=0.5)&lt;br /&gt;
&lt;br /&gt;
# 5. Detalles de la gráfica&lt;br /&gt;
&lt;br /&gt;
plt.title('Evolución del promedio en x = 0')&lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('E[u(0,t)]')&lt;br /&gt;
plt.grid(alpha=0.6)&lt;br /&gt;
plt.legend()&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuacion_del_Calor_CPP&amp;diff=104637</id>
		<title>Ecuacion del Calor CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuacion_del_Calor_CPP&amp;diff=104637"/>
				<updated>2026-04-13T08:19:24Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: Página creada con «{{ TrabajoED | Ecuación del calor. Grupo CPP| EDP|2025-26 | Paula Sánchez  Paula Mellado  Clara García-Hoz}}  Archivo: cpp...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo CPP| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula Sánchez&lt;br /&gt;
&lt;br /&gt;
Paula Mellado&lt;br /&gt;
&lt;br /&gt;
Clara García-Hoz}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo: cpp.jpeg||800px]]&lt;br /&gt;
&lt;br /&gt;
=== Dispersión de partículas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&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>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Cpp.jpeg&amp;diff=104636</id>
		<title>Archivo:Cpp.jpeg</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Cpp.jpeg&amp;diff=104636"/>
				<updated>2026-04-13T08:14:17Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104360</id>
		<title>Series de Fourier CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104360"/>
				<updated>2026-02-19T08:05:21Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ TrabajoED | Series de Fourier. Grupo PCP| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula Sánchez,Paula Mellado y Clara Garcia-Hoz}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:poster.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Referencias ===&lt;br /&gt;
&lt;br /&gt;
Sandro Salsa — Partial Differential Equations in Action&lt;br /&gt;
https://tutorial.math.lamar.edu/Classes/DE/ConvergenceFourierSeries.aspx&lt;br /&gt;
&lt;br /&gt;
https://www.physicsclassroom.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serie de Fourier ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas y la serie de Fourier de la función. &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;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 0) SERIE DE FOURIER (texto que se imprime al ejecutar)&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def print_fourier_series_info():&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*70)&lt;br /&gt;
    print(&amp;quot;ESTUDIO: Fenómeno de Gibbs en la onda cuadrada 2π-periódica&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nFunción (onda cuadrada 2π-periódica):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) =  1   si  0 &amp;lt; x &amp;lt; π&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) = -1   si -π &amp;lt; x &amp;lt; 0&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   y se extiende 2π-periódicamente: f(x+2π)=f(x).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSerie de Fourier:&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) ~ (4/π) * Σ_{n=1..∞}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSuma parcial (N términos):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   S_N(x) = (4/π) * Σ_{n=1..N}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nHechos clave (Gibbs):&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Cerca de las discontinuidades aparecen oscilaciones.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al aumentar N, las oscilaciones se 'concentran' cerca del salto,&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   pero el sobreimpulso máximo NO desaparece (tiende a una constante).&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Lejos del salto, S_N converge mejor (convergencia puntual en continuidad).&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 1) Definición de la onda cuadrada 2π-periódica&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def square_wave_2pi(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Onda cuadrada 2π-periódica con salto en 0 (y ±π).&lt;br /&gt;
    Se define en el intervalo principal (-π, π].&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    xr = (x + np.pi) % (2*np.pi) - np.pi  # reduce a (-π, π]&lt;br /&gt;
    y = np.where(xr &amp;gt; 0, 1.0, -1.0)&lt;br /&gt;
    return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 2) Suma parcial de Fourier&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def fourier_partial_sum_square(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    S_N(x) = (4/π) * sum_{n=1..N} sin((2n-1)x)/(2n-1)&lt;br /&gt;
    Vectorizado para x array.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = 2*np.arange(1, N+1) - 1  # 1,3,5,...,(2N-1)&lt;br /&gt;
    return (4/np.pi) * np.sum(np.sin(np.outer(k, x)) / k[:, None], axis=0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 3) DIBUJOS: global + zoom Gibbs&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def plot_global_and_zoom():&lt;br /&gt;
    # Global&lt;br /&gt;
    M = 5000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(x, f, linewidth=2, label=&amp;quot;f(x) (onda cuadrada)&amp;quot;)&lt;br /&gt;
    for N in [1, 3, 10, 50, 100]:&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        plt.plot(x, S, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Aproximación global de la onda cuadrada con sumas parciales&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Zoom cerca de x=0&lt;br /&gt;
    zoom = 0.5&lt;br /&gt;
    xz = np.linspace(-zoom, zoom, 3000)&lt;br /&gt;
    fz = square_wave_2pi(xz)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(xz, fz, linewidth=2, label=&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    for N in [5, 10, 20, 50, 100]:&lt;br /&gt;
        Sz = fourier_partial_sum_square(xz, N)&lt;br /&gt;
        plt.plot(xz, Sz, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Fenómeno de Gibbs (zoom cerca de la discontinuidad x=0)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 4) ANÁLISIS NUMÉRICO del Gibbs: overshoot/undershoot vs N&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def gibbs_numerical_study(Nmax=300, window=0.3):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide numéricamente:&lt;br /&gt;
      - overshoot a la derecha del salto: max(S_N) - 1&lt;br /&gt;
      - undershoot a la izquierda: (-1) - min(S_N) con signo ajustado&lt;br /&gt;
    Normaliza por el salto (que vale 2).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    jump = 2.0  # salto de -1 a +1&lt;br /&gt;
&lt;br /&gt;
    x_right = np.linspace(0, window, 6000, endpoint=True)&lt;br /&gt;
    x_left  = np.linspace(-window, 0, 6000, endpoint=True)&lt;br /&gt;
&lt;br /&gt;
    overshoot_vals = np.zeros(Nmax)&lt;br /&gt;
    undershoot_vals = np.zeros(Nmax)&lt;br /&gt;
&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
&lt;br /&gt;
        overshoot_vals[N-1] = np.max(Sr) - 1.0&lt;br /&gt;
        undershoot_vals[N-1] = -1.0 - np.min(Sl)&lt;br /&gt;
&lt;br /&gt;
    overshoot_rel = overshoot_vals / jump&lt;br /&gt;
    undershoot_rel = undershoot_vals / jump&lt;br /&gt;
&lt;br /&gt;
    # Gráfica overshoot/undershoot&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, overshoot_rel, label=&amp;quot;Sobreoscilación / salto&amp;quot;)&lt;br /&gt;
    plt.plot(N_axis, undershoot_rel, label=&amp;quot;Suboscilación / salto&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Medida numérica del Gibbs (normalizado por el salto)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud relativa&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Resumen en consola&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;-&amp;quot;*70)&lt;br /&gt;
    print(f&amp;quot;Resumen numérico local (buscado en ventana ±{window} alrededor del salto x=0)&amp;quot;)&lt;br /&gt;
    print(&amp;quot;El salto es 2 (de -1 a +1). Se muestra el sobreimpulso relativo over/jump.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    Ns_show = [5, 10, 20, 50, 100, 200, Nmax]&lt;br /&gt;
    print(&amp;quot;N\tmax(S_N) der.\tmin(S_N) izq.\tOvershoot\tUndershoot\tOver/jump&amp;quot;)&lt;br /&gt;
    for N in Ns_show:&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
        max_right = np.max(Sr)&lt;br /&gt;
        min_left  = np.min(Sl)&lt;br /&gt;
        over = max_right - 1.0&lt;br /&gt;
        under = -1.0 - min_left&lt;br /&gt;
        print(f&amp;quot;{N}\t{max_right:+.6f}\t\t{min_left:+.6f}\t\t{over:.6f}\t\t{under:.6f}\t\t{over/jump:.6f}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Reporte final (valores límite aproximados numéricamente)&lt;br /&gt;
    print(&amp;quot;\nObservación:&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al crecer N, el sobreimpulso relativo (over/jump) se estabiliza cerca de un valor constante.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Aunque el ancho de la zona oscilatoria se hace más pequeño, la altura máxima no tiende a 0.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 5) CONVERGENCIA LEJOS DE LA DISCONTINUIDAD&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def convergence_away_from_jumps(Nmax=300, exclude=0.15):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide el error supremo ||S_N - f||_∞ evitando:&lt;br /&gt;
      - vecindad de x=0&lt;br /&gt;
      - vecindad de x=±π&lt;br /&gt;
    para mostrar que en zonas continuas el error baja con N.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    M = 6000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    mask = (np.abs(x) &amp;gt; exclude) &amp;amp; (np.abs(np.abs(x) - np.pi) &amp;gt; exclude)&lt;br /&gt;
&lt;br /&gt;
    errors_sup = np.zeros(Nmax)&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        errors_sup[N-1] = np.max(np.abs(S[mask] - f[mask]))&lt;br /&gt;
&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, errors_sup)&lt;br /&gt;
    plt.title(&amp;quot;Error supremo lejos de discontinuidades (zona continua)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(r&amp;quot;$\|S_N - f\|_\infty$ (fuera de saltos)&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Print breve&lt;br /&gt;
    print(&amp;quot;Error supremo lejos de saltos:&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=10:  {errors_sup[9]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=50:  {errors_sup[49]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=100: {errors_sup[99]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N={Nmax}: {errors_sup[Nmax-1]:.6f}&amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# MAIN: que salga TODO al ejecutar&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    print_fourier_series_info()&lt;br /&gt;
    plot_global_and_zoom()&lt;br /&gt;
    gibbs_numerical_study(Nmax=300, window=0.3)&lt;br /&gt;
    convergence_away_from_jumps(Nmax=300, exclude=0.15)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Parámetros (fijamos f0=440)&lt;br /&gt;
#&lt;br /&gt;
f0 = 440.0                      # Hz&lt;br /&gt;
omega0 = 2*np.pi*f0             # rad/s&lt;br /&gt;
T = 1.0/f0                      # periodo&lt;br /&gt;
&lt;br /&gt;
# Mallado temporal, cambiamos periodos&lt;br /&gt;
n_periods = 3&lt;br /&gt;
t = np.linspace(0, n_periods*T, 6000)&lt;br /&gt;
&lt;br /&gt;
# Coeficientes a_k de la señal (solo senos)&lt;br /&gt;
a = {1: 1.0, 2: 0.6, 3: 0.3, 4: 0.1}&lt;br /&gt;
&lt;br /&gt;
def F(t):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a)&lt;br /&gt;
&lt;br /&gt;
def S_N(t, N):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a if k &amp;lt;= N)&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# 1) Gráfica: señal original y sumas parciales&lt;br /&gt;
# &lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in [1, 2, 3, 4]:&lt;br /&gt;
    plt.plot(t, S_N(t, N), label=f&amp;quot;S_{N}(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;F(t) y sumas parciales S_N(t)&amp;quot;)&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;
# 2) Gráfica: 3er armónico aislado&lt;br /&gt;
#&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, 0.3*np.sin(3*omega0*t), label=&amp;quot;F_3(t) = 0.3 sin(3 ω0 t)&amp;quot;)&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;, alpha=0.7)&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;3er armónico y comparación con la señal completa&amp;quot;)&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;
# 3) Estudio numérico del error vs N&lt;br /&gt;
#   - Error L2 (aprox. por trapecios)&lt;br /&gt;
#   - Error sup (norma infinita en la malla)&lt;br /&gt;
# &lt;br /&gt;
def L2_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    # Integral sobre el intervalo visualizado [0, n_periods*T]&lt;br /&gt;
    return np.sqrt(np.trapz(e**2, t))&lt;br /&gt;
&lt;br /&gt;
def sup_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    return np.max(np.abs(e))&lt;br /&gt;
&lt;br /&gt;
Ns = np.arange(1, 9)&lt;br /&gt;
err_L2 = np.array([L2_error(N) for N in Ns])&lt;br /&gt;
err_sup = np.array([sup_error(N) for N in Ns])&lt;br /&gt;
&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(Ns, err_L2, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error L2 (numérico)&amp;quot;)&lt;br /&gt;
plt.plot(Ns, err_sup, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error sup (malla)&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;error&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Convergencia numérica: error vs N&amp;quot;)&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;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x = np.linspace(-np.pi, np.pi, 4000)&lt;br /&gt;
&lt;br /&gt;
# Onda cuadrada 2π-periódica: -1 en (-π,0), +1 en (0,π)&lt;br /&gt;
f = np.where(x &amp;lt; 0, -1.0, 1.0)&lt;br /&gt;
f[np.isclose(x, 0.0)] = 0.0  # en el salto el valor da igual para el dibujo&lt;br /&gt;
&lt;br /&gt;
def fourier_square_partial_sum(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Suma parcial S_N de la serie de Fourier de la onda cuadrada:&lt;br /&gt;
    f(x) ~ (4/π) * sum_{k=1..∞} sin((2k-1)x)/(2k-1)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = np.arange(1, N + 1)&lt;br /&gt;
    odd = 2 * k - 1                       # 1,3,5,7,...&lt;br /&gt;
    terms = np.sin(np.outer(odd, x)) / odd[:, None]&lt;br /&gt;
    return (4/np.pi) * terms.sum(axis=0)&lt;br /&gt;
&lt;br /&gt;
N_list = [3, 10, 50]&lt;br /&gt;
plt.figure(figsize=(10, 4.8))&lt;br /&gt;
plt.plot(x, f, linewidth=2, label=&amp;quot;Onda cuadrada f(x)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in N_list:&lt;br /&gt;
    plt.plot(x, fourier_square_partial_sum(x, N), linewidth=1.5, label=f&amp;quot;Suma parcial N={N}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlim(-np.pi, np.pi)&lt;br /&gt;
plt.ylim(-1.6, 1.6)&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Fenómeno de Gibbs: aproximación de una onda cuadrada con series de Fourier&amp;quot;)&lt;br /&gt;
plt.grid(True, alpha=0.25)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104350</id>
		<title>Series de Fourier CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104350"/>
				<updated>2026-02-19T07:42:42Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: /* Serie de Fourier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ TrabajoED | Series de Fourier. Grupo CPP| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula Sánchez,Paula Mellado y Clara Garcia-Hoz}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:poster.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Referencias ===&lt;br /&gt;
&lt;br /&gt;
Sandro Salsa — Partial Differential Equations in Action&lt;br /&gt;
https://tutorial.math.lamar.edu/Classes/DE/ConvergenceFourierSeries.aspx&lt;br /&gt;
&lt;br /&gt;
https://www.physicsclassroom.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serie de Fourier ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas y la serie de Fourier de la función. &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;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 0) SERIE DE FOURIER (texto que se imprime al ejecutar)&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def print_fourier_series_info():&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*70)&lt;br /&gt;
    print(&amp;quot;ESTUDIO: Fenómeno de Gibbs en la onda cuadrada 2π-periódica&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nFunción (onda cuadrada 2π-periódica):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) =  1   si  0 &amp;lt; x &amp;lt; π&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) = -1   si -π &amp;lt; x &amp;lt; 0&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   y se extiende 2π-periódicamente: f(x+2π)=f(x).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSerie de Fourier:&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) ~ (4/π) * Σ_{n=1..∞}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSuma parcial (N términos):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   S_N(x) = (4/π) * Σ_{n=1..N}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nHechos clave (Gibbs):&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Cerca de las discontinuidades aparecen oscilaciones.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al aumentar N, las oscilaciones se 'concentran' cerca del salto,&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   pero el sobreimpulso máximo NO desaparece (tiende a una constante).&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Lejos del salto, S_N converge mejor (convergencia puntual en continuidad).&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 1) Definición de la onda cuadrada 2π-periódica&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def square_wave_2pi(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Onda cuadrada 2π-periódica con salto en 0 (y ±π).&lt;br /&gt;
    Se define en el intervalo principal (-π, π].&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    xr = (x + np.pi) % (2*np.pi) - np.pi  # reduce a (-π, π]&lt;br /&gt;
    y = np.where(xr &amp;gt; 0, 1.0, -1.0)&lt;br /&gt;
    return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 2) Suma parcial de Fourier&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def fourier_partial_sum_square(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    S_N(x) = (4/π) * sum_{n=1..N} sin((2n-1)x)/(2n-1)&lt;br /&gt;
    Vectorizado para x array.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = 2*np.arange(1, N+1) - 1  # 1,3,5,...,(2N-1)&lt;br /&gt;
    return (4/np.pi) * np.sum(np.sin(np.outer(k, x)) / k[:, None], axis=0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 3) DIBUJOS: global + zoom Gibbs&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def plot_global_and_zoom():&lt;br /&gt;
    # Global&lt;br /&gt;
    M = 5000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(x, f, linewidth=2, label=&amp;quot;f(x) (onda cuadrada)&amp;quot;)&lt;br /&gt;
    for N in [1, 3, 10, 50, 100]:&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        plt.plot(x, S, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Aproximación global de la onda cuadrada con sumas parciales&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Zoom cerca de x=0&lt;br /&gt;
    zoom = 0.5&lt;br /&gt;
    xz = np.linspace(-zoom, zoom, 3000)&lt;br /&gt;
    fz = square_wave_2pi(xz)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(xz, fz, linewidth=2, label=&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    for N in [5, 10, 20, 50, 100]:&lt;br /&gt;
        Sz = fourier_partial_sum_square(xz, N)&lt;br /&gt;
        plt.plot(xz, Sz, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Fenómeno de Gibbs (zoom cerca de la discontinuidad x=0)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 4) ANÁLISIS NUMÉRICO del Gibbs: overshoot/undershoot vs N&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def gibbs_numerical_study(Nmax=300, window=0.3):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide numéricamente:&lt;br /&gt;
      - overshoot a la derecha del salto: max(S_N) - 1&lt;br /&gt;
      - undershoot a la izquierda: (-1) - min(S_N) con signo ajustado&lt;br /&gt;
    Normaliza por el salto (que vale 2).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    jump = 2.0  # salto de -1 a +1&lt;br /&gt;
&lt;br /&gt;
    x_right = np.linspace(0, window, 6000, endpoint=True)&lt;br /&gt;
    x_left  = np.linspace(-window, 0, 6000, endpoint=True)&lt;br /&gt;
&lt;br /&gt;
    overshoot_vals = np.zeros(Nmax)&lt;br /&gt;
    undershoot_vals = np.zeros(Nmax)&lt;br /&gt;
&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
&lt;br /&gt;
        overshoot_vals[N-1] = np.max(Sr) - 1.0&lt;br /&gt;
        undershoot_vals[N-1] = -1.0 - np.min(Sl)&lt;br /&gt;
&lt;br /&gt;
    overshoot_rel = overshoot_vals / jump&lt;br /&gt;
    undershoot_rel = undershoot_vals / jump&lt;br /&gt;
&lt;br /&gt;
    # Gráfica overshoot/undershoot&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, overshoot_rel, label=&amp;quot;Sobreoscilación / salto&amp;quot;)&lt;br /&gt;
    plt.plot(N_axis, undershoot_rel, label=&amp;quot;Suboscilación / salto&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Medida numérica del Gibbs (normalizado por el salto)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud relativa&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Resumen en consola&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;-&amp;quot;*70)&lt;br /&gt;
    print(f&amp;quot;Resumen numérico local (buscado en ventana ±{window} alrededor del salto x=0)&amp;quot;)&lt;br /&gt;
    print(&amp;quot;El salto es 2 (de -1 a +1). Se muestra el sobreimpulso relativo over/jump.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    Ns_show = [5, 10, 20, 50, 100, 200, Nmax]&lt;br /&gt;
    print(&amp;quot;N\tmax(S_N) der.\tmin(S_N) izq.\tOvershoot\tUndershoot\tOver/jump&amp;quot;)&lt;br /&gt;
    for N in Ns_show:&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
        max_right = np.max(Sr)&lt;br /&gt;
        min_left  = np.min(Sl)&lt;br /&gt;
        over = max_right - 1.0&lt;br /&gt;
        under = -1.0 - min_left&lt;br /&gt;
        print(f&amp;quot;{N}\t{max_right:+.6f}\t\t{min_left:+.6f}\t\t{over:.6f}\t\t{under:.6f}\t\t{over/jump:.6f}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Reporte final (valores límite aproximados numéricamente)&lt;br /&gt;
    print(&amp;quot;\nObservación:&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al crecer N, el sobreimpulso relativo (over/jump) se estabiliza cerca de un valor constante.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Aunque el ancho de la zona oscilatoria se hace más pequeño, la altura máxima no tiende a 0.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 5) CONVERGENCIA LEJOS DE LA DISCONTINUIDAD&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def convergence_away_from_jumps(Nmax=300, exclude=0.15):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide el error supremo ||S_N - f||_∞ evitando:&lt;br /&gt;
      - vecindad de x=0&lt;br /&gt;
      - vecindad de x=±π&lt;br /&gt;
    para mostrar que en zonas continuas el error baja con N.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    M = 6000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    mask = (np.abs(x) &amp;gt; exclude) &amp;amp; (np.abs(np.abs(x) - np.pi) &amp;gt; exclude)&lt;br /&gt;
&lt;br /&gt;
    errors_sup = np.zeros(Nmax)&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        errors_sup[N-1] = np.max(np.abs(S[mask] - f[mask]))&lt;br /&gt;
&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, errors_sup)&lt;br /&gt;
    plt.title(&amp;quot;Error supremo lejos de discontinuidades (zona continua)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(r&amp;quot;$\|S_N - f\|_\infty$ (fuera de saltos)&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Print breve&lt;br /&gt;
    print(&amp;quot;Error supremo lejos de saltos:&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=10:  {errors_sup[9]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=50:  {errors_sup[49]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=100: {errors_sup[99]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N={Nmax}: {errors_sup[Nmax-1]:.6f}&amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# MAIN: que salga TODO al ejecutar&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    print_fourier_series_info()&lt;br /&gt;
    plot_global_and_zoom()&lt;br /&gt;
    gibbs_numerical_study(Nmax=300, window=0.3)&lt;br /&gt;
    convergence_away_from_jumps(Nmax=300, exclude=0.15)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Parámetros (fijamos f0=440)&lt;br /&gt;
#&lt;br /&gt;
f0 = 440.0                      # Hz&lt;br /&gt;
omega0 = 2*np.pi*f0             # rad/s&lt;br /&gt;
T = 1.0/f0                      # periodo&lt;br /&gt;
&lt;br /&gt;
# Mallado temporal, cambiamos periodos&lt;br /&gt;
n_periods = 3&lt;br /&gt;
t = np.linspace(0, n_periods*T, 6000)&lt;br /&gt;
&lt;br /&gt;
# Coeficientes a_k de la señal (solo senos)&lt;br /&gt;
a = {1: 1.0, 2: 0.6, 3: 0.3, 4: 0.1}&lt;br /&gt;
&lt;br /&gt;
def F(t):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a)&lt;br /&gt;
&lt;br /&gt;
def S_N(t, N):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a if k &amp;lt;= N)&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# 1) Gráfica: señal original y sumas parciales&lt;br /&gt;
# &lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in [1, 2, 3, 4]:&lt;br /&gt;
    plt.plot(t, S_N(t, N), label=f&amp;quot;S_{N}(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;F(t) y sumas parciales S_N(t)&amp;quot;)&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;
# 2) Gráfica: 3er armónico aislado&lt;br /&gt;
#&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, 0.3*np.sin(3*omega0*t), label=&amp;quot;F_3(t) = 0.3 sin(3 ω0 t)&amp;quot;)&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;, alpha=0.7)&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;3er armónico y comparación con la señal completa&amp;quot;)&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;
# 3) Estudio numérico del error vs N&lt;br /&gt;
#   - Error L2 (aprox. por trapecios)&lt;br /&gt;
#   - Error sup (norma infinita en la malla)&lt;br /&gt;
# &lt;br /&gt;
def L2_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    # Integral sobre el intervalo visualizado [0, n_periods*T]&lt;br /&gt;
    return np.sqrt(np.trapz(e**2, t))&lt;br /&gt;
&lt;br /&gt;
def sup_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    return np.max(np.abs(e))&lt;br /&gt;
&lt;br /&gt;
Ns = np.arange(1, 9)&lt;br /&gt;
err_L2 = np.array([L2_error(N) for N in Ns])&lt;br /&gt;
err_sup = np.array([sup_error(N) for N in Ns])&lt;br /&gt;
&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(Ns, err_L2, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error L2 (numérico)&amp;quot;)&lt;br /&gt;
plt.plot(Ns, err_sup, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error sup (malla)&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;error&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Convergencia numérica: error vs N&amp;quot;)&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;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x = np.linspace(-np.pi, np.pi, 4000)&lt;br /&gt;
&lt;br /&gt;
# Onda cuadrada 2π-periódica: -1 en (-π,0), +1 en (0,π)&lt;br /&gt;
f = np.where(x &amp;lt; 0, -1.0, 1.0)&lt;br /&gt;
f[np.isclose(x, 0.0)] = 0.0  # en el salto el valor da igual para el dibujo&lt;br /&gt;
&lt;br /&gt;
def fourier_square_partial_sum(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Suma parcial S_N de la serie de Fourier de la onda cuadrada:&lt;br /&gt;
    f(x) ~ (4/π) * sum_{k=1..∞} sin((2k-1)x)/(2k-1)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = np.arange(1, N + 1)&lt;br /&gt;
    odd = 2 * k - 1                       # 1,3,5,7,...&lt;br /&gt;
    terms = np.sin(np.outer(odd, x)) / odd[:, None]&lt;br /&gt;
    return (4/np.pi) * terms.sum(axis=0)&lt;br /&gt;
&lt;br /&gt;
N_list = [3, 10, 50]&lt;br /&gt;
plt.figure(figsize=(10, 4.8))&lt;br /&gt;
plt.plot(x, f, linewidth=2, label=&amp;quot;Onda cuadrada f(x)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in N_list:&lt;br /&gt;
    plt.plot(x, fourier_square_partial_sum(x, N), linewidth=1.5, label=f&amp;quot;Suma parcial N={N}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlim(-np.pi, np.pi)&lt;br /&gt;
plt.ylim(-1.6, 1.6)&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Fenómeno de Gibbs: aproximación de una onda cuadrada con series de Fourier&amp;quot;)&lt;br /&gt;
plt.grid(True, alpha=0.25)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104349</id>
		<title>Series de Fourier CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104349"/>
				<updated>2026-02-19T07:38:54Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: /* Serie de Fourier Función Exponencial */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ TrabajoED | Series de Fourier. Grupo CPP| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula Sánchez,Paula Mellado y Clara Garcia-Hoz}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:poster.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serie de Fourier ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas y la serie de Fourier de la función. &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;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 0) SERIE DE FOURIER (texto que se imprime al ejecutar)&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def print_fourier_series_info():&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*70)&lt;br /&gt;
    print(&amp;quot;ESTUDIO: Fenómeno de Gibbs en la onda cuadrada 2π-periódica&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nFunción (onda cuadrada 2π-periódica):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) =  1   si  0 &amp;lt; x &amp;lt; π&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) = -1   si -π &amp;lt; x &amp;lt; 0&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   y se extiende 2π-periódicamente: f(x+2π)=f(x).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSerie de Fourier:&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) ~ (4/π) * Σ_{n=1..∞}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSuma parcial (N términos):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   S_N(x) = (4/π) * Σ_{n=1..N}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nHechos clave (Gibbs):&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Cerca de las discontinuidades aparecen oscilaciones.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al aumentar N, las oscilaciones se 'concentran' cerca del salto,&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   pero el sobreimpulso máximo NO desaparece (tiende a una constante).&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Lejos del salto, S_N converge mejor (convergencia puntual en continuidad).&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 1) Definición de la onda cuadrada 2π-periódica&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def square_wave_2pi(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Onda cuadrada 2π-periódica con salto en 0 (y ±π).&lt;br /&gt;
    Se define en el intervalo principal (-π, π].&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    xr = (x + np.pi) % (2*np.pi) - np.pi  # reduce a (-π, π]&lt;br /&gt;
    y = np.where(xr &amp;gt; 0, 1.0, -1.0)&lt;br /&gt;
    return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 2) Suma parcial de Fourier&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def fourier_partial_sum_square(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    S_N(x) = (4/π) * sum_{n=1..N} sin((2n-1)x)/(2n-1)&lt;br /&gt;
    Vectorizado para x array.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = 2*np.arange(1, N+1) - 1  # 1,3,5,...,(2N-1)&lt;br /&gt;
    return (4/np.pi) * np.sum(np.sin(np.outer(k, x)) / k[:, None], axis=0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 3) DIBUJOS: global + zoom Gibbs&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def plot_global_and_zoom():&lt;br /&gt;
    # Global&lt;br /&gt;
    M = 5000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(x, f, linewidth=2, label=&amp;quot;f(x) (onda cuadrada)&amp;quot;)&lt;br /&gt;
    for N in [1, 3, 10, 50, 100]:&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        plt.plot(x, S, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Aproximación global de la onda cuadrada con sumas parciales&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Zoom cerca de x=0&lt;br /&gt;
    zoom = 0.5&lt;br /&gt;
    xz = np.linspace(-zoom, zoom, 3000)&lt;br /&gt;
    fz = square_wave_2pi(xz)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(xz, fz, linewidth=2, label=&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    for N in [5, 10, 20, 50, 100]:&lt;br /&gt;
        Sz = fourier_partial_sum_square(xz, N)&lt;br /&gt;
        plt.plot(xz, Sz, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Fenómeno de Gibbs (zoom cerca de la discontinuidad x=0)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 4) ANÁLISIS NUMÉRICO del Gibbs: overshoot/undershoot vs N&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def gibbs_numerical_study(Nmax=300, window=0.3):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide numéricamente:&lt;br /&gt;
      - overshoot a la derecha del salto: max(S_N) - 1&lt;br /&gt;
      - undershoot a la izquierda: (-1) - min(S_N) con signo ajustado&lt;br /&gt;
    Normaliza por el salto (que vale 2).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    jump = 2.0  # salto de -1 a +1&lt;br /&gt;
&lt;br /&gt;
    x_right = np.linspace(0, window, 6000, endpoint=True)&lt;br /&gt;
    x_left  = np.linspace(-window, 0, 6000, endpoint=True)&lt;br /&gt;
&lt;br /&gt;
    overshoot_vals = np.zeros(Nmax)&lt;br /&gt;
    undershoot_vals = np.zeros(Nmax)&lt;br /&gt;
&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
&lt;br /&gt;
        overshoot_vals[N-1] = np.max(Sr) - 1.0&lt;br /&gt;
        undershoot_vals[N-1] = -1.0 - np.min(Sl)&lt;br /&gt;
&lt;br /&gt;
    overshoot_rel = overshoot_vals / jump&lt;br /&gt;
    undershoot_rel = undershoot_vals / jump&lt;br /&gt;
&lt;br /&gt;
    # Gráfica overshoot/undershoot&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, overshoot_rel, label=&amp;quot;Sobreoscilación / salto&amp;quot;)&lt;br /&gt;
    plt.plot(N_axis, undershoot_rel, label=&amp;quot;Suboscilación / salto&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Medida numérica del Gibbs (normalizado por el salto)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud relativa&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Resumen en consola&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;-&amp;quot;*70)&lt;br /&gt;
    print(f&amp;quot;Resumen numérico local (buscado en ventana ±{window} alrededor del salto x=0)&amp;quot;)&lt;br /&gt;
    print(&amp;quot;El salto es 2 (de -1 a +1). Se muestra el sobreimpulso relativo over/jump.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    Ns_show = [5, 10, 20, 50, 100, 200, Nmax]&lt;br /&gt;
    print(&amp;quot;N\tmax(S_N) der.\tmin(S_N) izq.\tOvershoot\tUndershoot\tOver/jump&amp;quot;)&lt;br /&gt;
    for N in Ns_show:&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
        max_right = np.max(Sr)&lt;br /&gt;
        min_left  = np.min(Sl)&lt;br /&gt;
        over = max_right - 1.0&lt;br /&gt;
        under = -1.0 - min_left&lt;br /&gt;
        print(f&amp;quot;{N}\t{max_right:+.6f}\t\t{min_left:+.6f}\t\t{over:.6f}\t\t{under:.6f}\t\t{over/jump:.6f}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Reporte final (valores límite aproximados numéricamente)&lt;br /&gt;
    print(&amp;quot;\nObservación:&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al crecer N, el sobreimpulso relativo (over/jump) se estabiliza cerca de un valor constante.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Aunque el ancho de la zona oscilatoria se hace más pequeño, la altura máxima no tiende a 0.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 5) CONVERGENCIA LEJOS DE LA DISCONTINUIDAD&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def convergence_away_from_jumps(Nmax=300, exclude=0.15):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide el error supremo ||S_N - f||_∞ evitando:&lt;br /&gt;
      - vecindad de x=0&lt;br /&gt;
      - vecindad de x=±π&lt;br /&gt;
    para mostrar que en zonas continuas el error baja con N.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    M = 6000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    mask = (np.abs(x) &amp;gt; exclude) &amp;amp; (np.abs(np.abs(x) - np.pi) &amp;gt; exclude)&lt;br /&gt;
&lt;br /&gt;
    errors_sup = np.zeros(Nmax)&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        errors_sup[N-1] = np.max(np.abs(S[mask] - f[mask]))&lt;br /&gt;
&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, errors_sup)&lt;br /&gt;
    plt.title(&amp;quot;Error supremo lejos de discontinuidades (zona continua)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(r&amp;quot;$\|S_N - f\|_\infty$ (fuera de saltos)&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Print breve&lt;br /&gt;
    print(&amp;quot;Error supremo lejos de saltos:&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=10:  {errors_sup[9]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=50:  {errors_sup[49]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=100: {errors_sup[99]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N={Nmax}: {errors_sup[Nmax-1]:.6f}&amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# MAIN: que salga TODO al ejecutar&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    print_fourier_series_info()&lt;br /&gt;
    plot_global_and_zoom()&lt;br /&gt;
    gibbs_numerical_study(Nmax=300, window=0.3)&lt;br /&gt;
    convergence_away_from_jumps(Nmax=300, exclude=0.15)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Parámetros (fijamos f0=440)&lt;br /&gt;
#&lt;br /&gt;
f0 = 440.0                      # Hz&lt;br /&gt;
omega0 = 2*np.pi*f0             # rad/s&lt;br /&gt;
T = 1.0/f0                      # periodo&lt;br /&gt;
&lt;br /&gt;
# Mallado temporal, cambiamos periodos&lt;br /&gt;
n_periods = 3&lt;br /&gt;
t = np.linspace(0, n_periods*T, 6000)&lt;br /&gt;
&lt;br /&gt;
# Coeficientes a_k de la señal (solo senos)&lt;br /&gt;
a = {1: 1.0, 2: 0.6, 3: 0.3, 4: 0.1}&lt;br /&gt;
&lt;br /&gt;
def F(t):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a)&lt;br /&gt;
&lt;br /&gt;
def S_N(t, N):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a if k &amp;lt;= N)&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# 1) Gráfica: señal original y sumas parciales&lt;br /&gt;
# &lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in [1, 2, 3, 4]:&lt;br /&gt;
    plt.plot(t, S_N(t, N), label=f&amp;quot;S_{N}(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;F(t) y sumas parciales S_N(t)&amp;quot;)&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;
# 2) Gráfica: 3er armónico aislado&lt;br /&gt;
#&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, 0.3*np.sin(3*omega0*t), label=&amp;quot;F_3(t) = 0.3 sin(3 ω0 t)&amp;quot;)&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;, alpha=0.7)&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;3er armónico y comparación con la señal completa&amp;quot;)&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;
# 3) Estudio numérico del error vs N&lt;br /&gt;
#   - Error L2 (aprox. por trapecios)&lt;br /&gt;
#   - Error sup (norma infinita en la malla)&lt;br /&gt;
# &lt;br /&gt;
def L2_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    # Integral sobre el intervalo visualizado [0, n_periods*T]&lt;br /&gt;
    return np.sqrt(np.trapz(e**2, t))&lt;br /&gt;
&lt;br /&gt;
def sup_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    return np.max(np.abs(e))&lt;br /&gt;
&lt;br /&gt;
Ns = np.arange(1, 9)&lt;br /&gt;
err_L2 = np.array([L2_error(N) for N in Ns])&lt;br /&gt;
err_sup = np.array([sup_error(N) for N in Ns])&lt;br /&gt;
&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(Ns, err_L2, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error L2 (numérico)&amp;quot;)&lt;br /&gt;
plt.plot(Ns, err_sup, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error sup (malla)&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;error&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Convergencia numérica: error vs N&amp;quot;)&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;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x = np.linspace(-np.pi, np.pi, 4000)&lt;br /&gt;
&lt;br /&gt;
# Onda cuadrada 2π-periódica: -1 en (-π,0), +1 en (0,π)&lt;br /&gt;
f = np.where(x &amp;lt; 0, -1.0, 1.0)&lt;br /&gt;
f[np.isclose(x, 0.0)] = 0.0  # en el salto el valor da igual para el dibujo&lt;br /&gt;
&lt;br /&gt;
def fourier_square_partial_sum(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Suma parcial S_N de la serie de Fourier de la onda cuadrada:&lt;br /&gt;
    f(x) ~ (4/π) * sum_{k=1..∞} sin((2k-1)x)/(2k-1)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = np.arange(1, N + 1)&lt;br /&gt;
    odd = 2 * k - 1                       # 1,3,5,7,...&lt;br /&gt;
    terms = np.sin(np.outer(odd, x)) / odd[:, None]&lt;br /&gt;
    return (4/np.pi) * terms.sum(axis=0)&lt;br /&gt;
&lt;br /&gt;
N_list = [3, 10, 50]&lt;br /&gt;
plt.figure(figsize=(10, 4.8))&lt;br /&gt;
plt.plot(x, f, linewidth=2, label=&amp;quot;Onda cuadrada f(x)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in N_list:&lt;br /&gt;
    plt.plot(x, fourier_square_partial_sum(x, N), linewidth=1.5, label=f&amp;quot;Suma parcial N={N}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlim(-np.pi, np.pi)&lt;br /&gt;
plt.ylim(-1.6, 1.6)&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Fenómeno de Gibbs: aproximación de una onda cuadrada con series de Fourier&amp;quot;)&lt;br /&gt;
plt.grid(True, alpha=0.25)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104348</id>
		<title>Series de Fourier CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104348"/>
				<updated>2026-02-19T07:38:40Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ TrabajoED | Series de Fourier. Grupo CPP| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula Sánchez,Paula Mellado y Clara Garcia-Hoz}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:poster.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serie de Fourier Función Exponencial ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas y la serie de Fourier de la función. &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;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 0) SERIE DE FOURIER (texto que se imprime al ejecutar)&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def print_fourier_series_info():&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*70)&lt;br /&gt;
    print(&amp;quot;ESTUDIO: Fenómeno de Gibbs en la onda cuadrada 2π-periódica&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nFunción (onda cuadrada 2π-periódica):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) =  1   si  0 &amp;lt; x &amp;lt; π&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) = -1   si -π &amp;lt; x &amp;lt; 0&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   y se extiende 2π-periódicamente: f(x+2π)=f(x).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSerie de Fourier:&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   f(x) ~ (4/π) * Σ_{n=1..∞}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nSuma parcial (N términos):&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   S_N(x) = (4/π) * Σ_{n=1..N}  sin((2n-1)x)/(2n-1)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nHechos clave (Gibbs):&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Cerca de las discontinuidades aparecen oscilaciones.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al aumentar N, las oscilaciones se 'concentran' cerca del salto,&amp;quot;)&lt;br /&gt;
    print(&amp;quot;   pero el sobreimpulso máximo NO desaparece (tiende a una constante).&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Lejos del salto, S_N converge mejor (convergencia puntual en continuidad).&amp;quot;)&lt;br /&gt;
    print(&amp;quot;=&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 1) Definición de la onda cuadrada 2π-periódica&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def square_wave_2pi(x):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Onda cuadrada 2π-periódica con salto en 0 (y ±π).&lt;br /&gt;
    Se define en el intervalo principal (-π, π].&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    xr = (x + np.pi) % (2*np.pi) - np.pi  # reduce a (-π, π]&lt;br /&gt;
    y = np.where(xr &amp;gt; 0, 1.0, -1.0)&lt;br /&gt;
    return y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 2) Suma parcial de Fourier&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def fourier_partial_sum_square(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    S_N(x) = (4/π) * sum_{n=1..N} sin((2n-1)x)/(2n-1)&lt;br /&gt;
    Vectorizado para x array.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = 2*np.arange(1, N+1) - 1  # 1,3,5,...,(2N-1)&lt;br /&gt;
    return (4/np.pi) * np.sum(np.sin(np.outer(k, x)) / k[:, None], axis=0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 3) DIBUJOS: global + zoom Gibbs&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def plot_global_and_zoom():&lt;br /&gt;
    # Global&lt;br /&gt;
    M = 5000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(x, f, linewidth=2, label=&amp;quot;f(x) (onda cuadrada)&amp;quot;)&lt;br /&gt;
    for N in [1, 3, 10, 50, 100]:&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        plt.plot(x, S, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Aproximación global de la onda cuadrada con sumas parciales&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Zoom cerca de x=0&lt;br /&gt;
    zoom = 0.5&lt;br /&gt;
    xz = np.linspace(-zoom, zoom, 3000)&lt;br /&gt;
    fz = square_wave_2pi(xz)&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(xz, fz, linewidth=2, label=&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    for N in [5, 10, 20, 50, 100]:&lt;br /&gt;
        Sz = fourier_partial_sum_square(xz, N)&lt;br /&gt;
        plt.plot(xz, Sz, label=f&amp;quot;S_{N}(x)&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Fenómeno de Gibbs (zoom cerca de la discontinuidad x=0)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
    plt.ylim(-1.6, 1.6)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 4) ANÁLISIS NUMÉRICO del Gibbs: overshoot/undershoot vs N&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def gibbs_numerical_study(Nmax=300, window=0.3):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide numéricamente:&lt;br /&gt;
      - overshoot a la derecha del salto: max(S_N) - 1&lt;br /&gt;
      - undershoot a la izquierda: (-1) - min(S_N) con signo ajustado&lt;br /&gt;
    Normaliza por el salto (que vale 2).&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    jump = 2.0  # salto de -1 a +1&lt;br /&gt;
&lt;br /&gt;
    x_right = np.linspace(0, window, 6000, endpoint=True)&lt;br /&gt;
    x_left  = np.linspace(-window, 0, 6000, endpoint=True)&lt;br /&gt;
&lt;br /&gt;
    overshoot_vals = np.zeros(Nmax)&lt;br /&gt;
    undershoot_vals = np.zeros(Nmax)&lt;br /&gt;
&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
&lt;br /&gt;
        overshoot_vals[N-1] = np.max(Sr) - 1.0&lt;br /&gt;
        undershoot_vals[N-1] = -1.0 - np.min(Sl)&lt;br /&gt;
&lt;br /&gt;
    overshoot_rel = overshoot_vals / jump&lt;br /&gt;
    undershoot_rel = undershoot_vals / jump&lt;br /&gt;
&lt;br /&gt;
    # Gráfica overshoot/undershoot&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, overshoot_rel, label=&amp;quot;Sobreoscilación / salto&amp;quot;)&lt;br /&gt;
    plt.plot(N_axis, undershoot_rel, label=&amp;quot;Suboscilación / salto&amp;quot;)&lt;br /&gt;
    plt.title(&amp;quot;Medida numérica del Gibbs (normalizado por el salto)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;amplitud relativa&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Resumen en consola&lt;br /&gt;
    print(&amp;quot;\n&amp;quot; + &amp;quot;-&amp;quot;*70)&lt;br /&gt;
    print(f&amp;quot;Resumen numérico local (buscado en ventana ±{window} alrededor del salto x=0)&amp;quot;)&lt;br /&gt;
    print(&amp;quot;El salto es 2 (de -1 a +1). Se muestra el sobreimpulso relativo over/jump.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70)&lt;br /&gt;
&lt;br /&gt;
    Ns_show = [5, 10, 20, 50, 100, 200, Nmax]&lt;br /&gt;
    print(&amp;quot;N\tmax(S_N) der.\tmin(S_N) izq.\tOvershoot\tUndershoot\tOver/jump&amp;quot;)&lt;br /&gt;
    for N in Ns_show:&lt;br /&gt;
        Sr = fourier_partial_sum_square(x_right, N)&lt;br /&gt;
        Sl = fourier_partial_sum_square(x_left, N)&lt;br /&gt;
        max_right = np.max(Sr)&lt;br /&gt;
        min_left  = np.min(Sl)&lt;br /&gt;
        over = max_right - 1.0&lt;br /&gt;
        under = -1.0 - min_left&lt;br /&gt;
        print(f&amp;quot;{N}\t{max_right:+.6f}\t\t{min_left:+.6f}\t\t{over:.6f}\t\t{under:.6f}\t\t{over/jump:.6f}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Reporte final (valores límite aproximados numéricamente)&lt;br /&gt;
    print(&amp;quot;\nObservación:&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Al crecer N, el sobreimpulso relativo (over/jump) se estabiliza cerca de un valor constante.&amp;quot;)&lt;br /&gt;
    print(&amp;quot; - Aunque el ancho de la zona oscilatoria se hace más pequeño, la altura máxima no tiende a 0.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;-&amp;quot;*70 + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# 5) CONVERGENCIA LEJOS DE LA DISCONTINUIDAD&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
def convergence_away_from_jumps(Nmax=300, exclude=0.15):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Mide el error supremo ||S_N - f||_∞ evitando:&lt;br /&gt;
      - vecindad de x=0&lt;br /&gt;
      - vecindad de x=±π&lt;br /&gt;
    para mostrar que en zonas continuas el error baja con N.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    M = 6000&lt;br /&gt;
    x = np.linspace(-np.pi, np.pi, M, endpoint=True)&lt;br /&gt;
    f = square_wave_2pi(x)&lt;br /&gt;
&lt;br /&gt;
    mask = (np.abs(x) &amp;gt; exclude) &amp;amp; (np.abs(np.abs(x) - np.pi) &amp;gt; exclude)&lt;br /&gt;
&lt;br /&gt;
    errors_sup = np.zeros(Nmax)&lt;br /&gt;
    for N in range(1, Nmax+1):&lt;br /&gt;
        S = fourier_partial_sum_square(x, N)&lt;br /&gt;
        errors_sup[N-1] = np.max(np.abs(S[mask] - f[mask]))&lt;br /&gt;
&lt;br /&gt;
    N_axis = np.arange(1, Nmax+1)&lt;br /&gt;
    plt.figure()&lt;br /&gt;
    plt.plot(N_axis, errors_sup)&lt;br /&gt;
    plt.title(&amp;quot;Error supremo lejos de discontinuidades (zona continua)&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
    plt.ylabel(r&amp;quot;$\|S_N - f\|_\infty$ (fuera de saltos)&amp;quot;)&lt;br /&gt;
    plt.grid(True, alpha=0.3)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
    # Print breve&lt;br /&gt;
    print(&amp;quot;Error supremo lejos de saltos:&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=10:  {errors_sup[9]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=50:  {errors_sup[49]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N=100: {errors_sup[99]:.6f}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot; - N={Nmax}: {errors_sup[Nmax-1]:.6f}&amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============================================================&lt;br /&gt;
# MAIN: que salga TODO al ejecutar&lt;br /&gt;
# ============================================================&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    print_fourier_series_info()&lt;br /&gt;
    plot_global_and_zoom()&lt;br /&gt;
    gibbs_numerical_study(Nmax=300, window=0.3)&lt;br /&gt;
    convergence_away_from_jumps(Nmax=300, exclude=0.15)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Parámetros (fijamos f0=440)&lt;br /&gt;
#&lt;br /&gt;
f0 = 440.0                      # Hz&lt;br /&gt;
omega0 = 2*np.pi*f0             # rad/s&lt;br /&gt;
T = 1.0/f0                      # periodo&lt;br /&gt;
&lt;br /&gt;
# Mallado temporal, cambiamos periodos&lt;br /&gt;
n_periods = 3&lt;br /&gt;
t = np.linspace(0, n_periods*T, 6000)&lt;br /&gt;
&lt;br /&gt;
# Coeficientes a_k de la señal (solo senos)&lt;br /&gt;
a = {1: 1.0, 2: 0.6, 3: 0.3, 4: 0.1}&lt;br /&gt;
&lt;br /&gt;
def F(t):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a)&lt;br /&gt;
&lt;br /&gt;
def S_N(t, N):&lt;br /&gt;
    return sum(a[k]*np.sin(k*omega0*t) for k in a if k &amp;lt;= N)&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# 1) Gráfica: señal original y sumas parciales&lt;br /&gt;
# &lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in [1, 2, 3, 4]:&lt;br /&gt;
    plt.plot(t, S_N(t, N), label=f&amp;quot;S_{N}(t)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;F(t) y sumas parciales S_N(t)&amp;quot;)&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;
# 2) Gráfica: 3er armónico aislado&lt;br /&gt;
#&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(t, 0.3*np.sin(3*omega0*t), label=&amp;quot;F_3(t) = 0.3 sin(3 ω0 t)&amp;quot;)&lt;br /&gt;
plt.plot(t, F(t), label=&amp;quot;F(t)&amp;quot;, alpha=0.7)&lt;br /&gt;
plt.xlabel(&amp;quot;t (s)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;3er armónico y comparación con la señal completa&amp;quot;)&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;
# 3) Estudio numérico del error vs N&lt;br /&gt;
#   - Error L2 (aprox. por trapecios)&lt;br /&gt;
#   - Error sup (norma infinita en la malla)&lt;br /&gt;
# &lt;br /&gt;
def L2_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    # Integral sobre el intervalo visualizado [0, n_periods*T]&lt;br /&gt;
    return np.sqrt(np.trapz(e**2, t))&lt;br /&gt;
&lt;br /&gt;
def sup_error(N):&lt;br /&gt;
    e = F(t) - S_N(t, N)&lt;br /&gt;
    return np.max(np.abs(e))&lt;br /&gt;
&lt;br /&gt;
Ns = np.arange(1, 9)&lt;br /&gt;
err_L2 = np.array([L2_error(N) for N in Ns])&lt;br /&gt;
err_sup = np.array([sup_error(N) for N in Ns])&lt;br /&gt;
&lt;br /&gt;
plt.figure()&lt;br /&gt;
plt.plot(Ns, err_L2, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error L2 (numérico)&amp;quot;)&lt;br /&gt;
plt.plot(Ns, err_sup, marker=&amp;quot;o&amp;quot;, label=&amp;quot;Error sup (malla)&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;N (número de términos)&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;error&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Convergencia numérica: error vs N&amp;quot;)&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;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Dominio&lt;br /&gt;
x = np.linspace(-np.pi, np.pi, 4000)&lt;br /&gt;
&lt;br /&gt;
# Onda cuadrada 2π-periódica: -1 en (-π,0), +1 en (0,π)&lt;br /&gt;
f = np.where(x &amp;lt; 0, -1.0, 1.0)&lt;br /&gt;
f[np.isclose(x, 0.0)] = 0.0  # en el salto el valor da igual para el dibujo&lt;br /&gt;
&lt;br /&gt;
def fourier_square_partial_sum(x, N):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Suma parcial S_N de la serie de Fourier de la onda cuadrada:&lt;br /&gt;
    f(x) ~ (4/π) * sum_{k=1..∞} sin((2k-1)x)/(2k-1)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    k = np.arange(1, N + 1)&lt;br /&gt;
    odd = 2 * k - 1                       # 1,3,5,7,...&lt;br /&gt;
    terms = np.sin(np.outer(odd, x)) / odd[:, None]&lt;br /&gt;
    return (4/np.pi) * terms.sum(axis=0)&lt;br /&gt;
&lt;br /&gt;
N_list = [3, 10, 50]&lt;br /&gt;
plt.figure(figsize=(10, 4.8))&lt;br /&gt;
plt.plot(x, f, linewidth=2, label=&amp;quot;Onda cuadrada f(x)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
for N in N_list:&lt;br /&gt;
    plt.plot(x, fourier_square_partial_sum(x, N), linewidth=1.5, label=f&amp;quot;Suma parcial N={N}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.xlim(-np.pi, np.pi)&lt;br /&gt;
plt.ylim(-1.6, 1.6)&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;amplitud&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Fenómeno de Gibbs: aproximación de una onda cuadrada con series de Fourier&amp;quot;)&lt;br /&gt;
plt.grid(True, alpha=0.25)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104346</id>
		<title>Series de Fourier CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104346"/>
				<updated>2026-02-19T07:30:14Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ TrabajoED | Series de Fourier. Grupo CPP| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Paula Sánchez,Paula Mellado y Clara Garcia-Hoz}}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:poster.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Serie de Fourier Función Exponencial ===&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>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104345</id>
		<title>Series de Fourier CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104345"/>
				<updated>2026-02-19T07:25:42Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Archivo:poster.jpg]]&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Poster.jpg&amp;diff=104344</id>
		<title>Archivo:Poster.jpg</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Poster.jpg&amp;diff=104344"/>
				<updated>2026-02-19T07:24:43Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104168</id>
		<title>Series de Fourier CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104168"/>
				<updated>2026-02-18T20:30:40Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: Página blanqueada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104165</id>
		<title>Series de Fourier CPP</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier_CPP&amp;diff=104165"/>
				<updated>2026-02-18T20:26:54Z</updated>
		
		<summary type="html">&lt;p&gt;Paulasanchezjauregui: Página creada con «import numpy as np import matplotlib.pyplot as plt from scipy.integrate import trapezoid  def base_trigonometrica(n): 	#Puntos donde se grafica 	x = np.linspace(-1,1,1000)...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;/div&gt;</summary>
		<author><name>Paulasanchezjauregui</name></author>	</entry>

	</feed>