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
|
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
|
-
-
+
+
+
+
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
-
-
-
-
-
-
+
+
+
+
+
-
-
|
function [w,y,y_theta] = mtt_sfreq(system_name,theta,indices);
## usage: [t,y,y_theta] = mtt_sfreq(system_name,theta);
function [w,y,y_theta] = mtt_sfreq(system_name,theta,free);
## usage: [w,y,y_theta] = mtt_sfreq(system_name,theta,free);
##
## Frequency response with name system_name and parameter vector theta
## The order of components in theta is determined in system_numpar.txt:
## y_theta contains the corresponding sensitivity functions
## Assumes system generated by the sBG approach
## Copyright (C) 1999 by Peter J. Gawthrop
## $Id$
## Assumes SISO system
global mtt_n_parameters mtt_parameters # Global "argc argv"
global mtt_w # Frequencies (if not specified in simpar file
N = length(theta);
eval(sprintf("[nx,ny,nu,nz,nyz] = %s_def;", system_name));
if nargin<3
indices = ones(size(theta));
free = 1;
endif
N = length(theta);
if N!=length(indices)
error(sprintf("The length (%i) of indices must be the same as that of theta (%i)",length(indices),N));
y_theta = [];
if length(free)==0
free=1; # Make the loop happen once to get y and X
endif
[n,m] = size(free);
if m==1
free = free';
endif
eval(sprintf("%s_simpar;", system_name)); # Read the "simulation" parameters
w = logspace(mttwmin,mttwmax,mttwsteps)'; # Frequency range
eval(sprintf("%s_simpar;", system_name)); # Read the "simulation"
# parameters
if exist("mttwmin") # Compute frequency range
w = logspace(mttwmin,mttwmax,mttwsteps)'; # Frequency range
else # use global mtt_w
w = mtt_w;
endif
y_theta = [];
mtt_n_parameters = 2*N;
mtt_parameters(2:2:2*N) = theta; # The actual parameters
for i = 1:N
mtt_n_parameters = 1+N;
mtt_parameters(2:1+N) = theta; # The actual parameters
for i = free
if indices(i)
mtt_parameters(1:2:2*N-1) = 0; # The sensitivity switches are off
mtt_parameters(1) = i; # Select wich sens. function
mtt_parameters(2*i-1) = 1; # Set the approriate sensitivity switch
# on
eval(sprintf("%s_numpar;", system_name)); # Read the parameters
eval(sprintf("[A,B,C,D,E] = %s_dm;", system_name)); # Evaluate the descriptor matrices
fr = dm2fr(A,B,C,D,E,w);
y_theta = [y_theta fr(:,2)]; # Sensitivity frequency response
eval(sprintf("%s_numpar;", system_name)); # Read the parameters
eval(sprintf("[A,B,C,D,E] = %s_dm;", system_name)); # Evaluate the
# descriptor matrices
fr = dm2fr(A,B,C,D,E,w);
y_theta = [y_theta fr(:,2)]; # Sensitivity frequency response
endif
endfor
y = fr(:,1); # Actual frequency response
endfunction
|