4

I am trying to plot below function as 3d surface plot, where $\theta_1,\theta_2$ are the x and y axes respectively. The Z axis is supposed to be $L(\theta_1,\theta_2)$.

$$
L(\theta_1,\theta_2) = \prod_{i=1}^{m} \dfrac{1}{\sqrt{2\pi\theta_2}}{\text{exp}}{\Big[ -\dfrac{  (x_i-\theta_1)^2 }{2\theta_2}  \Big]} \\
=  \Big(   \dfrac{1}{\sqrt{2\pi\theta_2}} \Big)^{m}{\text{exp}}{\Big[ 
\dfrac{-\sum_{i=1}^{m}(x_i-\theta_1)^2}{2\theta_2} \Big]}
\tag{1}
$$

Just in case of above latex is not rendered this is my equation:
enter image description here

I managed to get to an extent, but unable to find how to compute the summation by passing a series of values for \m., and eventually plot proper 3d surface plot for the function above. Kindly help.

MWE:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\pgfmathdeclarefunction{joint_normal}{3}{%
    \pgfmathparse{ (1/(2*pi*#3))^(#1)*exp( -(#1-#2)^2/(2*#3^2)  )}%
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
    grid=both,
    restrict z to domain*=0:1,
    zmin=0,
    colormap/hot,
    %point meta min=-0.2, 
    %point meta max=1,    
    view={20}{20}  %tune here to change viewing angle
    ]

    \def\m{5}
    \addplot3[surf,domain=-30:30,domain y=0:30, samples=25] { joint_normal(\m, x, y) };
\end{axis}
\end{tikzpicture}
\end{document}

Current output:
enter image description here

online editor to try out: here

Note: One could assume $X_i$ values varying from any range say 0 to 10, from a normal distribution N(5, 4). Any range would do, but for not spending too much time on thinking of range, I provide this one. I could later tinker it as needed.

5
  • You can do summations with the tikzmath library by using recursions. Other than that, I am not aware of any other way of doing the sum in an elegant way in this framework. Commented Oct 18, 2018 at 18:10
  • I am new to tikz, can you please show with an example for above problem? Commented Oct 18, 2018 at 18:11
  • Well, to be able to do that, one would need to know what the x_i are. You sum over the x_i but as long as you do not specify what they are it is impossible to plot the function. Commented Oct 18, 2018 at 18:20
  • One could assume $X_i$ values varying from any range say 0 to 10, from a normal distribution N(5, 4). Any range would do, but for not spending too much time on thinking of range, I provide this one. I could later tinker it as needed. Commented Oct 18, 2018 at 18:25
  • If you can make a concrete proposal for the x_i I'll be happy to give it a shot. (Sorry, was offline for a few hours and will be really online in another few hours) Commented Oct 18, 2018 at 23:50

1 Answer 1

5

Here is an MWE, which at the same time contains the explanation.

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usetikzlibrary{math} 
\begin{document}
% based on https://tex.stackexchange.com/a/307032/121799
% and https://tex.stackexchange.com/a/451326/121799
\def\xvalues{{0,1,2,4,5,7}} % notice that the `0` is the 0th entry, which is not used here
\tikzset{evaluate={
        function myN(\x,\z,\k) { % \x = \theta_1 and \z=\theta_2 
            if \k == 1 then {
                return myn(\x,\xvalues[1],\z);
            } else {
                return myN(\x,\z,\k-1)
                +myn(\x,\xvalues[\k],\z);
            };
        };
    },
declare function={myn(\x,\y,\z)=(-(\x-\y)*(\x-\y))/(2*\z*\z) ;
L(\x,\z,\k)=pow(2*pi*\z,-\k/2)*exp(myN(\x,\z,\k));}}

\section*{How to plot sums in Ti\emph{k}Z/pgfplots}

We define the argument of the exponential as
\begin{equation}
 n_k(\theta_1,\theta_2)~=~-\frac{(\theta_1-x_k)^2}{2\theta_2^2}
\end{equation}
and their sum as
\begin{equation}
 N_k(\theta_1,\theta_2)~=~\sum\limits_{\ell=1}^k n_k(\theta_1,\theta_2)\;.
\end{equation}
This means that $N_k$ can be defined recursively as
\begin{equation}
 N_k(\theta_1,\theta_2)~=~N_{k-1}(\theta_1,\theta_2)+n_k(\theta_1,\theta_2)\;,
\end{equation}
and this is the point where the Ti\emph{k}Z library \texttt{math} comes into
play. It allows us to do the recursive deinition. Examples are shown in
Figure~\ref{fig:N_k}.

\begin{figure}[htb]
\centering
\begin{tikzpicture}
\begin{axis}[samples=101,
    use fpu=false,mark=none,
    xlabel=$x$,ylabel=$y$,
    xmin=0, xmax=10,
    domain=0:10,legend pos=south west
    ] 
  \addplot [mark=none] {myN(x,1,1)};
  \addlegendentry{$N_1$}
  \addplot+ [mark=none] {myN(x,1,2)};
  \addlegendentry{$N_2$}
  \addplot+ [mark=none] {myN(x,1,3)};
  \addlegendentry{$N_3$}
\end{axis}
\end{tikzpicture}
\caption{$N_1$, $N_2$ and $N_3$ for $\theta_2=1$ and $\{x_k\}=\{1,2,4\}$.}
\label{fig:N_k}
\end{figure}

\clearpage

Of course, one can then define functions of these sums,
\begin{equation}
L_k(\theta_1,\theta_2)~=~  
\Big(   \dfrac{1}{\sqrt{2\pi\theta_2}} \Big)^{m}\,\exp\Bigl[ 
\dfrac{-\sum_{i=1}^{k}(x_i-\theta_1)^2}{2\theta_2} \Bigr]\;.
\end{equation}
Examples are shown in Figure~\ref{fig:L_k}.

\begin{figure}[htb]
\centering
\begin{tikzpicture}
\begin{axis}[samples=101,
    use fpu=false,mark=none,
    xlabel=$x$,ylabel=$y$,
    xmin=0, xmax=10,
    domain=0:10,legend pos=north east
    ] 
  \addplot [mark=none] {L(x,1,1)};
  \addlegendentry{$L_1$}
  \addplot+ [mark=none] {L(x,1,2)};
  \addlegendentry{$L_2$}
  \addplot+ [mark=none] {L(x,1,3)};
  \addlegendentry{$L_3$}
\end{axis}
\end{tikzpicture}
\caption{$L_1$, $L_2$ and $L_3$ for $\theta_2=1$ and $\{x_k\}=\{1,2,4\}$.}
\label{fig:L_k}
\end{figure}

\end{document}

enter image description here

The second page contains (hopefully) what you are seeking for.

enter image description here

I'd also like to urge you not to confuse TikZ/pgfplots with a computer algegra system. You can do these things, but should not be too surprised if the performance is below the one of, say, Mathematica.

And here is a 3D example, similar to what you do in your MWE.

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usetikzlibrary{math} 
\begin{document}
% based on https://tex.stackexchange.com/a/307032/121799
% and https://tex.stackexchange.com/a/451326/121799
\def\xvalues{{0,1,2,4,5,7}} % notice that the `0` is the 0th entry, which is not used here
\tikzset{evaluate={
        function myN(\x,\z,\k) { % \x = \theta_1 and \z=\theta_2 
            if \k == 1 then {
                return myn(\x,\xvalues[1],\z);
            } else {
                return myN(\x,\z,\k-1)
                +myn(\x,\xvalues[\k],\z);
            };
        };
    },
declare function={myn(\x,\y,\z)=(-(\x-\y)*(\x-\y))/(2*\z*\z) ;
L(\x,\z,\k)=pow(2*pi*\z,-\k/2)*exp(myN(\x,\z,\k));}}

\begin{tikzpicture}
\begin{axis}[use fpu=false,
    grid=both,
    restrict z to domain*=0:1,
    zmin=0,
    colormap/hot,
    %point meta min=-0.2, 
    %point meta max=1,    
    view={20}{20}  %tune here to change viewing angle
    ]

    \addplot3[surf,domain=-1:9,domain y=1:4, samples=25] { L(x, y,4) };
\end{axis}
\end{tikzpicture}
\end{document}

enter image description here

2
  • 1
    @manooooh Good catch, I have just copied that from the OP. Commented Oct 19, 2018 at 3:54
  • 1
    wow, wow.. I am so grateful for you for this MWE with explanation. yes, as you said beyond a point, performance bothers me. So I am also trying via python in parallel. Commented Oct 19, 2018 at 18:02

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.