动态输出反馈控制器

动态输出反馈控制器

我懂基本的 LaTeX 我试图绘制一个类似于图中所示的框图,但我做不到。请建议任何绘制此类框图的简单方法。谢谢 这是我的代码。我无法从总和到状态估计器得出反馈。

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

在此处输入图片描述

我的新代码

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

答案1

[已编辑按照评论中的要求添加围绕节点组和坐标的节点。

像这样?请注意,大部分整理工作是通过使用positioning语法<direction>=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}

整理输出控制器

答案2

@cfr +1 的优秀答案有一点点变化——增加了彩色背景,并稍微移动了入口点node[xshift=-1em]

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

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

输出

在此处输入图片描述

平均能量损失

\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 [->] (rinput) -- node[xshift=-1em]{$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);
        
        \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}

编辑

按照原帖要求,使用虚线

在此处输入图片描述

平均能量损失

\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 [->] (rinput) -- node[xshift=-1em]{$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);
        
        \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}

答案3

经过(小小的)努力,代码变得tikzpicture更简洁。为此,使用了以下包arrows.meta(用于更漂亮的箭头)、ext.paths.ortho(用于两个正交箭头)、fit(用于框周围的虚线节点)、positioning(用于节点放置)和quotes(用于大多数边缘标签):

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

在此处输入图片描述

相关内容