<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://mat.caminos.upm.es/w/index.php?action=history&amp;feed=atom&amp;title=Series_de_Fourier%28PDM%29</id>
		<title>Series de Fourier(PDM) - Historial de revisiones</title>
		<link rel="self" type="application/atom+xml" href="https://mat.caminos.upm.es/w/index.php?action=history&amp;feed=atom&amp;title=Series_de_Fourier%28PDM%29"/>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier(PDM)&amp;action=history"/>
		<updated>2026-04-23T23:58:45Z</updated>
		<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier(PDM)&amp;diff=104378&amp;oldid=prev</id>
		<title>DiegoGR: /* Poster */</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier(PDM)&amp;diff=104378&amp;oldid=prev"/>
				<updated>2026-02-23T22:33:11Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Poster&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='es'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revisión del 22:33 23 feb 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l8&quot; &gt;Línea 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 8:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Poster===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Poster===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Archivo:&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;FinalPosterDefinitivo&lt;/del&gt;.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;jpeg&lt;/del&gt;|center|800px]]]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Archivo:&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;PosterFInal VF(1)&lt;/ins&gt;.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;png&lt;/ins&gt;|center|800px]]]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Códigos===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Códigos===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>DiegoGR</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier(PDM)&amp;diff=104323&amp;oldid=prev</id>
		<title>DiegoGR en 23:52 18 feb 2026</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier(PDM)&amp;diff=104323&amp;oldid=prev"/>
				<updated>2026-02-18T23:52:56Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='es'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revisión del 23:52 18 feb 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l326&quot; &gt;Línea 326:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 326:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;plt.show()&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;plt.show()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Categoría:EDP]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Categoría:EDP25/26]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>DiegoGR</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier(PDM)&amp;diff=104321&amp;oldid=prev</id>
		<title>DiegoGR: /* Series de Fourier DPM */</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier(PDM)&amp;diff=104321&amp;oldid=prev"/>
				<updated>2026-02-18T23:52:14Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Series de Fourier DPM&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='es'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revisión del 23:52 18 feb 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l5&quot; &gt;Línea 5:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 5:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Manuel Herreros Zarco}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Manuel Herreros Zarco}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Series de Fourier &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;DPM&lt;/del&gt;==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Series de Fourier==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Poster===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Poster===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>DiegoGR</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier(PDM)&amp;diff=104319&amp;oldid=prev</id>
		<title>DiegoGR: Página creada con «{{ TrabajoED | Series de Fourier(DPM)| EDP|2025-26 | Diego García Raposo  Paula Dopico Muñoz  Manuel Herreros Zarco}}  ==Seri...»</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Series_de_Fourier(PDM)&amp;diff=104319&amp;oldid=prev"/>
				<updated>2026-02-18T23:52:00Z</updated>
		
		<summary type="html">&lt;p&gt;Página creada con «{{ TrabajoED | Series de Fourier(DPM)| &lt;a href=&quot;/wiki/Categor%C3%ADa:EDP&quot; title=&quot;Categoría:EDP&quot;&gt;EDP&lt;/a&gt;|&lt;a href=&quot;/wiki/Categor%C3%ADa:EDP25/26&quot; title=&quot;Categoría:EDP25/26&quot;&gt;2025-26&lt;/a&gt; | Diego García Raposo  Paula Dopico Muñoz  Manuel Herreros Zarco}}  ==Seri...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{ TrabajoED | Series de Fourier(DPM)| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Diego García Raposo&lt;br /&gt;
&lt;br /&gt;
Paula Dopico Muñoz&lt;br /&gt;
&lt;br /&gt;
Manuel Herreros Zarco}}&lt;br /&gt;
&lt;br /&gt;
==Series de Fourier DPM==&lt;br /&gt;
&lt;br /&gt;
===Poster===&lt;br /&gt;
[[Archivo:FinalPosterDefinitivo.jpeg|center|800px]]]]&lt;br /&gt;
&lt;br /&gt;
===Códigos===&lt;br /&gt;
&amp;lt;pre&amp;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;
T = 1.0 ### Longitud del intervalo&lt;br /&gt;
n_max = 3  # La frecuencua hasta la que pinta senos y cosenos para representar la base lineal&lt;br /&gt;
M = 3000 ### Número de puntos en X&lt;br /&gt;
&lt;br /&gt;
x = np.linspace(-T, T, M) ### Genera un vector de M puntos entre -T y T&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10,5)) ### Tamaño de la gráfica, pa q sea grande o chiquita pero no afecta a los puntos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
phi0 = (1/np.sqrt(2*T)) * np.ones_like(x) ### Genera un vector de 3000 ptos con cada uno la función cte de la basepara luego representarlo&lt;br /&gt;
plt.plot(x, phi0, linewidth=3) ### Pinta la linea generada por la función phi0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for n in range(1, n_max + 1): ### Pinta las funciones seno y coseno asociadas a cada frecuencia en el plot&lt;br /&gt;
    phi_c = (1/np.sqrt(T)) * np.cos(n*np.pi*x/T) ### funcion coseno&lt;br /&gt;
    phi_s = (1/np.sqrt(T)) * np.sin(n*np.pi*x/T) ### funcion seno&lt;br /&gt;
    &lt;br /&gt;
    plt.plot(x, phi_c)&lt;br /&gt;
    plt.plot(x, phi_s) &lt;br /&gt;
&lt;br /&gt;
plt.title(&amp;quot;Base trigonométrica ortonormal en [-T, T]&amp;quot;) ### SIstema de representación de python&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#nuevo código&lt;br /&gt;
import math&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------- función de ejemplo ----------&lt;br /&gt;
def f(x):&lt;br /&gt;
    return x   # cambia aquí si quieres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------- coeficientes numéricos ----------&lt;br /&gt;
def fourier_coeffs_numeric(L, N, M=20000):&lt;br /&gt;
    xs = np.linspace(0.0, L, M)&lt;br /&gt;
    fx = f(xs)&lt;br /&gt;
&lt;br /&gt;
    a0 = (2.0 / L) * np.trapz(fx, xs)&lt;br /&gt;
&lt;br /&gt;
    a = np.zeros(N + 1)&lt;br /&gt;
    b = np.zeros(N + 1)&lt;br /&gt;
&lt;br /&gt;
    for n in range(1, N + 1):&lt;br /&gt;
        c = np.cos(2.0 * math.pi * n * xs / L)&lt;br /&gt;
        s = np.sin(2.0 * math.pi * n * xs / L)&lt;br /&gt;
&lt;br /&gt;
        a[n] = (2.0 / L) * np.trapz(fx * c, xs)&lt;br /&gt;
        b[n] = (2.0 / L) * np.trapz(fx * s, xs)&lt;br /&gt;
&lt;br /&gt;
    return a0, a, b&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def S_N(x, L, N, a0, a, b):&lt;br /&gt;
    val = a0 / 2.0&lt;br /&gt;
    for n in range(1, N + 1):&lt;br /&gt;
        val += (&lt;br /&gt;
            a[n] * np.cos(2.0 * math.pi * n * x / L)&lt;br /&gt;
            + b[n] * np.sin(2.0 * math.pi * n * x / L)&lt;br /&gt;
        )&lt;br /&gt;
    return val&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------- visualizar error en muchos puntos ----------&lt;br /&gt;
def visualize_error(Ls, N, num_points=500):&lt;br /&gt;
&lt;br /&gt;
    xs = np.linspace(0.001, min(Ls), num_points)  # intervalo común&lt;br /&gt;
&lt;br /&gt;
    plt.figure()&lt;br /&gt;
&lt;br /&gt;
    for L in Ls:&lt;br /&gt;
&lt;br /&gt;
        a0, a, b = fourier_coeffs_numeric(L, N)&lt;br /&gt;
&lt;br /&gt;
        approx = S_N(xs, L, N, a0, a, b)&lt;br /&gt;
        exact = f(xs)&lt;br /&gt;
&lt;br /&gt;
        error = np.abs(approx - exact)&lt;br /&gt;
&lt;br /&gt;
        plt.plot(xs, error, label=f&amp;quot;L={L}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    plt.yscale(&amp;quot;log&amp;quot;)&lt;br /&gt;
    plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
    plt.ylabel(&amp;quot;|S_N(x) - f(x)|&amp;quot;)&lt;br /&gt;
    plt.title(f&amp;quot;Error puntual para N={N}&amp;quot;)&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.grid(True, which=&amp;quot;both&amp;quot;)&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
    Ls = [1.0, 4.0]&lt;br /&gt;
    N = 20&lt;br /&gt;
&lt;br /&gt;
    visualize_error(Ls, N, num_points=800)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#nuevo código&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 1) INTERVALO Y FUNCIÓN&lt;br /&gt;
# =====================================================&lt;br /&gt;
a, b = 0.0, 1.0 ### Inicio y final del intervalo&lt;br /&gt;
L = b - a ### Longitud intervalo&lt;br /&gt;
&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0.0) &amp;amp; (x &amp;lt; 0.5), 1.0, 0.0) ### Funcion indicatriz &lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 2) MUESTREO&lt;br /&gt;
# =====================================================&lt;br /&gt;
M = 8192 ### Numero de puntos en x&lt;br /&gt;
x = np.linspace(a, b, M, endpoint=False) ### Genera un vector de M puntos entre a y b, pero no incluye el punto b&lt;br /&gt;
fx = f(x) ### Aplica la función a cada elementos del vector del linspace x tanto es un vector de lomgitud M&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 3) COEFICIENTES REALES DIRECTOS (SIN FFT)&lt;br /&gt;
# =====================================================&lt;br /&gt;
def coeffs_real_direct(fx, N, a=0.0, L=1.0):&lt;br /&gt;
    M = fx.size&lt;br /&gt;
    j = np.arange(M)&lt;br /&gt;
    xj = a + L*j/M  # mismos puntos que linspace(endpoint=False)&lt;br /&gt;
&lt;br /&gt;
    a0 = fx.mean()  # (1/M) sum f_j&lt;br /&gt;
&lt;br /&gt;
    k = np.arange(1, N+1) ### np array, es decir una lista de las frecuencias ordenadas desde 0 hasta N, siendo N la mayor de la suma parcial deseada&lt;br /&gt;
    theta = 2*np.pi * k[:, None] * (xj[None, :] - a) / L ### Crea una matriz donde el elemento Aij es 2*pi*k_i*x_j&lt;br /&gt;
&lt;br /&gt;
    ak = (2/M) * (fx[None, :] * np.cos(theta)).sum(axis=1) ### Calcula un vector donde cada elemento es el coeficiente asociado a la frecuencua ki&lt;br /&gt;
    bk = (2/M) * (fx[None, :] * np.sin(theta)).sum(axis=1) ### Lo mismo pero el seno&lt;br /&gt;
&lt;br /&gt;
    return a0, ak, bk&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 4) RECONSTRUCCIÓN S_N EN BASE REAL&lt;br /&gt;
# =====================================================&lt;br /&gt;
def partial_sum_real_direct(N, x, fx, a=0.0, L=1.0):&lt;br /&gt;
    a0, ak, bk = coeffs_real_direct(fx, N, a=a, L=L)&lt;br /&gt;
&lt;br /&gt;
    k = np.arange(1, N+1) ### Vector de frecuencias &lt;br /&gt;
    theta = 2*np.pi * k[:, None] * (x[None, :] - a) / L ### Genera una matriz elemento Aij es igual que antes pero con el cambio de intervalo para poder aplicar fourier&lt;br /&gt;
&lt;br /&gt;
    sN = a0 \&lt;br /&gt;
         + (ak[:, None] * np.cos(theta)).sum(axis=0) \ ### multiplica cada coeficiente con su coseno respectivo, en forma de vector por cada punto del linspace&lt;br /&gt;
         + (bk[:, None] * np.sin(theta)).sum(axis=0)   ### lo mismo para el seno&lt;br /&gt;
&lt;br /&gt;
    return sN ### devuelve la serie de fourier&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 5) VISUALIZACIÓN&lt;br /&gt;
# =====================================================&lt;br /&gt;
Ns = [1, 3, 5, 10, 40, 80] ### Representación python&lt;br /&gt;
&lt;br /&gt;
cols = 3&lt;br /&gt;
rows = (len(Ns) + cols - 1) // cols&lt;br /&gt;
&lt;br /&gt;
fig, axes = plt.subplots(rows, cols, figsize=(12, 3*rows))&lt;br /&gt;
axes = axes.flatten()&lt;br /&gt;
&lt;br /&gt;
for i, N in enumerate(Ns):&lt;br /&gt;
    sN = partial_sum_real_direct(N, x, fx, a=a, L=L)&lt;br /&gt;
&lt;br /&gt;
    axes[i].plot(x, fx, color='black', linewidth=2, label=&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
    axes[i].plot(x, sN, color='red', linewidth=1.6, label=&amp;quot;S_N(x) (sin FFT)&amp;quot;)&lt;br /&gt;
    axes[i].set_title(f&amp;quot;N = {N}&amp;quot;)&lt;br /&gt;
    axes[i].grid(True)&lt;br /&gt;
&lt;br /&gt;
    if i == 0:&lt;br /&gt;
        axes[i].legend(loc=&amp;quot;best&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Quitar paneles vacíos&lt;br /&gt;
for j in range(i+1, len(axes)):&lt;br /&gt;
    fig.delaxes(axes[j])&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#nuevo código&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;
# CONFIG&lt;br /&gt;
# =====================================================&lt;br /&gt;
a, b = 0.0, 1.0&lt;br /&gt;
L = b - a&lt;br /&gt;
&lt;br /&gt;
M_fft = 8192&lt;br /&gt;
h_L2 = 1e-5&lt;br /&gt;
Ns = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]&lt;br /&gt;
&lt;br /&gt;
m_max = 3  # vamos a construir f0, f1, f2, f3 a mano&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 1) f0 y sus primitivas exactas f1,f2,f3&lt;br /&gt;
# =====================================================&lt;br /&gt;
def f0(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0.0) &amp;amp; (x &amp;lt; 0.5), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def f1(x):&lt;br /&gt;
    # ∫0^x f0(t) dt&lt;br /&gt;
    return np.where(x &amp;lt; 0.5, x, 0.5)&lt;br /&gt;
&lt;br /&gt;
def f2(x):&lt;br /&gt;
    # ∫0^x f1(t) dt&lt;br /&gt;
    # x&amp;lt;0.5: x^2/2&lt;br /&gt;
    # x&amp;gt;=0.5: (1/2)x - 1/8&lt;br /&gt;
    return np.where(x &amp;lt; 0.5, 0.5*x**2, 0.5*x - 0.125)&lt;br /&gt;
&lt;br /&gt;
def f3(x):&lt;br /&gt;
    # ∫0^x f2(t) dt&lt;br /&gt;
    # x&amp;lt;0.5: x^3/6&lt;br /&gt;
    # x&amp;gt;=0.5: (1/4)x^2 - (1/8)x + 1/48&lt;br /&gt;
    return np.where(x &amp;lt; 0.5, (x**3)/6.0, 0.25*x**2 - 0.125*x + (1.0/48.0))&lt;br /&gt;
&lt;br /&gt;
f_funcs = [f0, f1, f2, f3]  # lista de funciones exactas&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 2) MALLAS Y VALORES &amp;quot;TRUE&amp;quot; EN L2&lt;br /&gt;
# =====================================================&lt;br /&gt;
x_L2 = np.arange(a, b, h_L2)&lt;br /&gt;
f_list = [f_funcs[m](x_L2) for m in range(m_max + 1)]  # f0..f3 evaluadas en x_L2&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 3) Fourier por FFT sobre una malla uniforme para coeficientes&lt;br /&gt;
#    (ojo: extensión periódica implícita de lo que haya en [0,1))&lt;br /&gt;
# =====================================================&lt;br /&gt;
x_fft = np.linspace(a, b, M_fft, endpoint=False)&lt;br /&gt;
&lt;br /&gt;
def fourier_coeffs_up_to_from_samples(fx_samples):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Devuelve coeffs_up_to(N) -&amp;gt; (a0, ak, bk) para:&lt;br /&gt;
    f(x) ~ a0 + sum_{k=1}^N [ak cos(2πk(x-a)/L) + bk sin(2πk(x-a)/L)].&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    C = np.fft.fft(fx_samples) / M_fft&lt;br /&gt;
    a0 = C[0].real&lt;br /&gt;
&lt;br /&gt;
    def coeffs_up_to(N):&lt;br /&gt;
        ck = C[1:N+1]&lt;br /&gt;
        ak = 2.0 * ck.real&lt;br /&gt;
        bk = -2.0 * ck.imag&lt;br /&gt;
        return a0, ak, bk&lt;br /&gt;
&lt;br /&gt;
    return coeffs_up_to&lt;br /&gt;
&lt;br /&gt;
def partial_sum_real(coeffs_up_to, N, xgrid):&lt;br /&gt;
    a0, ak, bk = coeffs_up_to(N)&lt;br /&gt;
    s = a0 * np.ones_like(xgrid, dtype=float)&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        ang = 2*np.pi*k*(xgrid - a)/L&lt;br /&gt;
        s += ak[k-1]*np.cos(ang) + bk[k-1]*np.sin(ang)&lt;br /&gt;
    return s&lt;br /&gt;
&lt;br /&gt;
def L2_error(f_true_vals, s_vals, xgrid):&lt;br /&gt;
    e = f_true_vals - s_vals&lt;br /&gt;
    return np.sqrt(np.trapz(e**2, xgrid))&lt;br /&gt;
&lt;br /&gt;
# Precomputamos coeffs_up_to para cada m (muestreando en x_fft)&lt;br /&gt;
coeffs_list = []&lt;br /&gt;
for m in range(m_max + 1):&lt;br /&gt;
    f_m_on_fft = f_funcs[m](x_fft)  # como es explícita, no hace falta interp&lt;br /&gt;
    coeffs_list.append(fourier_coeffs_up_to_from_samples(f_m_on_fft))&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 4) EXPERIMENTO: error L2 vs N para cada m&lt;br /&gt;
# =====================================================&lt;br /&gt;
plt.figure(figsize=(7,5))&lt;br /&gt;
&lt;br /&gt;
for m in range(m_max + 1):&lt;br /&gt;
    f_true = f_list[m]&lt;br /&gt;
    coeffs_up_to = coeffs_list[m]&lt;br /&gt;
    E = []&lt;br /&gt;
    for N in Ns:&lt;br /&gt;
        sN = partial_sum_real(coeffs_up_to, N, x_L2)&lt;br /&gt;
        E.append(L2_error(f_true, sN, x_L2))&lt;br /&gt;
    plt.loglog(Ns, E, marker='o', label=f&amp;quot;m={m} (f_{m} exacta)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;N&amp;quot;)&lt;br /&gt;
plt.ylabel(r&amp;quot;$\|f_m - S_N\|_{L^2(0,1)}$&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Convergencia L2 vs N usando primitivas EXACTAS (sin integrar numéricamente)&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# =====================================================&lt;br /&gt;
# 5) Visualización de f_m exactas&lt;br /&gt;
# =====================================================&lt;br /&gt;
fig, axes = plt.subplots(m_max + 1, 1, figsize=(9, 2.4*(m_max+1)))&lt;br /&gt;
if m_max == 0:&lt;br /&gt;
    axes = [axes]&lt;br /&gt;
&lt;br /&gt;
for m in range(m_max + 1):&lt;br /&gt;
    axes[m].plot(x_L2, f_list[m], linewidth=1.8)&lt;br /&gt;
    axes[m].grid(True)&lt;br /&gt;
    axes[m].set_title(f&amp;quot;f_{m}(x) exacta (integración aplicada {m} veces)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DiegoGR</name></author>	</entry>

	</feed>