Overview
| Comment: | Addes Q weighting matrix |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | origin/master | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
302ba43d9cb69ad58c1eca69599d2c68 |
| User & Date: | gawthrop@users.sourceforge.net on 2002-05-13 16:01:10.000 |
| Other Links: | branch diff | manifest | tags |
Context
|
2002-05-13
| ||
| 16:11:09 | Various changes check-in: 12e17795c6 user: gawthrop@users.sourceforge.net tags: origin/master, trunk | |
| 16:01:10 | Addes Q weighting matrix check-in: 302ba43d9c user: gawthrop@users.sourceforge.net tags: origin/master, trunk | |
| 08:52:23 |
FIRST parameter of simpar now specifies first printed point - simulation still starts at zero check-in: eb24171cc0 user: gawthrop@users.sourceforge.net tags: origin/master, trunk | |
Changes
Modified mttroot/mtt/lib/control/PPP/ppp_nlin.m
from [543adc29f3]
to [d0ab21bae9].
|
| | | | > > > > | | 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 |
function [U, U_all, Error, Y, its] = ppp_nlin(system_name,x_0,par_0,sim,us,w,free, Q, extras)
## usage: [U, U_all, Error, Y,its ] = ppp_nlin(system_name,x_0,par_0,sim,us,w,free, Q, extras)
##
##
if nargin<9
extras.criterion = 1e-8;
extras.max_iterations = 10;
extras.v = 0.1;
extras.verbose = 1;
endif
s_system_name = sprintf("s%s", system_name); # Name of sensitivity system
## Details
[n_x,n_y,n_u] = eval(sprintf("%s_def;", system_name));
[n_tau,n_us] = size(us);
if nargin<8
Q = ones(n_y,1);
endif
## Checks
if (n_us<>n_u)
error(sprintf("Inputs (%i) differenct to system inputs (%i)", n_us, n_u));
endif
##Optimise
[par,Par,Error,Y,its] = ppp_optimise(s_system_name,x_0,par_0,sim,us,w,free,Q,extras);
U = par(free(:,1));
U_all = Par(free(:,1),:);
endfunction
|
Modified mttroot/mtt/lib/control/PPP/ppp_nlin_run.m
from [a7eaf434e3]
to [37eb564d85].
|
| | | 1 2 3 4 5 6 7 8 | function [y,u,t,p,UU,t_open,t_ppp,t_est,its_ppp,its_est] = ppp_nlin_run(system_name,i_ppp,i_par,A_u,w_s,N_ol,Q,extras) ## usage: [y,u,t,p,U,t_open,t_ppp,t_est,its_ppp,its_est] = ## ppp_nlin_run (system_name,i_ppp,i_par,A_u,w_s,N_ol[,extras]) ## ## y,u,t System output, input and corresponding time p ## Estimated parameters U PPP weight vector t_open The |
| ︙ | ︙ | |||
27 28 29 30 31 32 33 | ## Real-time implementatipn of nonlinear PPP Copyright (C) 2001,2002 ## by Peter J. Gawthrop ## Globals to pass details to simulation global system_name_sim i_ppp_sim x_0_sim y_sim u_sim A_u_sim simpar_sim ## Defaults | | | 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
## Real-time implementatipn of nonlinear PPP Copyright (C) 2001,2002
## by Peter J. Gawthrop
## Globals to pass details to simulation
global system_name_sim i_ppp_sim x_0_sim y_sim u_sim A_u_sim simpar_sim
## Defaults
if nargin<8
extras.alpha = 0.1;
extras.criterion = 1e-5;
extras.emulate_timing = 0;
extras.max_iterations = 10;
extras.simulate = 1;
extras.v = 1e-5;
extras.verbose = 0;
|
| ︙ | ︙ | |||
57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
simpar_pred = simpar; # Initial prediction simulation params
T_ol_0 = simpar.last; # The initial specified interval
n_t = round(simpar.last/simpar.dt); # Corresponding length
x_0 = eval(sprintf("%s_state(par);", system_name));
x_0_model = x_0;
[n_x,n_y,n_u] = eval(sprintf("%s_def;", system_name));
## Sensitivity system details -- defines moving horizon simulation
simpars = eval(sprintf("%s_simpar;", s_system_name));
pars = eval(sprintf("%s_numpar;", s_system_name));
x_0s = eval(sprintf("%s_state(pars);", s_system_name));
x_0_models = x_0s;
## Times
| > > > > | 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
simpar_pred = simpar; # Initial prediction simulation params
T_ol_0 = simpar.last; # The initial specified interval
n_t = round(simpar.last/simpar.dt); # Corresponding length
x_0 = eval(sprintf("%s_state(par);", system_name));
x_0_model = x_0;
[n_x,n_y,n_u] = eval(sprintf("%s_def;", system_name));
if nargin<8
Q = ones(n_y,1);
endif
## Sensitivity system details -- defines moving horizon simulation
simpars = eval(sprintf("%s_simpar;", s_system_name));
pars = eval(sprintf("%s_numpar;", s_system_name));
x_0s = eval(sprintf("%s_state(pars);", s_system_name));
x_0_models = x_0s;
## Times
|
| ︙ | ︙ | |||
161 162 163 164 165 166 167 | ## Optimise tick = time; [pars,Par,Error,Y,its] = \ ppp_optimise(s_system_name,x_0_models,pars,simpar_est,u_star_t,y_est,i_par,extras); if extras.visual | | | 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
## Optimise
tick = time;
[pars,Par,Error,Y,its] = \
ppp_optimise(s_system_name,x_0_models,pars,simpar_est,u_star_t,y_est,i_par,extras);
if extras.visual
figure(11);
title("Parameter optimisation");
II = [1:length(y_est)]; plot(II,y_est,"*", II,Y);
endif
est_time = time-tick;
t_est = [t_est;est_time];
its_est = [its_est; its-1];
|
| ︙ | ︙ | |||
201 202 203 204 205 206 207 |
x_next = x_next(n_t+1,:)'; # Initial state for next time
x_nexts(1:2:(2*n_x)-1) = x_next; # And for internal sensitivity model
## Optimize for next interval
U_old = U; # Save previous value
U = expm(A_u*T_ol)*U; # Initialise from continuation trajectory
pars(i_ppp(:,1)) = U; # Put initial value of U into the parameter vector
| | | | 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
x_next = x_next(n_t+1,:)'; # Initial state for next time
x_nexts(1:2:(2*n_x)-1) = x_next; # And for internal sensitivity model
## Optimize for next interval
U_old = U; # Save previous value
U = expm(A_u*T_ol)*U; # Initialise from continuation trajectory
pars(i_ppp(:,1)) = U; # Put initial value of U into the parameter vector
[U, U_all, Error, Y, its] = ppp_nlin(system_name,x_nexts,pars,simpars,u_star_tau,w_s,i_ppp,Q,extras);
if extras.visual
figure(12);
title("PPP optimisation");
II = [1:length(w_s)]; plot(II,w_s,"*", II,Y);
figure(1);
endif
ppp_time = time-tick;
t_ppp = [t_ppp;ppp_time];
|
| ︙ | ︙ |
Modified mttroot/mtt/lib/control/PPP/ppp_optimise.m
from [fc79616ba1]
to [bf1568c82a].
1 | function [par,Par,Error,Y,iterations,x] = \ | | > > > > | 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 |
function [par,Par,Error,Y,iterations,x] = \
ppp_optimise(system_name,x_0,par_0,simpar,u,y_0,free,Q,extras);
## Levenberg-Marquardt optimisation for PPP/MTT
## Usage: [par,Par,Error,Y,iterations,x] = ppp_optimise(system_name,x_0,par_0,simpar,u,y_0,free[,extras]);
## system_name String containing system name
## x_0 Initial state
## par_0 Initial parameter vector estimate
## simpar Simulation parameters:
## .first first time
## .dt time increment
## .stepfactor Euler integration step factor
## u System input (column vector, each row is u')
## y_0 Desired model output
## free one row for each adjustable parameter
## first column parameter indices
## second column corresponding sensitivity indices
## Q vector of positive output weights.
## extras (opt) optimisation parameters
## .criterion convergence criterion
## .max_iterations limit to number of iterations
## .v Initial Levenberg-Marquardt parameter
######################################
##### Model Transformation Tools #####
######################################
###############################################################
## Version control history
###############################################################
## $Id$
## $Log$
## Revision 1.9 2002/05/08 10:14:21 gawthrop
## Idetification now OK (Moved data range in ppp_optimise by one sample interval)
##
## Revision 1.8 2002/04/23 17:50:39 gawthrop
## error --> err to avoid name clash with built in function
##
## Revision 1.7 2001/08/10 16:19:06 gawthrop
## Tidied up the optimisation stuff
##
## Revision 1.6 2001/07/03 22:59:10 gawthrop
|
| ︙ | ︙ | |||
59 60 61 62 63 64 65 |
## Copyright (C) 1999,2000 by Peter J. Gawthrop
sim_command = sprintf("%s_ssim(x_0,par,simpar,u,i_s)", system_name);
## Extract indices
i_t = free(:,1); # Parameters
i_s = free(:,2)'; # Sensitivities
| | > > > > | 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 |
## Copyright (C) 1999,2000 by Peter J. Gawthrop
sim_command = sprintf("%s_ssim(x_0,par,simpar,u,i_s)", system_name);
## Extract indices
i_t = free(:,1); # Parameters
i_s = free(:,2)'; # Sensitivities
if nargin<9
extras.criterion = 1e-5;
extras.max_iterations = 10;
extras.v = 1e-5;
extras.verbose = 0;
endif
[n_data,n_y] = size(y_0);
if n_data<n_y
error("ppp_optimise: y_0 should be in columns, not rows")
endif
if nargin<8
Q = ones(n_y,1);
endif
n_th = length(i_s);
err_old = inf;
err_old_old = inf;
err = 1e50;
reduction = inf;
predicted_reduction = 0;
par = par_0;
|
| ︙ | ︙ | |||
126 127 128 129 130 131 132 |
##Evaluate error, cost derivative J and cost second derivative JJ
err = 0;
J = zeros(n_th,1);
JJ = zeros(n_th,n_th);
for i = 1:n_y
E = y(:,i) - y_0(:,i); # Error in ith output
| | | | | 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
##Evaluate error, cost derivative J and cost second derivative JJ
err = 0;
J = zeros(n_th,1);
JJ = zeros(n_th,n_th);
for i = 1:n_y
E = y(:,i) - y_0(:,i); # Error in ith output
err = err + Q(i)*(E'*E); # Sum the squared error over outputs
y_par_i = y_par(:,i:n_y:n_y*n_th); # sensitivity function (ith output)
J = J + Q(i)*y_par_i'*E; # Jacobian
JJ = JJ + Q(i)*y_par_i'*y_par_i; # Newton Euler approx Hessian
endfor
if iterations>1 # Adjust the Levenberg-Marquardt parameter
reduction = err_old-err;
predicted_reduction = 2*J'*step + step'*JJ*step;
r = predicted_reduction/reduction;
if (r<0.25)||(reduction<0)
|
| ︙ | ︙ |