PDF version (NAG web site
, 64-bit version, 64-bit version)
NAG Toolbox: nag_rand_bb_make_bridge_order (g05xe)
Purpose
nag_rand_bb_make_bridge_order (g05xe) takes a set of input times and permutes them to specify one of several predefined Brownian bridge construction orders. The permuted times can be passed to
nag_rand_bb_init (g05xa) or
nag_rand_bb_inc_init (g05xc) to initialize the Brownian bridge generators with the chosen bridge construction order.
Syntax
[
times,
ifail] = g05xe(
t0,
tend,
intime,
move, 'bgord',
bgord, 'ntimes',
ntimes, 'nmove',
nmove)
[
times,
ifail] = nag_rand_bb_make_bridge_order(
t0,
tend,
intime,
move, 'bgord',
bgord, 'ntimes',
ntimes, 'nmove',
nmove)
Description
The Brownian bridge algorithm (see
Glasserman (2004)) is a popular method for constructing a Wiener process at a set of discrete times,
, for
. To ease notation we assume that
has the index
so that
. Inherent in the algorithm is the notion of a
bridge construction order which specifies the order in which the
points of the Wiener process,
and
, for
, are generated. The value of
is always assumed known, and the first point to be generated is always the final time
. Thereafter, successive points are generated iteratively by an interpolation formula, using points which were computed at previous iterations. In many cases the bridge construction order is not important, since any construction order will yield a correct process. However, in certain cases, for example when using quasi-random variates to construct the sample paths, the bridge construction order can be important.
Supported Bridge Construction Orders
nag_rand_bb_make_bridge_order (g05xe) accepts as input an array of time points
at which the Wiener process is to be sampled. These time points are then permuted to construct the bridge. In all of the supported construction orders the first construction point is
which has index
. The remaining points are constructed by iteratively bisecting (sub-intervals of) the
time indices interval
, as
Figure 1 illustrates:
Figure 1
The time indices interval is processed in levels
, for
. Each level
contains
points
where
. The number of points at each level depends on the value of
. The points
for
and
are computed as follows: define
and set
By convention the maximum of the empty set is taken to be to be zero.
Figure 1 illustrates the algorithm when
is a power of two. When
is not a power of two, one must decide how to round the divisions by
. For example, if one rounds down to the nearest integer, then one could get the following:
Figure 2
From the series of bisections outlined above, two ways of ordering the time indices
are supported. In both cases, levels are always processed from coarsest to finest (i.e., increasing
). Within a level, the time indices can either be processed left to right (i.e., increasing
) or right to left (i.e., decreasing
). For example, when processing left to right, the sequence of time indices could be generated as:
while when processing right to left, the same sequence would be generated as:
nag_rand_bb_make_bridge_order (g05xe) therefore offers four bridge construction methods; processing either left to right or right to left, with rounding either up or down. Which method is used is controlled by the
bgord argument. For example, on the set of times
the Brownian bridge would be constructed in the following orders:
| (processing left to right, rounding down)
|
| (processing left to right, rounding up)
|
| (processing right to left, rounding down)
|
| (processing right to left, rounding up)
|
The four construction methods described above can be further modified through the use of the input array
move. To see the effect of this argument, suppose that an array
holds the output of
nag_rand_bb_make_bridge_order (g05xe) when
(i.e., the bridge construction order as specified by
bgord only). Let
be the array of all times identified by
move, and let
be the array
with all the elements in
removed, i.e.,
Then the output of
nag_rand_bb_make_bridge_order (g05xe) when
is given by
When the Brownian bridge is used with quasi-random variates, this functionality can be used to allow specific sections of the bridge to be constructed using the lowest dimensions of the quasi-random points.
References
Glasserman P (2004) Monte Carlo Methods in Financial Engineering Springer
Parameters
Compulsory Input Parameters
- 1:
– double scalar
-
, the start value of the time interval on which the Wiener process is to be constructed.
- 2:
– double scalar
-
, the largest time at which the Wiener process is to be constructed.
- 3:
– double array
-
The time points, , at which the Wiener process is to be constructed. Note that the final time is not included in this array.
Constraints:
- and , for ;
- .
- 4:
– int64int32nag_int array
-
The indices of the entries in
intime which should be moved to the front of the
times array, with
setting the
th element of
times to
. Note that
ranges from
to
ntimes. When
,
move is not referenced.
Constraint:
, for
.
The elements of
move must be unique.
Optional Input Parameters
- 1:
– int64int32nag_int scalar
Default:
The bridge construction order to use.
Constraint:
, , or .
- 2:
– int64int32nag_int scalar
-
Default:
the dimension of the array
intime.
, the number of time points in the Wiener process, excluding and .
Constraint:
.
- 3:
– int64int32nag_int scalar
-
Default:
the dimension of the array
move.
The number of elements in the array
move.
Constraint:
.
Output Parameters
- 1:
– double array
-
The output bridge construction order. This should be passed to
nag_rand_bb_init (g05xa) or
nag_rand_bb_inc_init (g05xc).
- 2:
– int64int32nag_int scalar
unless the function detects an error (see
Error Indicators and Warnings).
Error Indicators and Warnings
Errors or warnings detected by the function:
-
-
Constraint: , , or
-
-
Constraint: .
-
-
Constraint: .
-
-
Constraint: .
Constraint: .
Constraint: the elements in
intime must be in increasing order.
-
-
Constraint: for all .
Constraint: for all .
-
-
Constraint: all elements in
move must be unique.
-
An unexpected error has been triggered by this routine. Please
contact
NAG.
-
Your licence key may have expired or may not have been installed correctly.
-
Dynamic memory allocation failed.
Accuracy
Not applicable.
Further Comments
None.
Example
This example calls
nag_rand_bb_make_bridge_order (g05xe),
nag_rand_bb_init (g05xa) and
nag_rand_bb (g05xb) to generate two sample paths of a three-dimensional free Wiener process. The array
move is used to ensure that a certain part of the sample path is always constructed using the lowest dimensions of the input quasi-random points. For further details on using quasi-random points with the Brownian bridge algorithm, please see
Brownian Bridge in the G05 Chapter Introduction.
Open in the MATLAB editor:
g05xe_example
function g05xe_example
fprintf('g05xe example results\n\n');
[bgord,t0,tend,ntimes,intime,nmove,move] = get_bridge_init_data();
[times, ifail] = g05xe( ...
t0, tend, intime, move, 'bgord', bgord);
[rcomm, ifail] = g05xa( ...
t0, tend, times);
[npaths,d,start,a,term,c] = get_bridge_gen_data();
[z] = get_z(npaths, d, a, ntimes);
[z, b, ifail] = g05xb( ...
npaths, start, term, z, c, rcomm, 'a', a);
for i = 1:npaths
fprintf('Weiner Path %d, %d time steps, %d dimensions\n', i, ntimes+1, d);
w = transpose(reshape(b(:,i), d, ntimes+1));
ifail = x04ca('G', ' ', w, '');
fprintf('\n');
end
function [bgord,t0,tend,ntimes,intime,nmove,move] = get_bridge_init_data()
t0 = 0;
ntimes = int64(10);
intime = 1.71*double(1:ntimes) + t0;
tend = t0 + 1.71*double(ntimes + 1);
nmove= int64(3);
move = [int64(3), 5, 4];
bgord = int64(3);
function [npaths,d,start,a,term,c] = get_bridge_gen_data();
npaths = int64(2);
d = 3;
a = int64(0);
start = zeros(d, 1);
term = zeros(d, 1);
c = [ 6, 1, -0.2;
1, 5, 0.3;
-0.2, 0.3, 4 ];
[c, info] = f07fd('l', c);
function [z] = get_z(npaths, d, a, ntimes)
idim = d*(ntimes+1-a);
state = initialize_prng(int64(6), int64(0), [int64(1023401)]);
[iref, state] = initialize_scrambled_qrng(int64(1), int64(2), ...
idim, state);
xmean = zeros(idim, 1);
std = ones(idim, 1);
[z, iref, ifail] = g05yj( ...
xmean, std, npaths, iref);
z = z';
function [state] = initialize_prng(genid, subid, seed)
[state, ifail] = g05kf( ...
genid, subid, seed);
function [iref, state] = initialize_scrambled_qrng(genid,stype,idim,state)
iskip = int64(0);
nsdigits = int64(32);
[iref, state, ifail] = g05yn( ...
genid, stype, int64(idim), ...
iskip, nsdigits, state);
g05xe example results
Weiner Path 1, 11 time steps, 3 dimensions
1 2 3
1 -2.1275 -2.4995 -6.0191
2 -6.1589 -1.3257 -3.7378
3 -5.1917 -3.1653 -6.2291
4 -11.5557 -5.9183 -5.9062
5 -9.2492 -5.7497 -4.2989
6 -6.7853 -13.9759 -0.8990
7 -12.7642 -15.6386 -3.6481
8 -12.5245 -11.8142 3.3504
9 -15.1995 -15.5145 0.5355
10 -16.0360 -14.4140 0.0104
11 -22.6719 -14.3308 -0.2418
Weiner Path 2, 11 time steps, 3 dimensions
1 2 3
1 -0.0973 3.7229 0.8640
2 0.8027 8.5041 -0.9103
3 -3.8494 6.1062 0.1231
4 -6.6643 4.9936 -0.1329
5 -6.8095 9.3508 4.7022
6 -7.7178 10.9577 -1.4262
7 -8.0711 12.7207 4.4744
8 -12.8353 8.8296 7.6458
9 -7.9795 12.2399 7.3783
10 -6.4313 10.0770 5.5234
11 -6.6258 10.3026 6.5021
PDF version (NAG web site
, 64-bit version, 64-bit version)
© The Numerical Algorithms Group Ltd, Oxford, UK. 2009–2015