Necesito trazar el caso con M = 16:
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: 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.