Estoy intentando crear un diagrama que se parece a este:
Intenté ajustar una función con cada vez más nodos, pero no se ve bien (mostrando las 3 curvas en el diagrama para ilustrar mejor):
\documentclass[10pt,landscape,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[UKenglish]{babel}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture} [scale = 0.5]
\foreach \p in {-5,...,5} \node[circle,fill=green] at (\p,2*rand) (\p) {};
\draw [cyan, xshift=4cm] plot [smooth, tension=1] coordinates { (-5) (-4) (-3) (-2) (-1) (0) (1) (2) (3) (4) (5) };
\draw [red, xshift=4cm] plot [smooth, tension=1] coordinates { (-5) (-3) (-1) (1) (3) (5) };
\draw [blue, xshift=4cm] plot [smooth, tension=1] coordinates { (-5) (5) };
\end{tikzpicture}
\end{document}
También intenté crear nodos como este (es decir, con una función definida x^2+x+1 + "ruido" en su lugar:
\foreach \p in {-5,...,5} \node[circle,fill=green] at (\p, \p * \p + \p + 1 + rand) (\p) {};
pero eso no funciona en absoluto.
En cualquier caso, mi código me obliga a enumerar los nodos manualmente, lo cual no es nada bueno.
¿Supongo que necesito una forma de interpolar con polinomios de grados cada vez más altos? Pero no estoy seguro de cómo hacer esto.
Respuesta1
Podría definir coordenadas de "interpolación" y conectarlas con un trazado fluido.
\documentclass[10pt,landscape,a4paper]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture} [scale = 0.5]
\pgfmathtruncatemacro{\imin}{-5}
\pgfmathtruncatemacro{\imax}{5}
\foreach \p in {\imin,...,\imax} \node[circle,fill=green] at (\p,2*rand) (p\p) {};
\foreach \X [evaluate=\X as \Xm using {int(\X-1)},evaluate=\X as \Xp using
{int(\X+1)}] in {\imin,...,\imax}
{\ifnum\X=\imin
\path (p\X) coordinate (i\X);
\else
\ifnum\X=\imax
\path (p\X) coordinate (i\X);
\else
\path (barycentric cs:p\X=0.6,p\Xm=0.2,p\Xp=0.2) coordinate (i\X);
\fi
\fi
}
\draw [blue] plot [smooth, tension=1,variable=\X,samples at={\imin,...,\imax}]
(i\X);
\end{tikzpicture}
\end{document}
Por supuesto, puedes cambiar el peso además de la tensión.
\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\foreach \X in {1,1.5,...,10,9.5,9,...,1.5}
{\begin{tikzpicture}
\pgfmathtruncatemacro{\imin}{-5}
\pgfmathtruncatemacro{\imax}{5}
\pgfmathsetmacro{\mainweight}{\X}
\pgfmathsetseed{27}
\node[anchor=north west,font=\sffamily] at (\imin,-2)
{weight is \pgfmathprintnumber{\mainweight}};
\foreach \p in {\imin,...,\imax} \node[circle,fill=green] at (\p,2*rand) (p\p) {};
\foreach \X [evaluate=\X as \Xm using {int(\X-1)},evaluate=\X as \Xp using
{int(\X+1)}] in {\imin,...,\imax}
{\ifnum\X=\imin
\path (p\X) coordinate (i\X);
\else
\ifnum\X=\imax
\path (p\X) coordinate (i\X);
\else
\path (barycentric cs:p\X=\mainweight,p\Xm=1,p\Xp=1) coordinate (i\X);
\fi
\fi
}
\draw [blue] plot [smooth, tension=0.5,variable=\X,samples at={\imin,...,\imax}]
(i\X);
\end{tikzpicture}}
\end{document}