Index: mttroot/mtt/lib/rep/ident_rep.make ================================================================== --- mttroot/mtt/lib/rep/ident_rep.make +++ mttroot/mtt/lib/rep/ident_rep.make @@ -5,14 +5,22 @@ #Copyright (C) 2000,2001,2002 by Peter J. Gawthrop ## Model targets model_reps = ${SYS}_sympar.m ${SYS}_simpar.m ${SYS}_state.m model_reps += ${SYS}_numpar.m ${SYS}_input.m ${SYS}_ode2odes.m -model_reps += ${SYS}_def.m +model_reps += ${SYS}_def.m ## Prepend s to get the sensitivity targets sensitivity_reps = ${model_reps:%=s%} + +## Model prerequisites +model_pre = ${SYS}_abg.fig ${SYS}_lbl.txt +model_pre += ${SYS}_rdae.r ${SYS}_numpar.txt + +## Prepend s to get the sensitivity targets +sensitivity_pre = ${model_pre:%=s%} + ## Simulation targets sims = ${SYS}_sim.m s${SYS}_ssim.m ## m-files needed for ident @@ -19,32 +27,40 @@ ident_m = ${SYS}_ident.m ${SYS}_ident_numpar.m ## Targets for the ident simulation ident_reps = ${ident_m} ${sims} ${model_reps} ${sensitivity_reps} -## ps output files -psfiles = ${SYS}_ident.ps ${SYS}_ident.basis.ps ${SYS}_ident.par.ps ${SYS}_ident.U.ps +## ps output files etc +psfiles = ${SYS}_ident.ps ${SYS}_ident.comparison.ps figfiles = ${psfiles:%.ps=%.fig} +gdatfiles = ${psfiles:%.ps=%.gdat} +datfiles = ${psfiles:%.ps=%.dat2} + +## LaTeX files etc +latexfiles = ${SYS}_ident_par.tex all: ${SYS}_ident.${LANG} echo: echo "sims: ${sims}" echo "model_reps: ${model_reps}" echo "sensitivity_reps: ${sensitivity_reps}" echo "ident_reps: ${ident_reps}" -${SYS}_ident.view: ${SYS}_ident.ps +${SYS}_ident.view: ${psfiles} ident_rep.sh ${SYS} view -${psfiles}: ${SYS}_ident.fig +${psfiles}: ${figfiles} ident_rep.sh ${SYS} ps -${SYS}_ident.gdat: ${SYS}_ident.dat2 +${figfiles}: ${gdatfiles} + ident_rep.sh ${SYS} fig + +${gdatfiles}: ${datfiles} ident_rep.sh ${SYS} gdat -${SYS}_ident.fig ${SYS}_ident.dat2: ${ident_reps} +${datfiles} ${latexfiles}: ${ident_reps} ident_rep.sh ${SYS} dat2 ${SYS}_ident.m: ident_rep.sh ${SYS} m @@ -55,16 +71,24 @@ ## Generic txt files ${SYS}_%.txt: mtt ${OPTS} -q -stdin ${SYS} $* txt ## Specific m files -${SYS}_ode2odes.m: ${SYS}_rdae.r +${SYS}_ode2odes.m: ${model_pre} mtt -q -stdin ${OPTS} ${SYS} ode2odes m ${SYS}_sim.m: ${SYS}_ode2odes.m mtt ${OPTS} -q -stdin ${SYS} sim m +## Numpar files +${SYS}_numpar.m: + mtt ${SYS} numpar m + +## Sympar files +${SYS}_sympar.m: + mtt ${SYS} sympar m + ## Generic txt to m ${SYS}_%.m: ${SYS}_%.txt mtt ${OPTS} -q -stdin ${SYS} $* m ## r files @@ -78,11 +102,19 @@ ## Generic txt files s${SYS}_%.txt: mtt ${OPTS} -q -stdin -s s${SYS} $* txt ## Specific m files -s${SYS}_ode2odes.m: s${SYS}_rdae.r +## Numpar files +s${SYS}_numpar.m: + mtt -s s${SYS} numpar m + +## Sympar files +s${SYS}_sympar.m: + mtt -s s${SYS} sympar m + +s${SYS}_ode2odes.m: ${sensitivity_pre} mtt -q -stdin ${OPTS} -s s${SYS} ode2odes m s${SYS}_ssim.m: mtt -q -stdin ${OPTS} -s s${SYS} ssim m @@ -95,7 +127,6 @@ mtt ${OPTS} -q -stdin s${SYS} $* m ## r files s${SYS}_rdae.r: mtt ${OPTS} -q -stdin -s s${SYS} rdae r - Index: mttroot/mtt/lib/rep/ident_rep.sh ================================================================== --- mttroot/mtt/lib/rep/ident_rep.sh +++ mttroot/mtt/lib/rep/ident_rep.sh @@ -1,10 +1,12 @@ #! /bin/sh ## ident_rep.sh ## DIY representation "ident" for mtt # Copyright (C) 2002 by Peter J. Gawthrop + +ps=ps sys=$1 rep=ident lang=$2 mtt_parameters=$3 @@ -40,239 +42,171 @@ } ## Make the _ident.m file make_ident() { filename=${sys}_${rep}.m +date=`date` echo Creating ${filename} cat > ${filename} <<EOF -function [y,u,t] = ${sys}_ident (last, ppp_names, par_names, A_u, A_w, w, Q, extras) +function [epar,Y] = ${sys}_ident (y,u,t,par_names,Q,extras) - ## usage: [y,u,t] = ${sys}_ident (last, ppp_names, par_names, A_u, A_w, w, Q, extras) + ## usage: [epar,Y] = ${sys}_ident (y,u,t,par_names,Q,extras) ## ## last last time in run ## ppp_names Column vector of names of ppp params ## par_names Column vector of names of estimated params ## extras Structure containing additional info + ## + ## Created by MTT on ${date} + + ## Sensitivity system name + system_name = "s${sys}" ##Sanity check - if nargin<2 - printf("Usage: [y,u,t] = ${sys}_ident(N, ppp_names[, par_names, extras])\n"); + if nargin<3 + printf("Usage: [y,u,t] = ${sys}_ident(y,u,t,par_names,Q,extras);"); return endif - if nargin<4 + if nargin<6 ## Set up optional parameters extras.criterion = 1e-3; extras.emulate_timing = 0; - extras.max_iterations = 15; - extras.simulate = 1; - extras.v = 1e-6; - extras.verbose = 0; + extras.max_iterations = 10; + extras.simulate = 2; + extras.v = 1e-2; + extras.verbose = 1; extras.visual = 1; endif ## System info [n_x,n_y,n_u,n_z,n_yz] = ${sys}_def; sympar = ${sys}_sympar; simpar = ${sys}_simpar; sympars = s${sys}_sympar; simpars = s${sys}_simpar; - t_ol = simpar.last; - - ## Number of intervals needed - N = ceil(last/t_ol); - - ## Setpoints - if extras.verbose - printf("Open-loop interval %3.2f \n", simpar.last); - printf(" -- using info in ${sys}_simpar.txt\n"); - printf("PPP optimisation from %3.2f to %3.2f\n", simpars.first, simpars.last); - printf(" -- using info in s${sys}_simpar.txt\n"); - endif - - t_horizon = [simpars.first+simpars.dt:simpars.dt:simpars.last]'; - w_s = ones(length(t_horizon)-1,1)*w'; - - ## Setup the indices of the adjustable stuff - if nargin<2 - i_ppp = [] - else - i_ppp = ppp_indices (ppp_names,sympar,sympars); # Parameters - endif - - n_ppp = length(i_ppp(:,1)); - - if nargin<3 - i_par = [] - else - i_par = ppp_indices (par_names,sympar,sympars); # Parameters - endif - - ## Do some simulations to check things out - ## System itself - par = ${sys}_numpar; - x_0_ol = ${sys}_state(par); - [y_ol,x_ol, t_ol] = ${sys}_sim(x_0_ol, par, simpar, ones(1,n_u)); - simpar_OL = simpar; - simpar_OL.last = simpars.last; - [y_OL,x_OL, t_OL] = ${sys}_sim(x_0_ol, par, simpar_OL, ones(1,n_u)); - - pars = s${sys}_numpar; - x_0_ppp = s${sys}_state(pars); - [y_ppp,y_par,x_ppp, t_ppp] = s${sys}_ssim(x_0_ppp, pars, simpars, ones(1,n_u)); - - simpar_PPP = simpars; - simpar_PPP.first = simpar.first; - [y_PPP,y_par,x_PPP, t_PPP] = s${sys}_ssim(x_0_ppp, pars, simpar_PPP, ones(1,n_u)); - - ## Basis functions - Us = ppp_ustar(A_u,1,t_OL',0,0)'; - - - if extras.visual #Show some graphs - figure(2); - grid; title("Outputs of ${sys}_sim and s${sys}_ssim"); - plot(t_ol,y_ol, '*', t_ppp, y_ppp, '+', t_OL, y_OL, t_PPP, y_PPP); - - - figure(3); - grid; title("Basis functions"); - plot(t_OL, Us); - - endif - - - - ## Do it - [y,u,t,P,U,t_open,t_ppp,t_est,its_ppp,its_est] \ - = ppp_nlin_run ("${sys}",i_ppp,i_par,A_u,w_s,N,Q,extras); - - ## Compute values at ends of ol intervals - T_open = cumsum(t_open); - T_open = T_open(1:length(T_open)-1); # Last point not in t - j=[]; - for i = 1:length(T_open) - j = [j; find(T_open(i)*ones(size(t))==t)]; - endfor - y_open = y(j,:); - u_open = u(j,:); - - ## Plots - - gset nokey - gset nogrid - #eval(sprintf("gset xtics %g", simpar.last)); - #gset noytics - gset format x "%.1f" - gset format y "%.2f" - gset term fig monochrome portrait fontsize 20 size 20 20 metric \ - thickness 4 - gset output "${sys}_ident.fig" - - title(""); - xlabel("Time (s)"); - ylabel("u"); - subplot(2,1,2); plot(t,u,'-', T_open, u_open,"+"); - #subplot(2,1,2); plot(t,u); - ylabel("y"); - subplot(2,1,1); plot(t,y,'-', T_open, y_open,"+"); - #subplot(2,1,1); plot(t,y); - oneplot; - gset term fig monochrome portrait fontsize 20 size 20 10 metric \ - thickness 4 - gset output "${sys}_ident.basis.fig" - title(""); - xlabel("Time (s)"); - ylabel("Basis functions"); - plot(t_OL, Us); - - - ## Create plot against time - TTT = [ [0;T_open] [T_open; last] ]'; - TT = TTT(:); - - [n,m] = size(P); - if m>0 - P = P(1:n-1,:); # Loose last point - PP = []; - for j=1:m - pp = [P(:,j) P(:,j)]'; - PP = [PP pp(:)]; - endfor - - oneplot; - gset output "${sys}_ident.par.fig" - title(""); - xlabel("Time (s)"); - ylabel("Parameters"); - plot(TT,PP); - endif - - [n,m] = size(U); - if m>0 oneplot; - gset output "${sys}_ident.U.fig" - title(""); - xlabel("Time (s)"); - ylabel("U"); - [n,m] = size(U); - U = U(1:n-1,:); # Loose last point - UU = []; - for j=1:m - uu = [U(:,j) U(:,j)]'; - UU = [UU uu(:)]; - endfor - plot(TT,UU); - endif - -endfunction - + + ## Parameter indices + i_par = ppp_indices (par_names,sympar,sympars); + + ## Initial model state + x_0 = zeros(2*n_x,1); + + ## Initial model parameters + par_0 = s${sys}_numpar; + + ## Reset simulation parameters + [n_data,m_data] = size(y); + dt = t(2)-t(1); + simpars.last = (n_data-1)*dt; + simpars.dt = dt; + + ## Identification + [epar,Par,Error,Y,iterations,x] = ppp_optimise(system_name,x_0,par_0,simpars,u,y,i_par,Q,extras); + + ## Do some plots + figure(1); + title("Comparison of data"); + xlabel("t"); + ylabel("y"); + [N,M] = size(Y); + plot(t,Y(:,M),"1;Estimated;", t,y,"3;Actual;"); + figfig("${sys}_ident_comparison"); + + ## Create a table of the parameters + [n_par,m_par] = size(i_par); + fid = fopen("${sys}_ident_par.tex", "w"); + fprintf(fid,"\\\\begin{table}[htbp]\\n"); + fprintf(fid," \\\\centering\\n"); + fprintf(fid," \\\\begin{tabular}{|l|l|}\\n"); + fprintf(fid," \\\\hline\\n"); + fprintf(fid," Name & Value \\\\\\\\ \\n"); + fprintf(fid," \\\\hline\\n"); + for i = 1:n_par + fprintf(fid,"$%s$ & %4.2f \\\\\\\\ \\n", par_names(i,:), epar(i_par(i,1))); + endfor + fprintf(fid," \\\\hline\\n"); + fprintf(fid,"\\\\end{tabular}\\n"); + fprintf(fid,"\\\\caption{Estimated Parameters}\\n"); + fprintf(fid,"\\\\end{table}\\n"); + fclose(fid); + +endfunction EOF } make_ident_numpar() { echo Creating ${ident_numpar_file} cat > ${sys}_ident_numpar.m <<EOF -function [last, ppp_names, par_names, A_u, A_w, w, Q, extras] = ${sys}_ident_numpar - -## usage: [last, ppp_names, par_names, A_u, A_w, w, Q, extras] = ${sys}_ident_numpar () -## -## - - ## Last time of run - last = 10; - - ## Specify basis functions - A_w = zeros(1,1); - n_ppp = ${nu}; - A_u = ppp_aug(A_w,laguerre_matrix(n_ppp-1,2.0)); - - - ## Names of ppp parameters - ppp_names = ""; - for i=1:n_ppp - name = sprintf("ppp_%i", i); - ppp_names = [ppp_names; name]; +function [y,u,t,par_names,Q,extras] = ${sys}_ident_numpar; + + ## usage: [y,u,t,par_names,Q,extras] = ${sys}_ident_numpar; + ## Edit for your own requirements + ## Created by MTT on ${date} + + + ## This section sets up the data source + ## simulate = 0 Real data (you supply ${sys}_ident_data.dat) + ## simulate = 1 Real data input, simulated output + ## simulate = 2 Unit step input, simulated output + simulate = 2; + + + ## System info + [n_x,n_y,n_u,n_z,n_yz] = ${sys}_def; + simpars = s${sys}_simpar; + + ## Access or create data + if (simulate<2) # Get the real data + if (exist("${sys}_ident_data.dat")==2) + printf("Loading ${sys}_ident_data.dat\n"); + load ${sys}_ident_data.dat + else + printf("Please create a loadable file ${sys}_ident_data.dat containing y,u and t\n"); + return + endif + else + switch simulate + case 2 # Step simulation + t = [0:simpars.dt:simpars.last]'; + u = ones(size(t)); + otherwise + error(sprintf("simulate = %i not implemented", simulate)); + endswitch + endif + + if (simulate>0) + par = ${sys}_numpar(); + x_0 = ${sys}_state(par); + dt = t(2)-t(1); + simpars.dt = dt; + simpars.last = t(length(t)); + y = ${sys}_sim(zeros(n_x,1), par, simpars, u); + endif + + ## Default parameter names - Put in your own here + sympar = ${sys}_sympar; # Symbolic params as structure + par_names = struct_elements (sympar); # Symbolic params as strings + [n,m] = size(par_names); # Size the string list + + ## Sort by index + for [i,name] = sympar + par_names(i,:) = sprintf("%s%s",name, blanks(m-length(name))); endfor - - ## Estimated parameters - par_names = []; - - ## Weights - Q = ones(${ny},1); - - ## Setpoint - w = zeros(${ny},1); w(1) = 1; - - ## Set up optional parameters - extras.criterion = 1e-3; + + ## Output weighting vector + Q = ones(n_y,1); + + ## Extra parameters + extras.criterion = 1e-5; extras.emulate_timing = 0; - extras.max_iterations = 15; - extras.simulate = 1; - extras.v = 1e-6; - extras.verbose = 0; - extras.visual = 0; + extras.max_iterations = 10; + extras.simulate = simulate; + extras.v = 1e-2; + extras.verbose = 1; + extras.visual = 1; endfunction EOF } @@ -281,15 +215,22 @@ ## Inform user echo Creating ${dat2_file} ## Use octave to generate the data octave -q <<EOF - [last, ppp_names, par_names, A_u, A_w, w, Q, extras] = ${sys}_ident_numpar; - [y,u,t] = ${sys}_ident(last, ppp_names, par_names, A_u, A_w, w, Q, extras); - data = [t,y,u]; + [y,u,t,par_names,Q,extras] = ${sys}_ident_numpar; + [epar,Y] = ${sys}_ident (y,u,t,par_names,Q,extras); + [N,M] = size(Y); + y_est = Y(:,M); + data = [t,y_est,u]; save -ascii ${dat2_file} data EOF + +## Tidy up the latex stuff - convert foo_123 to foo_{123} +cat ${sys}_ident_par.tex > mtt_junk +sed -e "s/_\([a-z0-9,]*\)/_{\1}/g" < mtt_junk >${sys}_ident_par.tex +rm mtt_junk } case ${lang} in numpar.m) ## Make the numpar stuff @@ -297,26 +238,32 @@ ;; m) ## Make the code make_ident; ;; - dat2|fig|basis.fig|par.fig|U.fig) + dat2) ## The dat2 language (output data) & fig file - rm ${sys}_ident*.fig make_dat2; ;; gdat) cp ${dat2_file} ${dat2s_file} dat22dat ${sys} ${rep} dat2gdat ${sys} ${rep} ;; - ps|basis.ps|par.ps|U.ps) + fig) + gdat2fig ${sys}_${rep} + ;; + ps) figs=`ls ${sys}_ident*.fig | sed -e 's/\.fig//'` - echo $figs for fig in ${figs}; do fig2dev -Leps ${fig}.fig > ${fig}.ps done + texs=`ls ${sys}_ident*.tex | sed -e 's/\.tex//'` + for tex in ${texs}; do + makedoc "" "${sys}" "ident_par" "tex" "" "" "$ps" + doc2$ps ${sys}_ident_par "$documenttype" + done ;; view) pss=`ls ${sys}_ident*.ps` echo Viewing ${pss} for ps in ${pss}; do