Dibujar la expansión de Fourier usando pgfplots

Dibujar la expansión de Fourier usando pgfplots

Necesito trazar el caso con M = 16: ingrese la descripción de la imagen aquí

Desafortunadamente, la forma en que lo hago parece completamente incorrecta:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}

\begin{document}
\begin{figure}[h] \label{fig:csm:graph}
    \centering
    \begin{tikzpicture}
        \begin{axis}[axis lines = middle, xlabel = $d - z$, ylabel = $I$]
            \def\sum{0}
            \pgfplotsinvokeforeach{1, 2,..., 16}{
                \def\ck{pi * (2 * #1 - 1)}
                \xdef\sum{\sum + (1 / \ck) * sin(\ck * x)}
            }
            \xdef\sum{2 * \sum + 0.5}
            \addplot[domain = -0.5:1, red] (x, {\sum});
        \end{axis}
    \end{tikzpicture}
\end{figure}
\end{document}

Cualquier ayuda sería muy apreciada.

EDITAR: MWE agregado.

Respuesta1

Para matemáticas más complicadas, LaTeX no es la herramienta adecuada. Utilizando un sistema de álgebra informático llamado Sage, ejecutando un (gratuito)Nube sabiacuenta podrás obtener rápidamente tus parcelas.

\documentclass{article}
\usepackage{sagetex}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{pgfplots}
\begin{document}
\begin{sagesilent}
t = var('t')
x = var('x')
f1 = lambda t: 1
f2 = lambda t: 0
f = Piecewise([[(-1,0),f1],[(0,1),f2]])
Fourier=f.plot_fourier_series_partial_sum(32,1,-.5,.5)
############################
LowerY = -.2
UpperY = 1.2
LowerX = -.5
UpperX = .5
step = .005
g =.5
for i in range(1,17):
    g += -2*(1/(pi*(2*i-1)))*sin((pi*(2*i-1))*x)
x_coords = [t for t in srange(LowerX,UpperX,step)]
y_coords = [g(t).n(digits=6) for t in srange(LowerX,UpperX,step)]

output = r""
output += r"\begin{tikzpicture}[scale=.7]"
output += r"\begin{axis}[xmin=%f,xmax=%f,ymin= %f,ymax=%f]"% (LowerX,UpperX,LowerY, UpperY)
output += r"\addplot[thin, blue, unbounded coords=jump] coordinates {"
for i in range(0,len(x_coords)-1):
    if (y_coords[i])<LowerY or (y_coords[i])>UpperY:
        output += r"(%f , inf) "%(x_coords[i])
    else:
        output += r"(%f , %f) "%(x_coords[i],y_coords[i])
output += r"};"
output += r"\end{axis}"
output += r"\end{tikzpicture}"
\end{sagesilent}
\begin{center}
\sagestr{output}
\end{center}
\begin{center}
\sageplot[width=6cm]{plot(Fourier, (x, -.5, .5),ymin=-.2,   ymax=1.2,detect_poles=True)}
\end{center}
\end{document}

Resultando en este resultado: ingrese la descripción de la imagen aquí usando Sage, tienes que decirle la función que estás aproximando (en tu caso, la función por partes de 1 y 0) y Sage se encarga del resto; esa es la segunda imagen trazada (usando el código encima de los números). Usando pgfplots tienes que construir la función (que es lo que hace la mayor parte del código debajo de los #). Python no ejecuta el último número, por lo tanto, el ciclo realmente llega a 16, no a 17.

información relacionada