1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
function ho1()
% Example of how to create a higher order DBN
% Written by Rainer Deventer <deventer@informatik.uni-erlangen.de> 3/28/03
bnet = createBNetNL();
%%%%%%%%%%%%
function bnet = createBNetNL(varargin)
% Generate a Bayesian network, which is able to model nonlinearities at
% the input. The only input is the order of the dynamic system. If this
% parameter is missing, the an order of two is assumed
if nargin > 0
order = varargin{1}
else
order = 2;
end
ss = 6; % For each time slice the following nodes are modeled
% ud(t_k) Discrete node, which decides whether saturation is reached.
% Node number 2
% uv(t_k) Visible input node with node number 2
% uh(t_k) Hidden input node with node number 3
% y(t_k) Modeled output, Number 4
% z(t_k) Disturbing variable, number 5
% q(t_k), number6 6
intra = zeros(ss,ss);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Within each timeslice ud(t_k) is connected with uv(t_k) and uh(t_k) %
% This part is used to model saturation %
% A connection from uv(t_k) to uh(t_k) is omitted %
% Additionally y(t_k) is connected with q(t_k). To model the disturbing%
% value z(t_k) is connected with q(t_k). %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
intra(1,2:3) = 1; % Connections ud(t_k) -> uv(t_k) and ud(t_k) -> uh(t_k)
intra(4:5,6) = 1; % Connectios y(t_k) -> q(t_k) and z(t_k) -> q(t_k)
inter = zeros(ss,ss,order);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The Markov assumption is not met as connections from time slice t to t+2 %
% exist. %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1:order
if i == 1
inter(1,1,i) = 1; %Connect the discrete nodes. This is necessary to improve
%the disturbing reaction
inter(3,4,i) = 1; %Connect uh(t_{k-1}) with y(t_k)
inter(4,4,i) = 1; %Connect y(t_{k-1}) with y(t_k)
inter(5,5,i) = 1; %Connect z(t_{k-1}) with z(t_k)
else
inter(3,4,i) = 1; %Connect uh(t_{k-i}) with y(t_k)
inter(4,4,i) = 1; %Connect y(t_{k-i}) with y(t_k)
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Define the dimensions of the discrete nodes. Node 1 has two states %
% 1 = lower saturation reached %
% 2 = Upper saturation reached %
% Values in between are model by probabilities between 0 and 1 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
node_sizes = ones(1,ss);
node_sizes(1) = 2;
dnodes = [1];
eclass = [1:6;7 2:3 8 9 6;7 2:3 10 11 6];
bnet = mk_higher_order_dbn(intra,inter,node_sizes,...
'discrete',dnodes,...
'eclass',eclass);
cov_high = 400;
cov_low = 0.01;
weight1 = randn(1,1);
weight2 = randn(1,1);
weight3 = randn(1,1);
weight4 = randn(1,1);
numOfNodes = 5 + order;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Nodes of the first time-slice %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Discrete input node,
bnet.CPD{1} = tabular_CPD(bnet,1,'CPT',[1/2 1/2],'adjustable',0);
% Modeled visible input
bnet.CPD{2} = gaussian_CPD(bnet,2,'mean',[0 10],'clamp_mean',1,...
'cov',[10 10],'clamp_cov',1);
% Modeled hidden input
bnet.CPD{3} = gaussian_CPD(bnet,3,'mean',[0, 10],'clamp_mean',1,...
'cov',[0.1 0.1],'clamp_cov',1);
% Modeled output in the first timeslice, thus there are no parents
% Usuallz the output nodes get a low covariance. But in the first
% time-slice a prediction of the output is not possible due to
% missing information
bnet.CPD{4} = gaussian_CPD(bnet,4,'mean',0,'clamp_mean',1,...
'cov',cov_high,'clamp_cov',1);
%Disturbance
bnet.CPD{5} = gaussian_CPD(bnet,5,'mean',0,...
'cov',[4],...
'clamp_mean',1,...
'clamp_cov',1);
%Observed output.
bnet.CPD{6} = gaussian_CPD(bnet,6,'mean',0,...
'clamp_mean',1,...
'cov',cov_low,'clamp_cov',1,...
'weights',[1 1],'clamp_weights',1);
% Discrete node at second time slice
bnet.CPD{7} = tabular_CPD(bnet,7,'CPT',[0.6 0.4 0.4 0.6],'adjustable',0);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Node for the model output %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bnet.CPD{8} = gaussian_CPD(bnet,10,'mean',0,...
'cov',cov_high,...
'clamp_mean',1,...
'clamp_cov',1);
% 'weights',[0.0791 0.9578]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Node for the disturbance %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bnet.CPD{9} = gaussian_CPD(bnet,11,'mean',0,'clamp_mean',1,...
'cov',[4],'clamp_cov',1,...
'weights',[1],'clamp_weights',1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Node for the model output %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bnet.CPD{10} = gaussian_CPD(bnet,16,'mean',0,'clamp_mean',1,...
'cov',cov_low,'clamp_cov',1);
% 'weights',[0.0188 -0.0067 0.0791 0.9578]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Node for the disturbance %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bnet.CPD{11} = gaussian_CPD(bnet,17,'mean',0,'clamp_mean',1,...
'cov',[0.2],'clamp_cov',1,...
'weights',[1],'clamp_weights',1);
|