PIDopt.tex 22.4 KB
Newer Older
1
2
% This is the LaTeX source used to generate the doumentation file PIDopt.pdf
% Downloaded from git@gitlab.control.lth.se:kristian/PIDopt.git
3
4
\documentclass[a4paper]{article}
\usepackage[left=3cm,right=3cm,top=3cm,bottom=3cm]{geometry}
Kristian Soltesz's avatar
Kristian Soltesz committed
5
\usepackage[margin=1cm,font=small]{caption}
6
7
\usepackage{amsmath}
\usepackage{filecontents}
8
\usepackage{xspace}
9

10
\usepackage{tikz,pgfplots}
11
12
13
14
15
\usetikzlibrary{shapes,positioning}
\usetikzlibrary{narrow}

\tikzset{block/.style={draw, rectangle, line width=2pt, minimum height=3em, minimum width=3em, outer sep=0pt}}
\tikzset{sumcircle/.style={draw, circle, outer sep=0pt,label=center:{{\Large$+$}}, minimum width=2em}}
Kristian Soltesz's avatar
Kristian Soltesz committed
16
\tikzset{every picture/.style={>=narrow}}%
17
18
19
20
21

\newcommand{\figref}[1]{Figure~\ref{fig:#1}}
\newcommand{\secref}[1]{Section~\ref{sec:#1}}
\newcommand{\tabref}[1]{Table~\ref{tab:#1}}

22
23
24
25
\newcommand{\pidIE}{\href{https://gitlab.control.lth.se/kristian/PIDopt/blob/master/pidIE.m}{\tt pidIE.m}\xspace}
\newcommand{\pidIAE}{\href{https://gitlab.control.lth.se/kristian/PIDopt/blob/master/pidIAE.m}{\tt pidIiAE.m}\xspace}
\newcommand{\pidfIAE}{\href{https://gitlab.control.lth.se/kristian/PIDopt/blob/master/pidfIAE.m}{\tt pidfIAE.m}\xspace}
\newcommand{\PIDopt}{\href{https://gitlab.control.lth.se/kristian/PIDopt}{\tt PIDopt} }
26

27
28
29
\bibliographystyle{plain}
\usepackage{bibentry}
\makeatletter\let\saved@bibitem\@bibitem\makeatother
30
\usepackage{hyperref}
31
\makeatletter\let\@bibitem\saved@bibitem\makeatother
32

33
\begin{document}
34
35
\nobibliography*

36
\title{{PIDopt} -- Matlab software for robust optimization-based\\{PID} controller design}
37
38
39
\author{Kristian Soltesz}
\date{\today}
\maketitle
40
\section{Acknowledgement\label{sec:ack}}
41
The software consists of three scripts for {PID}. The underlying methods for these files are:
42
\begin{itemize}
43
\item\pidfIAE\\
44
45
\bibentry{pidfIAE}

46
\item\pidIAE\\
47
48
\bibentry{pidIAE}

49
\item\pidIE\\
50
51
52
\bibentry{pidIE}
\end{itemize}

Kristian Soltesz's avatar
Kristian Soltesz committed
53
54
55
56
\noindent Please acknowledge these works through citation if you use the methods in your research.

The \PIDopt package has been put together by Kristian Soltesz. Parts of the code are slight modifications of code written by Martin Hast and Chriss Grimholt, who have given their permission to use and distribute the code.

57
58

\section{Getting started}
59
\subsection{Installation}
60
The software can be downloaded from the git repository \url{git@gitlab.control.lth.se:kristian/PIDopt.git}, accessible online at \url{https://gitlab.control.lth.se/kristian/PIDopt}. See\\\href{https://gitlab.control.lth.se/kristian/PIDopt/blob/master/example.m}{\tt example.m} at the base of the repository for an example illustrating how to run and evaluate the designs.
61

62
To run the software you will need Matlab. In addition, \pidIE relies on CVX for Matlab, which can be downloaded for free from \url{http://www.cvxr.com}.
63

64
\subsection{Bug reporting}
65
Feel free to report/correct bugs through the issue system available at \url{https://gitlab.control.lth.se/kristian/PIDopt/issues}. Make sure to read \secref{practical}, and check so that your issue has not already been reported, before opening a new issue.
66

67
The remainder of this document is dedicated to briefly describe the design method (\secref{design}), and to provide . If you remain with any questions, please send them to \href{mailto:kristian@control.lth.se}{\tt kristian@control.lth.se}.
68
\clearpage
69
\section{Design Methods\label{sec:design}}
70
\subsection{Design problem}
71
72
73
\begin{figure}[t]
\centering
\begin{tikzpicture}
74
75
76
77
\node[block](K){$K$};
\node[sumcircle,right=13mm of K](sum2){};
\node[block,right=10mm of sum2](P){$P$};
\node[sumcircle,right=10mm of P](sum3){};
78
\node[block,below=9mm of sum2](FB){$-1$};
79
\node[sumcircle,left=12mm of K](sum){};
80
\node[coordinate, left=10mm of sum](ref){};
81
\node[coordinate, right=12mm of sum3](output){};
Kristian Soltesz's avatar
Kristian Soltesz committed
82
\node[coordinate, left=8mm of output](intersect){};
83
\node[coordinate, above=10mm of sum2](dist){};
84
\node[coordinate, above=10mm of sum3](noise){};
Kristian Soltesz's avatar
Kristian Soltesz committed
85
86
87
\draw[->](ref)--node[xshift=-1mm]()[yshift=2mm]{$r$}(sum);
\draw[->](sum)--node[xshift=-1mm]()[yshift=2mm]{$e$}(K);
\draw[->](K)--node()[yshift=2mm]{$u$}(sum2);
88
\draw[->](sum2)--(P);
Kristian Soltesz's avatar
Kristian Soltesz committed
89
90
\draw[->](dist)--node[yshift=2mm]()[xshift=2mm,yshift=2mm]{$l$}(sum2);
\draw[->](noise)--node[yshift=2mm]()[xshift=2mm,yshift=2mm]{$n$}(sum3);
91
\draw[->](P)--(sum3);
Kristian Soltesz's avatar
Kristian Soltesz committed
92
93
\draw[->](sum3)--node[xshift=2mm](Y)[yshift=2mm]{$y$}(output);
\draw[->](intersect)|-(FB);
94
\draw[->](FB)-|(sum);
95
96
\end{tikzpicture}
\label{fig:cc}
97
\caption{The considered closed-loop control system with process $P$ and (filtered) PID controller $K$. The reference $r$ is not considered here ($r=0$ can be assumed). The remaining signals are the control error $e$, the control signal $u$, the measurement signal $y$, the load disturbance $l$, and measurement noise $n$.}
98
99
\end{figure}

100
All the design methods consider a closed-loop system as depicted in \figref{cc}. The process model $P$ is a SISO LTI system. The design objective is to minimize the influence of an additive (unit) load disturbance step $l$, entering at the process input at $t=0$, on the control error $e$, see \figref{cc}. In \pidIE (see \cite{pidIE} for details) the objective is to minimize the integral error,
101
102
103
\begin{equation}
\text{IE} = \int_0^\infty e(t) dt,
\end{equation}
104
whereas \pidIAE (see \cite{pidIAE} for details) and \pidfIAE (see \cite{pidfIAE} for details) aim to minimize the $\mathcal{L}_1$-norm of $e$, also known as the integrated absolute error,
105
106
107
\begin{equation}
\text{IAE} = \int_0^\infty |e(t)| dt.
\end{equation}
Kristian Soltesz's avatar
Kristian Soltesz committed
108
These objectives are standard within process control, and sound within a much broader application scope. A thorough introduction is provided in \cite{astrom06,garpinger15}.
109
110
111
112
113
114
115
116
117
118
119

Robustness of the control loop is enforced by constraining the sensitivity function
\begin{equation}
S = \dfrac{1}{1+L},
\nonumber
\end{equation}
the complementary sensitivity function
\begin{equation}
T = \dfrac{L}{1+L},
\nonumber
\end{equation}
120
as well as the noise sensitivity function $KS$. We use $L=KP$ to denote the loop transfer function. Interpretation of The sensitivity function $S$ and its complement $T=1-S$ are thoroughly covered in most introductory control textbooks, such as \cite{astrom06}. The noise sensitivity $KS$ is the transfer function from $y$ to $u$ in \figref{cc}, and determines how much measurement noise is attenuated (or amplified). Noise sensitivity is further discussed in \cite{pidfIAE}. The methods covered here impose robustness through $\mathcal{H}_\infty$-constraints:
121
122
123
124
125
126
127
\begin{align}
\|S\|_\infty &\leq M_s,\nonumber\\
\|T\|_\infty &\leq M_t,\nonumber\\
\|KS\|_\infty &\leq M_{ks}.\nonumber
\end{align}
Smaller values of $M_s$, $M_t$, and $M_{ks}$, correspond to better robustness, but typically correspond to an increase in objective. A reasonable default is $M_s=M_t=1.5$. It is not possible to give a default for $M_{ks}$ as it is unit dependent -- it is affected by the gain of $P$.

128
129
The reader is referred to the works listed in \secref{ack} for detailed information on the methods used to solve the constrained optimization problems described above. Related aspects of practical relevance are given in \secref{practical}.

130
\subsection{Controller and filter structure}
131
Process and controller representation herein is in continuous time. The controllers synthesized by \pidIE and \pidIAE are on the form
132
133
134
135
\begin{equation}
K(s) = k_p+\dfrac{ki}{s}+k_ds.
\label{eq:pid}
\end{equation}
136
Their (more common) parallel form representation,
137
\begin{equation}
138
K(s) = K\left(1+\dfrac{1}{T_i s} + T_ds \right),\nonumber
139
\end{equation}
140
can be obtained through $K=k_p$, $T_i=k_p/k_i$, $T_d=k_d/k_p$. See for example \cite{astrom06} if your controller needs to be on series form.
141

142
The controllers synthesized by \pidfIAE are a series connection of a controller on the form \eqref{eq:pid} and a second-order low-pass filter,
143
\begin{equation}
144
F(s) = \dfrac{1}{T^2s^2+2\zeta T s +1}.
145
\label{eq:filter}
146
\end{equation}
147
The filter is implemented with relative damping $\zeta=1/\sqrt{2}$. The role of the filter is to ensure high-frequency roll-off. In order to achieve this also with \pidIE and \pidIAE, simply design a low-pass filter and include it as a series connected component of $P$ prior to conducting the design.
148

149
\subsection{Which method to use?}
Kristian Soltesz's avatar
Kristian Soltesz committed
150
The robustness constraints are generally not convex in the controller parameters. The optimum (when either IE or IAE is minimized) is still unique for many processes \cite{garpinger15}, although it is possible to construct pathological examples, for which this is not true.
151

Kristian Soltesz's avatar
Kristian Soltesz committed
152
Minimizing IE \eqref{eq:ie}, as is done by \pidIE, has the advantage of being equivalent to maximizing $k_i$ of the controller \eqref{eq:pid}. This makes the objective convex (actually linear) in the controller parameters, while also being independent of the process dynamics. The resulting constrained optimization problem makes it possible to apply a very fast convex-concave method \cite{pidIE}. Furthermore, for closed-loop systems with a non-oscillating load step response it holds that IE and IAE are equal. Combinations of poor performance and low IE-values are, however, possible for oscillating responses, as illustrated in \figref{ievsiae}. In practice, this can be avoided by reasonable constraints on sensitivity and complementary sensitivity. For instance, the controllers optimized by \pidIE and \pidIAE, respectively, yield almost equivalent IAE-values for all processes of the extensive test batch reported in \cite{astrom06}, when $M_s=M_t=1.5$ is used.
153
\begin{figure}[t]
154
\centering
Kristian Soltesz's avatar
Kristian Soltesz committed
155
\begin{tikzpicture}[scale=1]
Kristian Soltesz's avatar
Kristian Soltesz committed
156
157
158
159
\begin{axis}[xlabel=$t$,ylabel=$e(t)$,axis lines=middle,xmax=17,ticks=none,axis line style={-narrow},
y label style={at=(current axis.above origin),anchor=north east},
x label style={at=(current axis.right of origin),anchor=north},
]
Kristian Soltesz's avatar
Kristian Soltesz committed
160
161
\addplot [color=black,solid,line width = 2pt]table[x=t,y=y1,col sep=space] {steps.dat};
\addplot [color=black,dashed,line width = 2pt]table[x=t,y=y2,col sep=space] {steps.dat};
162
163
\end{axis}
\end{tikzpicture}
Kristian Soltesz's avatar
Kristian Soltesz committed
164
\caption{The figure shows the load step response of two closed-loop control systems. Most users would prefer the one drawn in solid, which has a significantly smaller IAE than the dashed. However, due to the repetitive zero crossings, the IE of the dashed response is smaller than that of the solid line.}
165
166
\label{fig:ievsiae}
\end{figure}
167

168
A disadvantage with \pidIE, is that it does not provide low-pass filtering of the control signal. Hence the high-frequency asymptote associated with the derivative part is infinite. This generally results in poor noise attenuation properties. It is possible to limit the noise sensitivity by constraining $M_{ks}$, but since the optimization is carried out over a frequency grid, there is no guaranteed for frequencies. Also, constraining $M_{ks}$ in \pidIE (as well as \pidIAE) typically results in severe performance degradation (in terms of the optimization objective).
169

170
The \pidIAE and \pidfIAE methods rely on gradient-based methods to find a (local optimum) to the constrained optimization design problem. Since most practical applications result in problems with unique optima, the methods are broadly applicable. They both rely on computing the sensitivities of objective and constraints with respect to the controller (and filter) parameters, in order to obtain the Jacobian matrix by the optimization tool. They execute slower than \pidIE, and since the two often result in similar performance, \pidIE is almost always preferred to \pidIAE for practical purposes.
171

Kristian Soltesz's avatar
Kristian Soltesz committed
172
In addition to the PID controller, \pidfIAE, synthesizes a low-pass filter \eqref{eq:filter}, which allows for a controller with high-frequency roll-off, and thus good noise attenuation properties. This makes constraining $M_{ks}$ practically feasible. An alternative is to manually iterate between filter and controller design, and incorporate the filter as a series connected component of $P$ when running either \pidIE or \pidIAE. In this context, it can can be mentioned that it is common in academic work on PID control to consider minimization of IAE or IE under constraints on sensitivity (and complementary sensitivity), while disregarding noise sensitivity. One reason for this might be that it is complicated to decide on a reasonable constraint level, as it depends both on the gain of the process and on the spectral density of the measurement noise. However, disregarding noise sensitivity can result in very aggressive controllers, not suitable for practical use.
173

174
175
176
\section{Practical aspects\label{sec:practical}}
Below is an unsorted list of practical aspects, which could be worth considering.
\begin{itemize}
177

178
\item\emph{Frequency grid} All three design scripts supplied in \PIDopt rely on frequency domain design over a finite set of points (referred to as the frequency grid). It is crucial that this grid is selected sufficiently dense over the frequency range withing which constraints can be expected to be active. In most PID control applications, the bandwidth of the closed-loop system lies reasonably close to that of the controlled process, making it possible to select this grid based on process dynamics alone. The provided scripts rely on process-dependent frequency grids, which work most of the time. For certain use cases, it might, however, be necessary or desirable to change the method of grid selection by modifying the scripts. Relatedly, there is no restriction on using identical grids for the individual constraints. It is advisable to evaluate constraint fulfilment on denser grids than the ones used in the optimization, as there is no guarantee on the behaviour between grid points.
179

180
\item\emph{Feasible initial controller} The \pidIE script relies on a feasible initial controller. For inherently stable processes, the zero controller $k_p=k_i=k_d$ constitutes a feasible choice. If the process is unstable, a stabilizing controller needs to be obtained -- methods for this are not provided within \PIDopt. The \pidIAE and \pidfIAE scripts do not explicitly rely on a stable initial controller. However, computation time is normally shortened if the initial controller has similar properties to the optimal one. In cases with local optima, a \emph{good} initial controller is also desirable
181

182
183
\item\emph{Hot-start}
A viable strategy to decrease computational speed when using \pidfIAE is to use the result of \pidIE (invokes with the same process and constraint levels) as initial controller (together with a small filter constant) to hot-start the optimization. See \url{https://gitlab.control.lth.se/kristian/PIDopt/blob/master/example.m} for an example of this.
184

185
186
\item\emph{Stability}
The time domain evaluation of IAE in \pidIAE and \pidfIAE ensures stability. The convex-concave method used in \pidIE does not involve the time domain, only the gridded frequency domain. While robustness is ensured, stability is not. It is therefore possible to end up with robustly \emph{unstable} controllers. This is why it is important that an initially stabilizing controller is supplied to \pidIE. Relatedly, there is a possibility that the optimizer jumps from a robustly stable controller to a robustly unstable one between two iterations. However, the practical risk for this is very with a reasonably dense and wide frequency grid.
187

188
\item\emph{Filter damping} The relative damping of the filter \eqref{eq:filter} optimized by \pidfIAE could of course be set to another value. It is also straightforward to modify the code, so that the filter damping is co-optimized with the controller parameters and filter time constants. This is not done in the supplied code, as the performance increase did not justify the encountered computational overhead, in for the few examples it has been evaluated in.
189

190
\item\emph{Discrete time} All process models and controllers in \PIDopt are continuous time LTI objects. Continuous time was chosen in favor of discrete time only because many control system designers have better intuition for it. It is straight forward to discretize the obtained controllers. Likewise, it should be straight forward to modify the scripts for discrete time designs -- the underlying methods are not particularity geared toward continuous time implementation. 
191

192
193
\item\emph{Alternative objectives and constraints}
It is straight forward to impose constraints on other closed-loop transfer functions. In \pidIAE and \pidfIAE it would also be possible to change the objective to minimization of for instance the integrated square error (ISE), being the $\mathcal{L}_2$-norm of the load response $e$ (of which IAE is the $\mathcal{L}_1$-norm). The choices in the provided code were motivated by what is most commonly used in industrial applications. It is also possible to impose frequency-dependent robustness constraints, in which each frequency grid point is independently constrained.
Kristian Soltesz's avatar
Kristian Soltesz committed
194
\item\emph{Reference handling} The transfer functions from reference $r$ to control signal $u$ and measurement $y$ has not been considered. The reason for this is that they can be shaped by adding a reference pre-filter in combination with a feed-forward path from $r$ to $u$, to shape these transfer functions once the feedback controller $K$ has been designed. See for instance \cite{hast15} for a discussion on the topic.
195

196
197
\item\emph{Active constraints} For most practical design scenarios, at least one of the robustness constraints will be active. There are many situations, where the degrees of freedom result in only one active constraints.
\item\emph{Hessian matrix} The current implementations of \pidIAE and \pidfIAE relies on a Jacobian obtained through exact gradient computations. It is likely that computational efficiency could be improved by also providing a Hessian computed by similar means (rather than by finite differences).
198
\end{itemize}\clearpage
Kristian Soltesz's avatar
Kristian Soltesz committed
199
\bibliography{\jobname}
200
\end{document}
Kristian Soltesz's avatar
Kristian Soltesz committed
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261

\begin{filecontents}{\jobname.bib}
@article{pidfIAE,
author={Soltesz, Kristian and Grimholt, Chriss and Skogestad, Sigurd},
title={Simultaneous Design of {PID} Controller and Measurement Filter by Optimization},
journal={{IET Control Theory \& Applications}},
volume=11,
number=3,
year=2017,
pages={348--348},
doi={10.1049/iet-cta.2016.0297}
}

@inproceedings{pidIAE,
author={Grimholt, Chriss and Skogestad, Sigurd},
title={Improved Optimization-based Design of {PID} Controllers Using Exact Gradients},
booktitle={12th International Symposium on Process Systems Engineering and 25th European Symposium on Computer Aided Process Engineering},
address={Copenhagen, Denmark},
year=2015,
pages={1753--1756},
isbn={978-0-444-63445-0 (eBook)}
}

@inproceedings{pidIE,
author={Hast, Martin and {\AA}str{\"o}m, Karl Johan and Bernhardsson, Bo and Boyd, Stephen},
title={{PID} Design by Convex-Concave Optimization},
booktitle={{IEEE} European Control Conference ({ECC})},
address={Z\"{u}rish, Switzerland},
year=2013,
pages={4460--4465},
isbn={978-3-033-03962-9 (eBook)}
}

@book{astrom06,
author={{\AA}str{\"o}m, Karl Johan and H{\"a}gglund, Tore},
title={Advanced {PID} Control},
year=2006,
publisher={{ISA} - The Instrumentation, Systems and Automation Society},
isbn={978-1-55617-942-6}
}

@article{hast15,
author={Hast, Martin and H{\"a}gglund, Tore},
title={Optimal proportional-integral-derivative set-point weighting and tuning rules for proportional set-point weights},
journal={{IET Control Theory \& Applications}},
volume=9,
number=15,
year=2015,
pages={2266--2272},
doi={10.1049/iet-cta.2015.0171}
}

@phdthesis{garpinger15,
author={Garpinger, Olof},
title={Analysis and Design of Software-Based Optimal {PID} Controllers},
year=2015,
school={Department of Automatic Control, Lund University, Sweden},
number={{TFRT-1105}}
}
\end{filecontents}

Kristian Soltesz's avatar
Kristian Soltesz committed
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
\begin{filecontents*}{steps.dat}
    t         y1        y2
    0              0         0
    0.1515         0         0
    0.3030         0         0
    0.4545         0         0
    0.6061         0         0
    0.7576         0         0
    0.9091         0         0
    1.0606    0.0588    0.0588
    1.2121    0.1911    0.1911
    1.3636    0.3049    0.3049
    1.5152    0.4026    0.4026
    1.6667    0.4866    0.4866
    1.8182    0.5588    0.5588
    1.9697    0.6208    0.6208
    2.1212    0.6686    0.6670
    2.2727    0.6936    0.6853
    2.4242    0.6996    0.6787
    2.5758    0.6900    0.6503
    2.7273    0.6674    0.6027
    2.8788    0.6343    0.5383
    3.0303    0.5926    0.4592
    3.1818    0.5444    0.3682
    3.3333    0.4926    0.2698
    3.4848    0.4399    0.1684
    3.6364    0.3881    0.0678
    3.7879    0.3387   -0.0283
    3.9394    0.2930   -0.1168
    4.0909    0.2516   -0.1949
    4.2424    0.2154   -0.2601
    4.3939    0.1844   -0.3107
    4.5455    0.1586   -0.3459
    4.6970    0.1379   -0.3652
    4.8485    0.1218   -0.3690
    5.0000    0.1097   -0.3580
    5.1515    0.1011   -0.3337
    5.3030    0.0953   -0.2978
    5.4545    0.0917   -0.2524
    5.6061    0.0897   -0.1999
    5.7576    0.0888   -0.1429
    5.9091    0.0885   -0.0837
    6.0606    0.0883   -0.0248
    6.2121    0.0881    0.0314
    6.3636    0.0875    0.0830
    6.5152    0.0865    0.1282
    6.6667    0.0848    0.1656
    6.8182    0.0826    0.1943
    6.9697    0.0798    0.2137
    7.1212    0.0764    0.2237
    7.2727    0.0726    0.2243
    7.4242    0.0685    0.2163
    7.5758    0.0641    0.2003
    7.7273    0.0596    0.1775
    7.8788    0.0551    0.1492
    8.0303    0.0507    0.1169
    8.1818    0.0464    0.0820
    8.3333    0.0423    0.0461
    8.4848    0.0386    0.0106
    8.6364    0.0351   -0.0232
    8.7879    0.0320   -0.0539
    8.9394    0.0292   -0.0807
    9.0909    0.0267   -0.1027
    9.2424    0.0245   -0.1193
    9.3939    0.0226   -0.1303
    9.5455    0.0210   -0.1355
    9.6970    0.0196   -0.1352
    9.8485    0.0184   -0.1296
   10.0000    0.0174   -0.1194
   10.1515    0.0164   -0.1051
   10.3030    0.0156   -0.0876
   10.4545    0.0149   -0.0678
   10.6061    0.0142   -0.0466
   10.7576    0.0136   -0.0249
   10.9091    0.0129   -0.0035
   11.0606    0.0123    0.0167
   11.2121    0.0117    0.0350
   11.3636    0.0112    0.0508
   11.5152    0.0106    0.0637
   11.6667    0.0100    0.0733
   11.8182    0.0094    0.0794
   11.9697    0.0088    0.0821
   12.1212    0.0083    0.0815
   12.2727    0.0077    0.0777
   12.4242    0.0072    0.0711
   12.5758    0.0067    0.0622
   12.7273    0.0063    0.0514
   12.8788    0.0058    0.0393
   13.0303    0.0054    0.0264
   13.1818    0.0050    0.0132
   13.3333    0.0047    0.0004
   13.4848    0.0043   -0.0117
   13.6364    0.0040   -0.0226
   13.7879    0.0038   -0.0319
   13.9394    0.0035   -0.0394
   14.0909    0.0033   -0.0449
   14.2424    0.0031   -0.0484
   14.3939    0.0029   -0.0497
   14.5455    0.0027   -0.0490
   14.6970    0.0025   -0.0465
   14.8485    0.0024   -0.0423
   15.0000    0.0023   -0.0368
\end{filecontents*}

Kristian Soltesz's avatar
Kristian Soltesz committed
366
367
368
\begin{filecontents}{steps.csv}
% FIXME: cvs data here
\end{filecontents}