Ich versuche, mit Tikz ein Kontrolldiagramm zu zeichnen, und habe dazu ein paar Fragen:
- Wie kann der Störung ihre Grenze entzogen werden?
- Wie können die Kosten- und Einschränkungsknoten links und rechts positioniert werden?
\tikzstyle{controller} = [draw, fill=blue!20, rectangle,
minimum height=3em, minimum width=6em]
\tikzstyle{block} = [draw, fill=yellow!20, rectangle,
minimum height=3em, minimum width=6em]
\tikzstyle{disturbance} = [draw, node distance=1.5cm, line width=0pt]
\tikzstyle{sum} = [draw, circle, node distance=1.5cm]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\begin{figure}[!]
\centering
\begin{tikzpicture}[auto, node distance=3cm,>=latex', scale=0.5 ,every
node/.style={transform shape}]
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right of=input] (sum) {};
\node [controller, right of=sum] (controller) {Controller};
\node [block, right of=controller, node distance=4cm] (system) {System};
\node [disturbance, name=disturbance, above of=system] {Disturbance};
\node [disturbance, name=costfunc, below of=system,] {Cost};
\node [disturbance, name=constraint, below of=system] {Constraints};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (controller) -- node[name=u] {$u(n)$} (system);
\node [output, right of=system] (output) {};
% Once the nodes are placed, connecting them is easy.
\draw [draw,->] (input) -- node {$r(n)$} (sum);
\draw [->] (sum) -- node {$e(n)$} (controller);
\draw [->] (disturbance) -- (system);
\draw [->] (system) -- node [name=y] {$y(n)$}(output);
\draw [->] (y) |- ($(y.south) + (0,-2)$) -| node[pos=0.99]
{$-$} node [near end] {$y(n)$} (sum);
\end{tikzpicture}
\label{fig:mpc_bloc_diagram}
\end{figure}
BEARBEITET
Wie kann ich näher y(n)
an die Predict rectangle
, ausgerichtet sein mitu(n)
Ich habe Folgendes versucht, mit dem oben genannten Ergebnis.
\draw [->] (y) |- node [near end] {$y(n)$} ($(predict.east)+(0,0.35)$);
\draw [->] (u) |- node [near end] {$u(n)$} ($(predict.east)+(0,-0.35)$);
Antwort1
draw=none
. Oder vielleicht einen neuen Knotenstil definieren, ohne den Rahmen zu zeichnen?Hier gibt es viele Möglichkeiten, je nach gewünschtem Ergebnis. Sie können beispielsweise verwenden
below right
undbelow left
die Positionierung mithilfe von Ankern und Verschiebungen feinabstimmen. Wenn diepositioning
Bibliothek geladen wurde, können Sie etwas wie verwendenbelow left=10pt and 20pt of <name>
(siehe zweiten Beispielcode unten).
Der Code:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,arrows}
\begin{document}
\tikzstyle{controller} = [draw, fill=blue!20, rectangle,
minimum height=3em, minimum width=6em]
\tikzstyle{block} = [draw, fill=yellow!20, rectangle,
minimum height=3em, minimum width=6em]
\tikzstyle{disturbance} = [draw, node distance=1.5cm, line width=0pt]
\tikzstyle{sum} = [draw, circle, node distance=1.5cm]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\begin{figure}
\centering
\begin{tikzpicture}[auto, node distance=3cm,>=latex', scale=1.5 ,every
node/.style={transform shape}]
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right of=input] (sum) {};
\node [controller, right of=sum] (controller) {Controller};
\node [block, right of=controller, node distance=4cm] (system) {System};
\node [disturbance, draw=none,name=disturbance, above of=system] {Disturbance};
\node [disturbance, name=costfunc, below left of=system,] {Cost};
\node [disturbance, name=constraint, below right of=system] {Constraints};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (controller) -- node[name=u] {$u(n)$} (system);
\node [output, right of=system] (output) {};
% Once the nodes are placed, connecting them is easy.
\draw [draw,->] (input) -- node {$r(n)$} (sum);
\draw [->] (sum) -- node {$e(n)$} (controller);
\draw [->] (disturbance) -- (system);
\draw [->] (system) -- node [name=y] {$y(n)$}(output);
\draw [->] (y) |- ($(y.south) + (0,-2)$) -| node[pos=0.99]
{$-$} node [near end] {$y(n)$} (sum);
\end{tikzpicture}
\label{fig:mpc_bloc_diagram}
\end{figure}
\end{document}
Einige Bemerkungen:
Bitte wechseln Sie von
of=
zur=of
Bibliotheksnutzungpositioning
.Ändern von
\tikzstyle
auf\tikzset
.Sie können einen Schwimmer nicht wie
figure
im Inneren platzierentikzpicture
; Sie können es auch andersherum machen.Ihr Skalierungsfaktor scheint etwas niedrig zu sein.
Der Code:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,arrows,positioning}
\tikzset{
controller/.style={
draw,
fill=blue!20,
rectangle,
minimum height=3em,
minimum width=6em
},
block/.style={
draw,
fill=yellow!20,
rectangle,
minimum height=3em,
minimum width=6em
},
disturbance/.style={
draw,
line width=0pt
},
sum/.style={
draw,
circle,
node distance=1.5cm
},
input/.style={coordinate},
output/.style={coordinate}
}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[
auto,
node distance=1.5cm,
>=latex',
scale=0.5 ,
every node/.style={transform shape}
]
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right =of input] (sum) {};
\node [controller, right =of sum] (controller) {Controller};
\node [block, right =of controller, node distance=4cm] (system) {System};
\node [disturbance, draw=none,name=disturbance, above = 20pt of system] {Disturbance};
\node [disturbance,draw=none,name=costfunc, below left = 20pt and 0pt of system,anchor=east] {Cost};
\node [disturbance,draw=none,name=constraint, below right = 20pt and 15pt of system,anchor=east] {Constraints};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (controller) -- node[name=u] {$u(n)$} (system);
\node [output, right =of system] (output) {};
% Once the nodes are placed, connecting them is easy.
\draw [draw,->] (input) -- node {$r(n)$} (sum);
\draw [->] (sum) -- node {$e(n)$} (controller);
\draw [->] (disturbance) -- (disturbance|-system.north);
\draw [->] (system) -- node [name=y] {$y(n)$}(output);
\draw [->] (y) |- ($(y.south) + (0,-2)$) -| node[pos=0.99]
{$-$} node [near end] {$y(n)$} (sum);
\end{tikzpicture}
\label{fig:mpc_bloc_diagram}
\end{figure}
\end{document}
Für die neue Frage nach der Bearbeitung der ursprünglichen Frage: Die Idee besteht darin, einen Knoten für das erste Label zu benennen und dann das senkrechte Koordinatensystem zu verwenden, um das andere Label an derselben X-Koordinate zu platzieren. Der folgende Beispielcode veranschaulicht dies:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,arrows,positioning}
\tikzset{
controller/.style={
draw,
fill=blue!20,
rectangle,
minimum height=3em,
minimum width=6em
},
block/.style={
draw,
fill=yellow!20,
rectangle,
minimum height=3em,
minimum width=6em
},
disturbance/.style={
draw,
line width=0pt
},
sum/.style={
draw,
circle,
node distance=1.5cm
},
input/.style={coordinate},
output/.style={coordinate}
}
\begin{document}
\begin{tikzpicture}[
auto,
node distance=1.5cm,
>=latex',
every node/.style={transform shape}
]
\node [controller] (nodea) {Some node a};
\node [controller, right =of nodea] (nodeb) {Some node b};
\node [controller, above left =of nodea] (nodec) {Some node c};
\draw [->]
(nodea) |-
node [near end] (un) {$u(n)$}
($(nodec.east)+(0,-0.35)$);
\draw [->]
(nodeb) |-
coordinate[near end] (aux)
($(nodec.east)+(0,0.35)$) node[above] at (un|-aux) {$y(n)$};
\end{tikzpicture}
\end{document}