4

I know basic LaTeX I tried to draw a block diagram similar to the one shown in diagram but I am unable to do it . Please suggest any easy way to draw such block diagram. Thank you This is my code . I can not draw feedback from sum to state estimator.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,calc}

\begin{document}

\tikzset{ block/.style = {draw, fill=white, rectangle, minimum height=3em, minimum width=3em}, tmp/.style = {coordinate}, sum/.style= {draw, fill=white, circle, node distance=1cm}, input/.style = {coordinate}, output/.style= {coordinate}, pinstyle/.style = {pin edge={to-,thin,black} } } \begin{tikzpicture}[auto, node distance=2cm,>=latex'] \node [input, name=rinput] (rinput) {}; \node [sum, right of=rinput] (sum1) {}; \node [block, right of=sum1] (controller) {$k$}; \node [block, above of=controller,node distance=2cm] (up){$A,B$}; \node [block, right of=controller] (esti) {$estimator$};

\node [block, above of=esti,node distance=2cm] (extra){$C$}; \node [output, right of=extra, node distance=2cm] (output) {}; \draw [->] (rinput) -- node{$R(s)$} (sum1); \draw [->] (sum1)|- node[name=z,anchor=north]{$u(k)$}(up); \draw [->] (up) -- node{$x(k)$} (extra); \draw [->] (extra) -- node [name=y] {$Y(s)$}(output); \draw [->] (y) |- (esti); \draw [->] (esti)--node{$n(k)$}(controller); \draw [->] (controller)--(sum1);

\end{tikzpicture}

\end{document}

enter image description here

my new code

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,calc}

\begin{document}

\tikzset{ block/.style = {draw, fill=white, rectangle, minimum height=3em, minimum width=3em}, tmp/.style = {coordinate}, sum/.style= {draw, fill=white, circle, node distance=1cm}, input/.style = {coordinate}, output/.style= {coordinate}, pinstyle/.style = {pin edge={to-,thin,black} }, point/.style = {draw, fill=black, circle, minimum size=0.8mm, node distance=1.5cm, inner sep=0pt}, } \begin{tikzpicture}[auto, node distance=2cm,>=latex'] \node [input, name=rinput] (rinput) {}; \node [sum, right of=rinput] (sum1) {}; \node [block, right of=sum1] (controller) {$k$}; \node [block, above of=controller,node distance=2cm] (up){$A,B$}; \node [block, right of=controller] (esti) {$estimator$};

\node [block, above of=esti,node distance=2cm] (extra){$C$}; \node [output, right of=extra, node distance=2cm] (output) {}; \node [point, above =1cm of sum1] (point0){}; \draw [->] (rinput) -- node{$R(s)$} (sum1); \draw [->] (sum1)|- node[name=z,anchor=north]{$u(k)$}(up); \draw [->] (up) -- node{$x(k)$} (extra); \draw [->] (extra) -- node [name=y] {$Y(s)$}(output); \draw [->] (y) |- (esti); \draw [->] (esti)--node{$n(k)$}(controller); \draw [->] (controller)--(sum1); % \draw [->] (point0) -| node{} ([xshift=2cm]esti); % \draw [->] (point0) -- (output |- point0) |- ([yshift=0.5cm] esti); \draw [->] (point0) -- (output |- point0) |- ([yshift=0.5cm] esti);

\end{tikzpicture}

\end{document}

\end{document}

mzn
  • 97

3 Answers3

5

[Edited to add nodes fitted around groups of nodes and coordinates as requested in comment.]

Something like this? Note that most of the tidying is accomplished by using the positioning syntax <direction>=of ... in place of <direction> of=....

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows,positioning,fit}

\begin{document} \newlength\estilength \settowidth\estilength{$estimator$} \tikzset{ block/.style = {draw, fill=white, rectangle, minimum height=3em, minimum width=3em,text width=\estilength,align=center}, tmp/.style = {coordinate}, sum/.style= {draw, fill=white, circle, node distance=1cm}, input/.style = {coordinate}, output/.style= {coordinate}, pinstyle/.style = {pin edge={to-,thin,black} }, point/.style = {draw, fill=black, circle, minimum size=0.8mm, node distance=1.5cm, inner sep=0pt}, dashed node/.style={draw,dashed,inner sep=7.5pt,rounded corners}, }% \begin{tikzpicture}[auto, node distance=15mm,>=latex'] \node [input, name=rinput] (rinput) {}; \node [sum, right=25mm of rinput] (sum1) {}; \node [block, right=of sum1] (controller) {$k$}; \node [block, above=of controller] (up){$A,B$}; \node [block, right=of controller] (esti) {$estimator$};

\node [block] (extra) at (esti |- up){$C$}; \node [output, right=25mm of extra] (output) {}; \node [point, above=1cm of sum1] (point0){}; \draw [->] (rinput) -- node{$R(s)$} (sum1); \draw [->] (sum1)|- node[name=z,midway]{$u(k)$}(up); \draw [->] (up) -- node{$x(k)$} (extra); \draw [->] (extra) -- node [name=y] {$Y(s)$}(output); \draw [->] (y) |- (esti); \draw [->] (esti)--node{$n(k)$}(controller); \draw [->] (controller)--(sum1); \draw [->] (point0) -- ([xshift=10pt]esti.east |- point0) |- ([yshift=0.5cm] esti) coordinate [midway] (c1); \coordinate [xshift=-2.5pt] (c2) at (sum1.south west);

\node (f1) [dashed node,fit=(esti) (c2) (controller) (point0) (c1) (sum1)] {}; \node [dashed node,fit=(extra) (up) (extra -| c2) (up -| c1)] {};

\end{tikzpicture} \end{document}

tidied up output controller

cfr
  • 198,882
3

a wee bit variation of the excellent answer by @cfr +1 -- adding colored background and slight shift of the entry point by node[xshift=-1em]

    \draw [->] (rinput) -- node[xshift=-1em]{$R(s)$} (sum1);

and

\begin{pgfonlayer}{background}
            % Draw background box.
            \node[fill=yellow!90!black,thick,draw=gray,rounded corners=2mm, inner xsep=1em, inner ysep=1em] (background) [fit = (z)  (extra) ] {};
            \node[fill=green!50,thick,draw=gray,rounded corners=2mm, inner xsep=1.7em, inner ysep=.5em, xshift=-.5em] (background) [fit = (point0)  (esti) ] {};
        \end{pgfonlayer}

Output

enter image description here

MWE

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,calc}
\usetikzlibrary{backgrounds,fit,decorations.pathreplacing}

\begin{document} \newlength\estilength \settowidth\estilength{$estimator$} \tikzset{ block/.style = {draw, fill=brown!10, rectangle, minimum height=3em, minimum width=3em,text width=\estilength,align=center}, tmp/.style = {coordinate}, sum/.style= {draw, fill=white, circle, node distance=1cm}, input/.style = {coordinate}, output/.style= {coordinate}, pinstyle/.style = {pin edge={to-,thin,black} }, point/.style = {draw, fill=black, circle, minimum size=0.8mm, node distance=1.5cm, inner sep=0pt}, }% \begin{tikzpicture}[auto, node distance=2cm,>=latex'] \node [input, name=rinput] (rinput) {}; \node [sum, right=2cm of rinput] (sum1) {}; \node [block, right=of sum1] (controller) {$k$}; \node [block, above=15mm of controller] (up){$A,B$}; \node [block, right=of controller] (esti) {$estimator$};

    \node [block] (extra) at (esti |- up){$C$};
    \node [output, right=of extra] (output) {};
    \node [point, above=1cm of sum1] (point0){};
    \draw [-&gt;] (rinput) -- node[xshift=-1em]{$R(s)$} (sum1);
    \draw [-&gt;] (sum1)|- node[name=z,midway]{$u(k)$}(up);
    \draw [-&gt;] (up) -- node{$x(k)$} (extra);
    \draw [-&gt;] (extra) -- node [name=y]  {$Y(s)$}(output);
    \draw [-&gt;] (y) |-  (esti);
    \draw [-&gt;] (esti)--node{$n(k)$}(controller);
    \draw [-&gt;] (controller)--(sum1);
    \draw [-&gt;] (point0) -- ([xshift=10pt]esti.east |- point0) |- ([yshift=0.5cm] esti);

    \begin{pgfonlayer}{background}
        % Draw background box.
        \node[fill=yellow!90!black,thick,draw=gray,rounded corners=2mm, inner xsep=1em, inner ysep=1em] (background) [fit = (z)  (extra) ] {};
        \node[fill=green!50,thick,draw=gray,rounded corners=2mm, inner xsep=1.7em, inner ysep=.5em, xshift=-.5em] (background) [fit = (point0)  (esti) ] {};
    \end{pgfonlayer}
\end{tikzpicture}

\end{document}

EDIT

With dashed lines as the OP required

enter image description here

MWE

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,calc}
\usetikzlibrary{backgrounds,fit,decorations.pathreplacing}

\begin{document} \newlength\estilength \settowidth\estilength{$estimator$} \tikzset{ block/.style = {draw, fill=brown!10, rectangle, minimum height=3em, minimum width=3em,text width=\estilength,align=center}, tmp/.style = {coordinate}, sum/.style= {draw, fill=white, circle, node distance=1cm}, input/.style = {coordinate}, output/.style= {coordinate}, pinstyle/.style = {pin edge={to-,thin,black} }, point/.style = {draw, fill=black, circle, minimum size=0.8mm, node distance=1.5cm, inner sep=0pt}, }% \begin{tikzpicture}[auto, node distance=2cm,>=latex'] \node [input, name=rinput] (rinput) {}; \node [sum, right=2cm of rinput] (sum1) {}; \node [block, right=of sum1] (controller) {$k$}; \node [block, above=15mm of controller] (up){$A,B$}; \node [block, right=of controller] (esti) {$estimator$};

    \node [block] (extra) at (esti |- up){$C$};
    \node [output, right=of extra] (output) {};
    \node [point, above=1cm of sum1] (point0){};
    \draw [-&gt;] (rinput) -- node[xshift=-1em]{$R(s)$} (sum1);
    \draw [-&gt;] (sum1)|- node[name=z,midway]{$u(k)$}(up);
    \draw [-&gt;] (up) -- node{$x(k)$} (extra);
    \draw [-&gt;] (extra) -- node [name=y]  {$Y(s)$}(output);
    \draw [-&gt;] (y) |-  (esti);
    \draw [-&gt;] (esti)--node{$n(k)$}(controller);
    \draw [-&gt;] (controller)--(sum1);
    \draw [-&gt;] (point0) -- ([xshift=10pt]esti.east |- point0) |- ([yshift=0.5cm] esti);

    \begin{pgfonlayer}{background}
        % Draw background box.
        \node[fill=yellow!90!black,thick,dashed, draw=gray,rounded corners=2mm, inner xsep=1em, inner ysep=1em] (background) [fit = (z)  (extra) ] {};
        \node[fill=green!50,thick,draw=gray,dashed, rounded corners=2mm, inner xsep=1.7em, inner ysep=.5em, xshift=-.5em] (background) [fit = (point0)  (esti) ] {};
    \end{pgfonlayer}
\end{tikzpicture}

\end{document}

js bibra
  • 21,280
  • @cfr . Thank you so much, what if I want to have no color and only dashed line around them? I write this code but I want to have dashed \node[draw,rounded corners=2mm, inner xsep=1em, inner ysep=1em] [fit = (z) (extra) ] {}; \node[draw,rounded corners=2mm, inner xsep=1.7em, inner ysep=.5em, xshift=-.5em] [fit = (point0) (esti) ] {}; – mzn Jan 05 '24 at 13:18
  • @zahra This answer was written by js bibra and not me ;). I've also edited my answer. I'd also use fit here as it is just easier to use a fitted node than draw the boundary as a path. – cfr Jan 06 '24 at 02:59
  • @zahra, in question you not mentioned, that instead colored background you like to have only dashed lines around blocks in diagram! You should be more specific in your question. – Zarko Jan 06 '24 at 08:30
2

With (small) effort to make tikzpicture code more concise. For this are used packages arrows.meta (for nicer arrows' heads), ext.paths.ortho (for two ortho arrow), fit (for dashed nodes around boxes), positioning (for nodes placements) and quotes (for most of edge labels):

\documentclass[margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
                ext.paths.ortho,    % defined in the tikz-ext package
                                    % now possible with Console MiKTeX
                fit,
                positioning,
                quotes}

\begin{document} \newlength\estilength \settowidth\estilength{$estimator$} \tikzset{ arr/.style = {-Stealth}, box/.style = {draw, semithick, minimum height=3em, text width=\estilength, align=center}, sum/.style = {circle, draw, semithick}, dot/.style = {circle, fill=black, inner sep=2pt, outer sep=0pt}, FIT/.style = {draw, dashed, rounded corners, inner sep=2em, xshift=1em, fit=#1}, every edge/.append style = {draw, arr} }%

\begin{tikzpicture}[auto, node distance = 17mm and 17mm ] \coordinate (rin); \node (sum1) [sum, right=of rin] {}; \node (cntr) [box, right=of sum1] {$k$}; \node (esti) [box, right=of cntr] {\emph{estimator}};

\node (up) [box, above=of cntr] {$A,B$}; \node (extra) [box, right=of up] {$C$};

\node (dot) [right=of extra, dot, label = $Y(s)$] {}; \coordinate[right=of dot] (out);

\node[FIT=(sum1) (esti)] {}; \node[FIT=(sum1.west |- up) (extra)] {}; % arrows \draw (rin) edge ["$R(s)$"] (sum1) (up) edge ["$x(k)$"] (extra) (cntr) edge (sum1) (extra) edge (out) (esti) edge ["$n(k)$"] (cntr); \draw [arr] (sum1) |- (up) node [pos=0.5, above] {$u(k)$}; \draw [arr] (sum1.north) -- ++ (0,9mm) node[dot] {} r-rl (esti.15); \draw [arr] (dot) |- (esti); \end{tikzpicture} \end{document}

enter image description here

Zarko
  • 296,517