Самый простой способ интерполяции с большей точностью на диаграмме?

Самый простой способ интерполяции с большей точностью на диаграмме?

Я пытаюсь создать диаграмму, которая выглядит следующим образом:

введите описание изображения здесь

Я попытался подогнать функцию со все большим количеством узлов, но она выглядит неправильно (для лучшей иллюстрации показаны все три кривые на диаграмме):

\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}

введите описание изображения здесь

Я также пробовал создавать узлы, подобные этим (т.е. с определенной функцией x^2+x+1 + «шум» вместо этого):

\foreach \p in {-5,...,5} \node[circle,fill=green] at (\p, \p * \p + \p + 1 + rand) (\p) {};

но это вообще не работает.

В любом случае мой код заставляет меня вручную перечислять узлы, что не очень хорошо.

Думаю, мне нужен способ интерполяции с полиномами все более высокой степени? Но я не уверен, как это сделать.

решение1

Вы можете определить «интерполяционные» координаты и соединить их плавным графиком.

\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}

введите описание изображения здесь

Конечно, в дополнение к натяжению можно изменить и вес.

\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}

введите описание изображения здесь

Связанный контент