root/library/doc/tutorial/01userguide_sim.dox @ 947

Revision 947, 12.2 kB (checked in by smidl, 14 years ago)

improved RV

Line 
1/*!
2\page userguide_sim BDM Use - System, Data, Simulation
3
4This section serves as introduction to the scenario of data simulation. Since it is the simpliest of all scenarios defined in \ref userguide0 it also serves as introduction to configuration of an experiment (see \ref ui) and basic decision making objects (bdm::RV and bdm::DS).
5
6All experiments are demonstarted on mex file \c simulator, which is also available as a standalone application.
7
8
9\section ug_sim_config Configuration of an experiment
10
11Configuration file (or config structure) is organized as a tree of information. High levels represent complex structures, leafs of the tree are basic data elements such as strings, numbers or vectors.
12
13Specific treatment was developed for objects. Since BDM is designed as object oriented library, the configuration was designed to honor the rule of inheritance. That is, offspring of a class can be used in place of its predecessor. Hence, objects (instances of classes) are configured by a structure  with compulsory field \c class. This is a string variable corresponding to the name of the class to be used. This information is stored in Matlab structures (or objects, see section on Matlab extensions).
14
15Advacnded users can find more information in (\ref ui).
16
17\subsection ug_first First experiment
18
19The first experiment that can be performed is:
20\code
21DS.class='MemDS';
22DS.Data =[1 2 3 4 5 6];
23\endcode
24which can be found in file bdmtoolbox/tutorials/userguide/memds_example.m.
25
26The code above is the minimum necessary information to run scenario \c simulator in matlab.
27To actually do so, make sure that matlab paths are correctly set, as described in \ref install.
28
29The expected result for Matlab is:
30\code
31>> M=simulator(DS)
32
33M =
34
35    ch0: [6x1 double]
36\endcode
37
38All that the simulator did was actually copying \c DS.Data to \c M.ch0. Explanation of the experiment and the logic used there follows.
39
40\section ug_sim Systems and DataSources
41
42In standard system theory, the system is typically illustrated graphically as:
43\dot
44digraph sys{
45        node [shape=box];
46        {"System"}
47        node [shape=plaintext]
48        {rank="same"; "u"; "System"; "y"}
49        "u" -> "System" -> "y" [nodesep=2];
50}
51\enddot
52Where \c u typically denotes input and \c y denotes output of the system. A causal dependence between input and output is typically presumed.
53
54We are predominantly concerned with discrete-time systems, hence, we will add indices \f$ _t \f$ to both input and output, \f$ u_t \f$ and \f$ y_t \f$. We presume that the causal dependence is \f$ u_t \f$ comes before \f$ y_t \f$.
55
56One of the definition of a system is that system is a "set of variables observed on a part of the world". Under this definition system is understood as generator of data. This definition may be a considered too simplistic, but it serves well as a description of what software object \c DataSource is.
57
58DataSource is an object that is essentially able to:
59 -# return data observed at time \f$ t \f$,
60 -# perform one a time step.
61 -# describe what these data are, via class RV, introduced in ref \ug_pdf_marg,
62 -# store log of its activity into dedicated logger.
63
64No fruther specification, e.g. if the data are pre-recorded or computed on-the-fly, are given.
65For a list of available DataSources, see ...
66
67
68\section ug_memds DataSource of pre-recorded data -- MemDS
69
70The first experiment run in \ref ug_first was actually an instance of DataSource of pre-recorded data that were stored in memory, i.e. the bdm::MemDS class.
71
72Operation of such object is trivial, the data are stored as a matrix and the general operations defined above are specialized as follows:
73 -# data observed at time \f$ t \f$  are columns of the matrix, getdata() ruturns current column,
74 -# time step itself is performed by increasing the column index,
75 -# each row is named as "ch0","ch1",...
76
77This is the default bahavior. It can be customized using the UI mechanism. Full list of options is:
78\code
79DS.class = 'MemDS';
80DS.Data = (...);            // Data matrix or data vector
81        --- optional ---
82DS.drv = RV({"ch0",...} ); // Identification how rows of the matrix Data will be known to others
83DS.time = 0;               // Index of the first column to user_info,
84\endcode
85The compulsory fields are listed at the beginning; the optional fields are separated by string "--- optional ---".
86
87Fields \c time denotes the first record to start counting from. Field \c drv is a the one that specifies identification of the data elements, (point 3. of the general requirements of a DataSource).
88
89All optionals fields will be filled by default values, it this case:
90\code
91DS.drv  = RV({'ch0'},1,0);
92DS.time = 0;
93\endcode
94Where the first line specifies a universal identification structure: random variable (bdm::RV).
95
96\section ug_rvs What is RV and how to use it
97
98RV stands for \c random \c variable which is a description of random variable or its realization. However, this object serves as general descriptor of fields in vectors of data.
99
100It is used for:
101 - desription of RV in pdfs, ways how to define marginalization and conditioning,
102 - connection between source of data and computational objects that use them,
103 - connection <b>time</b>, more exactly time shift from \f$ t \f$, defaults to 0.
104
105For example, the estimators will request the data from the above mentioned data source by asking for rv 'ch0'. If a more meaninful names are available, the fields drv can be added to read:
106\code
107DS.class='MemDS';
108DS.Data =[1 2 3 4 5 6];
109DS.drv = RV('y');
110\endcode
111Data from thsi data source will be available when estimators ask for rv 'y'.
112
113\subsection ug_rv_connect Storing results
114
115results of an experiment can be stored in many ways. This functionality was abstracted into a class called logger. Exact form of the stored resuls is chosen by choosing appropriate class.
116For example, \c stdlog writes all output in the console, \c dirfilelog writes all data in the dirfilelog format for high-speed data processing, \c mexlog writes data into matlab structure.
117The \c mexlog is the default option in bdmtoolbox.
118
119Connection between computational blocks and loggers is controlled by structure called \c log_level which governes the level of details to be logged.
120A standard Data source has two levels, \c logdt and \c logut which means "log all outputs, dt" and "log all inputs, ut".
121Readers familiar with Simulink environment may look at the RV as being unique identifiers of inputs and outputs of simulation blocks. The inputs are connected automatically with the outputs with matching RV. This view is however, very incomplete, RV have more roles than this.
122
123\section ug_pdfds How to create a simulator from pdfs
124For example, we would like to simulate a random Uniform distributed noise on interval <-1,1>.
125This is achieved by plugging an object representing uniform pdf into general simulator of independent random samples, pdfDS. Uniform density is implemented as class bdm::euni, which is created from the following structure:
126\code
127U.class='euni';
128U.rv   = RV({'a'});
129U.high = 1.0;
130U.low  = -1.0;
131\endcode
132which encodes information:\f[
133f(a) = \mathcal{U}(-1,1)
134\f]
135 
136The datasource itself, i.e. the instanc of \c EpdfDS can be then configured via:
137\code
138DS.class = 'pdfDS';
139DS.pdf  = U;
140\endcode
141where \c U is the structure defined above.
142
143Contrary to the previous example, we need to tell to algorithm \c simulator how many samples from the data source we need. This is configured by variable \c experiment.ndat. The configuration has to be finalized by:
144\code
145experiment.ndat = 10;
146M=simulator(DS,experiment);
147\endcode
148
149The result is as expected in field \c M.DS_dt_a the name of which corresponds to results form "datasouce" / "output_dt" / "name given in U.rv".
150
151If the task was only to generate random realizations, this would indeed be a very clumsy way of doing it.
152However, the power of the proposed approach will be revelead in more demanding examples, one of which follows next.
153
154By default, data from this datasouce will be named after the rvs in given by the pdfs. When pdf with no rv is used, drv of the data source is set again to 'ch0'.
155
156\section ug_arx_sim Simulating autoregressive model
157
158Consider the following autoregressive model:
159\f[
160f(y_t|y_{t-3},u_{t-1}) = \mathcal{N}( a y_{t-3} + b u_{t-1}, r)
161\f]
162where \f$ a,b \f$ are known constants, and \f$ r \f$ is known variance.
163
164We need to handle two issues:
165 -# extra unsimulated variable \f$ u \f$,
166 -# time delayes of the values.
167
168The first issue can be handled in two ways. First, \f$ u \f$ can be considered as input and as such it could be externally given to the datasource. This solution is used in scenario \c closedloop.
169However, for the \c simulator scenario we will apply the second option, that is we complement \f$ f(y_{t}|y_{t-3},u_{t-1})\f$ by extra pdf:\f[
170f(u_t) = \mathcal{N}(0, r_u)
171\f]
172where \f$ r_u \f$ is another known constant.
173Thus, the joint density is now:\f[
174f(y_{t},u_{t}|y_{t-3},u_{t-1}) = f(y_{t}|y_{t-3},u_{t-1})f(u_{t})
175\f]
176and we have no need for input since the datasource have all necessary information inside. All that is required is to store them and copy their values to appropriate places.
177
178That is done in automatic way (via bdm::datalink_buffered). The only issue a user may need to take care about is the missing initial conditions for simulation.
179By default these are set to zeros. Using the default values, the full configuration of this system is:
180\code
181y = RV({'y'});
182u = RV({'u'});
183
184fy.class = 'mlnorm\<ldmat\>';
185fy.rv    = y;
186fy.rvc   = RV({'y','u'}, [1 1], [-3, -1]);
187fy.A     = [0.5, -0.9];
188fy.const = 0;
189fy.R     = 0.1;
190
191
192fu.class = 'enorm\<ldmat\>';
193fu.rv    = u;
194fu.mu    = 0;
195fu.R     = 0.2;
196
197DS.class = 'pdfDS';
198DS.pdf.class  = 'mprod';
199DS.pdf.pdfs  = {fy, fu};
200\endcode
201
202Explanation of this example will require few remarks:
203 - class of the \c fy object is 'mlnorm\<ldmat\>' which is Normal pdf with mean value given by linear function, and covariance matrix stored in LD decomposition, see bdm::mlnorm for details.
204 - naming convention 'mlnorm\<ldmat\>' relates to the concept of templates in C++. For those unfamiliar with this concept, it is basicaly a way how to share code for different flavours of the same object. Note that mlnorm exist in three versions: mlnorm\<ldmat\>, mlnorm<chmat>, mlnorm<fsqmat>. Those classes act identically the only difference is that the internal data are stored either in LD decomposition, choleski decomposition or full matrices, respectively.
205 - the same concept is used for enorm, where enorm<chmat> and enorm<fsqmat> are also possible. In this particular use, these objects are equivalent. In specific situation, e.g. Kalman filter implemented on Choleski decomposition (bdm::KalmanCh), only enorm<chmat> is approprate.
206 - class 'mprod' represents the chain rule of probability, see \ref ug_pdf_cond.
207 
208The code above can be immediatelly run, usin the same execution sequence of \c estimator as above.
209
210\subsection ug_ini Initializing simulation
211
212When zeros are not appropriate initial conditions, the correct conditions can be set using additional commands:
213\code
214DS.init_rv = RV({'y','y','y'}, [1,1,1], [-1,-2,-3]);
215DS.init_values = [0.1, 0.2, 0.3];
216\endcode
217
218The values of \c init_values will be copied to places in history identified by corresponding values of \c init_rv.
219Initial data is not checked for completeness, i.e. values of random variables missing from \c init_rv (in this case all occurences of \f$ u \f$) are still initialized to 0.
220
221\section ug_store Storing results of simulation
222
223If the simulated data are to be analyzed off-line it may be advantageous to store them and use later on.
224This operation is straightforward if the class of logger used in the \c simulator is compatible with some datasource class.
225
226For example, the output of \c MemDS can be stored as an .it file (filename is specified in configuration structure) which can be later read by bdm::ITppFileDS.
227
228In matlab, the output of mexlog is a structure of vectors or matrices. The results can be saved in a matlab file using:
229\code
230Data=[M.y; M.u];
231drv = RVjoin({y,u});
232save pdfds_results Data drv
233\endcode
234Such data can be later provided e.g. by MemDS
235\code
236mxDS.class   = 'MemDS';
237mxDS.Data    = 'Data';
238mxDS.drv     = drv;
239\endcode
240
241For list of all DataSources and loggers, see \ref app_base
242*/
Note: See TracBrowser for help on using the browser.