HQP
1.9.6
|
Estimation of parameters and initial states for a model given as MEX S-function. More...
#include <Prg_SFunctionEst.h>
Public Member Functions | |
Prg_SFunctionEst () | |
constructor | |
~Prg_SFunctionEst () | |
destructor | |
const char * | name () |
name SFunctionEst | |
Access methods for program specific members (If prefix: prg_) | |
int | nex () const |
number of experiments used for estimation | |
void | set_nex (int val) |
set number of experiments | |
int | multistage () const |
indicate if problem is treated with one stage per time interval | |
void | set_multistage (int val) |
set multistage flag | |
const MATP | ys_ref () const |
reference values for active model outputs (size: KK+1 . ny) | |
void | set_ys_ref (const MATP val) |
set reference outputs | |
const MATP | M () const |
measurement matrix M=dy/d(p,x0) (size: (KK+1)*ny . np+nx0) | |
const MATP | P () const |
precision matrix P=(M^TM)^(-1) (size: np+nx0 . np+nx0) | |
const MATP | COV () const |
covariance matrix (size: np+nx0 . np+nx0) | |
Read methods for model specific members (no If prefix). | |
Note that the prefix mdl_ is omitted in the detailed mathematical problem description. | |
const VECP | mdl_p () const |
model parameters | |
const VECP | mdl_p_min () const |
lower bounds for model parameters (note: default is 0) | |
const VECP | mdl_p_max () const |
upper bounds for model parameters | |
const IVECP | mdl_p_active () const |
indicate estimated parameters | |
const VECP | mdl_p_confidence () const |
confidence intervals of estimated parameters | |
const VECP | mdl_p_nominal () const |
nominal parameter values (for scaling) | |
const VECP | mdl_x0 () const |
model initial states (read only, note: write initial states of experiments via mdl_x0s) | |
const VECP | mdl_x0_min () const |
lower bounds for initial states | |
const VECP | mdl_x0_max () const |
upper bounds for initial states | |
const IVECP | mdl_x0_active () const |
indicate estimated initial states | |
const VECP | mdl_x0_confidence () const |
confidence intervals of estimated initial states, averaged over multiple experiments | |
const VECP | mdl_der_x0_min () const |
minimum for time derivative of x0 | |
const VECP | mdl_der_x0_max () const |
maximum for time derivative of x0 | |
const VECP | mdl_x_nominal () const |
nominal state values (for scaling) More... | |
const IVECP | mdl_u_order () const |
const VECP | mdl_x_min () const |
lower bounds on states at stage boundaries (default: -Inf) | |
const VECP | mdl_x_max () const |
upper bounds on states at stage boundaries (default: Inf) | |
const IVECP | mdl_y_active () const |
indicate measured outputs | |
const VECP | mdl_y_nominal () const |
nominal output values (for scaling) | |
const MATP | mdl_x0s () const |
initial states for each experiment (size: nex . mdl_nx) | |
const MATP | mdl_us () const |
model inputs (size: KK+1 . mdl_nu) | |
const MATP | mdl_xs () const |
model states (size: KK+1 . mdl_nx) | |
const MATP | mdl_ys () const |
model outputs (read only, size: KK+1 . mdl_ny) | |
Write methods for model specific members (no If prefix). | |
void | set_mdl_p (const VECP v) |
set values of model parameter | |
void | set_mdl_p_min (const VECP v) |
set lower bounds for model parameters | |
void | set_mdl_p_max (const VECP v) |
set upper bounds for model parameters | |
void | set_mdl_p_active (const IVECP v) |
set estimated parameters | |
void | set_mdl_p_nominal (const VECP v) |
set nominal parameters | |
void | set_mdl_x0_min (const VECP v) |
set lower bounds for initial states | |
void | set_mdl_x0_max (const VECP v) |
set upper bounds for initial states | |
void | set_mdl_x0_active (const IVECP v) |
set estimated initial states | |
void | set_mdl_der_x0_min (const VECP v) |
set minimum for dx0dt | |
void | set_mdl_der_x0_max (const VECP v) |
set maximum for dx0dt | |
void | set_mdl_x_nominal (const VECP v) |
set nominal states | |
void | set_mdl_u_order (const IVECP v) |
set interpolation order for inputs | |
void | set_mdl_x_min (const VECP v) |
set lower bounds on states | |
void | set_mdl_x_max (const VECP v) |
set upper bounds on states | |
void | set_mdl_y_active (const IVECP v) |
set measured outputs | |
void | set_mdl_y_nominal (const VECP v) |
set nominal outputs | |
void | set_mdl_x0s (const MATP v) |
set initial states | |
void | set_mdl_us (const MATP v) |
set model inputs | |
void | set_mdl_xs (const MATP v) |
set model states | |
Public Member Functions inherited from Prg_SFunction | |
Prg_SFunction () | |
constructor | |
~Prg_SFunction () | |
destructor | |
const char * | mdl_name () const |
S-function name. | |
void | set_mdl_name (const char *str) |
set S-function name | |
const char * | mdl_path () const |
S-function path, including name, used for dynamic loading. More... | |
void | set_mdl_path (const char *str) |
set S-function path | |
const char * | mdl_args () const |
String representation of S-function arguments. | |
void | set_mdl_args (const char *str) |
set S-function arguments | |
const VECP | mdl_p () const |
parameters | |
void | set_mdl_p (const VECP value) |
set parameters | |
const VECP | mdl_x0 () const |
initial states | |
void | set_mdl_x0 (const VECP value) |
set initial states | |
Public Member Functions inherited from Omu_Program | |
Omu_Program () | |
constructor | |
virtual | ~Omu_Program () |
destructor | |
virtual void | update (int kk, const adoublev &x, const adoublev &u, adoublev &f, adouble &f0, adoublev &c) |
High-level update for the optimization criterion, constraints, and discrete state equations. | |
virtual void | consistic (int kk, double t, const adoublev &x, const adoublev &u, adoublev &xt) |
High-level consistic (consistent initial conditions) routine for the initialization of continuous-time states from optimization variables x and u. More... | |
Protected Member Functions | |
void | write_active_mx_args (VECP p) |
write active parameters that are packed in p to _mx_args | |
Implementation of predefined methods. | |
| |
void | setup_model () |
load S-function | |
void | setup_stages (IVECP ks, VECP ts) |
Setup stages and time sampling. More... | |
void | setup (int k, Omu_VariableVec &x, Omu_VariableVec &u, Omu_VariableVec &c) |
Allocate states x, control parameters u, and constraints c for stage k. More... | |
void | setup_struct (int k, const Omu_VariableVec &x, const Omu_VariableVec &u, Omu_DependentVec &xt, Omu_DependentVec &F, Omu_DependentVec &f, Omu_Dependent &f0, Omu_DependentVec &c) |
void | init_simulation (int k, Omu_VariableVec &x, Omu_VariableVec &u) |
Initialize problem variables using simulation. More... | |
void | update (int kk, const Omu_StateVec &x, const Omu_Vec &u, const Omu_StateVec &xf, Omu_DependentVec &f, Omu_Dependent &f0, Omu_DependentVec &c) |
void | consistic (int kk, double t, const Omu_StateVec &x, const Omu_Vec &u, Omu_DependentVec &xt) |
void | continuous (int kk, double t, const Omu_StateVec &x, const Omu_Vec &u, const Omu_StateVec &dx, Omu_DependentVec &F) |
Protected Member Functions inherited from Prg_SFunction | |
void | read_mx_args (VECP p) |
read _mx_args into vector p | |
void | write_mx_args (VECP p) |
write vector p to _mx_args | |
bool | setContinuousTask (bool val) |
enable continuous sample time; return true if a continuous sample time exists and has been enabled | |
bool | setSampleHit (bool val) |
enable hit for all discrete sample times; return true if a discrete sample time exists and has been enabled | |
Protected Attributes | |
Omu_VariableVec | _mdl_p |
model parameters (note: default min is 0) | |
Omu_VariableVec | _mdl_x0 |
initial states | |
Omu_VariableVec | _mdl_x |
state bounds | |
IVECP | _mdl_p_active |
indicate estimated parameters | |
VECP | _mdl_p_confidence |
confidence intervals for est parameters | |
IVECP | _mdl_x0_active |
indicate estimated states | |
VECP | _mdl_x0_confidence |
confidence intervals for est x0 | |
VECP | _mdl_der_x0_min |
minimum for time derivative of x0 | |
VECP | _mdl_der_x0_max |
maximum for time derivative of x0 | |
IVECP | _mdl_u_order |
interpolation order (default: 1 (linear)) | |
IVECP | _mdl_y_active |
indicate measured outputs | |
VECP | _mdl_p_nominal |
nominal parameter values (for scaling) | |
VECP | _mdl_x_nominal |
nominal state values (for scaling) | |
VECP | _mdl_y_nominal |
nominal output values (for scaling) | |
int | _nx |
number of states for optimizer | |
int | _np |
number of estimated parameters | |
int | _nx0 |
number of estimated initial states | |
int | _ny |
number of reference outputs for estimation | |
int | _multistage |
treat as multistage problem | |
int | _nex |
number of experiments used for estimation | |
MATP | _mdl_x0s |
initial states for each experiment | |
IVECP | _exs |
index identifying experiment in estimation data | |
MATP | _mdl_us |
given model inputs | |
MATP | _mdl_xs |
calculated model states | |
MATP | _mdl_ys |
calculated model outputs | |
MATP | _ys_ref |
reference values for active outputs | |
double | _ssr |
sum of squared output residuals | |
MATP | _M2 |
measurement matrix M=dy/d(p,x0) | |
MATP | _P2 |
precision matrix P=(M^TM)^(-1) | |
MATP | _COV |
covariance matrix COV= | |
MATP | _dydx |
help variable dy/dx | |
MATP | _dxdpx0 |
help variable dx/d(p,x0) | |
MATP | _dydpx0 |
help variable dy/d(p,x0) | |
MATP | _dxfdx |
help variable dxf/dx | |
MATP | _dxfdpx0 |
help variable dxf/d(p,x0) | |
Protected Attributes inherited from Prg_SFunction | |
char * | _mdl_name |
S-function name. | |
char * | _mdl_path |
full S-function path | |
char * | _mdl_args |
S-function parameters. | |
SimStruct * | _SS |
pointer to SimStruct | |
mxArray ** | _mx_args |
S-function parameters after parsing. | |
int | _mdl_nargs |
number of S-function arguments | |
double | _t0_setup_model |
time used for initialization of model | |
int | _mdl_np |
number of model parameters | |
int | _mdl_nd |
number of discrete-time states | |
int | _mdl_nx |
number of model states (incl. discrete) | |
int | _mdl_nu |
number of model inputs | |
int | _mdl_ny |
number of model outputs | |
VECP | _mdl_p |
parameters | |
VECP | _mdl_x0 |
initial states | |
bool | _mdl_needs_setup |
indicate that setup_model needs to be called as _mdl_name, _mdl_path, or _mdl_args changed | |
Estimation of parameters and initial states for a model given as MEX S-function.
The estimation problem is formulated at the discrete time points \(t^{0,l}<t^{1,l}<\ldots<t^{K_l}\) with \(l=1,\ldots,N_{ex}\) a number of experiments. The data of all experiments is concatenated into combined vectors of time points, model inputs, and reference outputs, i.e. \(K_l+1=k_{0,l+1}\). In order to distinguish multiple experiments, it is assumed that \(t^{K_l}>t^{0,l+1}\); for instance each experiment could start with \(t^{0,l}=0\). Parameter values are constrained to be the same for all experiments, whereas initial states are individual for each experiment. Note that this is not a restriction as generally states can be initialized with parameters and as parameters can be modeled as constant states.
In the following all vector operations are defined element wise. The treated estimation problem reads
\[ \begin{array}{l} \displaystyle{} J\ =\ \sum_{l=1}^{N_{ex}} \sum_{k_l=k_{l,0}}^{K_l} \sum_{i=1}^{dim(I)} \left\{ \left[\frac{ys^{k_l}(I)-ys^{k_l}_{ref}}{y_{nominal}(I)}\right]^2 \right\}_i \quad\to\quad \min, \quad I = \mbox{find}(y_{active}), \end{array} \]
subject to the model given with the S-function methods mdlDerivatives \(f\), mdlOutputs \(g\) and mdlUpdate \(h\)
\[ \begin{array}{l} \displaystyle x(t) = \left[\begin{array}{ll} x_d^{kk}, & t\in[t^{kk},t^{kk+1}),\ kk=0,\ldots,KK \\ x_c(t) \end{array}\right], \\[3ex] \displaystyle x_d^{kk} = \frac{h[x_{nominal}\,x(t^-),\ u_{nominal}\,u(t^-)]} {x_{nominal_d}},\quad t=t^{kk},\ kk=1,\ldots,KK,\\[3ex] \displaystyle \frac{dx_c(t)}{dt} = \frac{f[x_{nominal}\,x(t),\ u_{nominal}\,u(t)]} {x_{nominal_c}}, \\[3ex] \displaystyle y(t) = \frac{g[p,\ x_{nominal}\,x(t),\ u(t)]} {y_{nominal}} \end{array} \]
with piecewise constant or linear interpolation of the inputs
\[ \begin{array}{ll} u_i(t)\ = & \left\{\begin{array}{ll} us_i^{k_l}, & i \in \mbox{find}(u_{order} = 0) \\[1ex] \displaystyle \frac{t^{k_l+1}-t}{t^{k_l+1}-t^{k_l}}\ us^{k_l} + \frac{t-t^{k_l}}{t^{k_l+1}-t^{k_l}}\ us^{k_l+1}, & \mbox{else} \end{array}\right. \\[5ex] & \quad t\in[t^{k_l},t^{k_l+1}), \quad k_l=k_{l,0},\ldots,K_l-1, \quad l=1,\ldots,N_{ex}, \end{array} \]
and subject to the constraints
\[ \begin{array}{rcccll} \displaystyle \left\{ \frac{p_{min}}{p_{nominal}} \right. &\le& \displaystyle \frac{p}{p_{nominal}} &\le& \left. \displaystyle \frac{p_{max}}{p_{nominal}} \right\}_i, \quad & i \in \mbox{find}(p_{active}), \\[3ex] \displaystyle \left\{ \frac{x^0_{min}}{x_{nominal}} \right. &\le& x(t^{0,l}) &\le& \displaystyle \left. \frac{x^0_{max}}{x_{nominal}} \right\}_i, \quad & i \in \mbox{find}(x^0_{active}), \quad l=1,\ldots,N_{ex}, \\[3ex] \displaystyle \left\{ \frac{der\_x^0_{min}}{x_{nominal}} \right. &\le& \dot{x}(t^{0,l}) &\le& \displaystyle \left. \frac{der\_x^0_{max}}{x_{nominal}} \right\}_i, \quad & i \in \mbox{find}(x^0_{active}), \quad l=1,\ldots,N_{ex}, \\[3ex] && \{ x(t^{0,l}) &=& \displaystyle \frac{x0s^l}{x_{nominal}} \}_i, \quad & i \notin \mbox{find}(x^0_{active}), \quad l=1,\ldots,N_{ex}, \\[3ex] \displaystyle \frac{x_{min}}{x_{nominal}} &\le& x(t^{k_l}) &\le& \displaystyle \frac{x_{max}}{x_{nominal}}, \quad & k_l=k_{l,0},\ldots,K_l, \quad l=1,\ldots,N_{ex}. \end{array} \]
The problem is treated as multistage problem with \(K_{N_{ex}}\) stages and one sample period per stage per default (multistage=1 or multistage=2). Discrete-time state variables with unknown initial value are introduced for the estimated parameters p, in order to preserve a sparse structure. Additional \(K_{N_{ex}}\) junction conditions (equality constraints) are introduced for the estimated parameters and \(K_{N_{ex}}-N_{ex}+1\) junction conditions are introduced for the state variables x. Alternatively the problem can be treated without stages hiding model states from the optimizer (multistage=0).
The states of all stages are either initialized with the initial states \(x0s^l\)
\[ \begin{array}{rcll} x_{initial}(t^{k_l}) &=& \displaystyle \frac{x0s^l}{x_{nominal}}, & k_l=k_{l,0},\ldots,K_l, \quad l=1,\ldots,N_{ex} \end{array} \]
or with individually given initial guesses \(xs\)
\[ \begin{array}{rcll} x_{initial}(t^{k_l}) &=& \displaystyle \frac{xs^{k_l}}{x_{nominal}}, & k_l=k_{l,0},\ldots,K_l, \quad l=1,\ldots,N_{ex}. \end{array} \]
All but the initial states of the experiments may be initialized with the results of an initial-value simulation for given initial states and inputs (multistage=0 or multistage=1). With multistage=2, individual initial states are used for each stage, resulting in the multiple shooting method. This might be useful if no sensible initial guesses can be given for unknown parameters, so that a simulation fails.
states and inputs. If the problem is treated as multistage problem, then not performing the simulation results in the multiple shooting method. This might be useful if no sensible initial guesses can be given for unknown parameters, so that a simulation fails.
Model inputs, states and outputs can be accessed through
\[ \begin{array}{l} us^{k_l} = u_{nominal}\,u(t^{k_l}), \\[1ex] xs^{k_l} = x_{nominal}\,x(t^{k_l}), \\[1ex] ys^{k_l} = y_{nominal}\,y(t^{k_l}), \quad k_l=k_{l,0},\ldots,K_l, \quad l=1,\ldots,N_{ex}. \end{array} \]
In addition to the estimated parameters and initial states, the measurement matrix M is calculated in each optimization iteration. It is defined as
\[ M = \left[\begin{array}{cc} M_p^0, & M_{x^0}^0 \\[2ex] M_p^1, & M_{x^0}^1 \\[2ex] \vdots, & \vdots \\[2ex] M_p^{K_{N_{ex}}}, & M_{x^0}^{K_{N_{ex}}} \end{array}\right] \]
with the sub-matrices
\[ \begin{array}{r} \displaystyle M_p^{k,l} = \frac{d\,\displaystyle\frac{ys^{k,l}} {y_{nominal}}(I_y)} {d\,\displaystyle\frac{p}{p_{nominal}}(I_p)}, \quad M_{x^0}^{k,l} = \frac{d\,\displaystyle\frac{ys^{k,l}}{y_{nominal}}(I_y)} {d\,\displaystyle\frac{x0s^l}{x_{nominal}}(I_{x^0})}, \quad k_l=k_{l,0},\ldots,K_l, \quad l=1,\ldots,N_{ex}, \\[7ex] I_y = \mbox{find}(y_{active}),\ I_p = \mbox{find}(p_{active}), \ I_{x^0} = \mbox{find}(x^0_{active}). \end{array} \]
Note that the sub-matrices for estimated initial states of all experiments are stored in compressed form in one column, even though individual initial states are being estimated for each experiment.
Some simple quality measures are directly calculated in order to support a first interpretation of estimation results. These are the precision matrix
\[ P = (M^TM)^{-1}, \]
and the covariance matrix
\[ COV = s_R^2 P, \qquad s_R^2=\frac{J}{n}, \qquad n=\mbox{dim}(I_y)(K+1) - \mbox{dim}(I_p) - N_{ex}\mbox{dim}(I_{x^0}) - 1, \]
assuming that the residual variance \(s_R^2\) is equal to the measurement variance. Last but not least confidence intervals for estimated parameters and initial states \(px^0\) are obtained applying the t-Test:
\[ px^0_{confidence}\ =\ |px^0_{estimated} - px^0_{actual}|\ = \ px_{nomainal} t_{\alpha/2,n}\sqrt{\mbox{diag(COV)}}, \qquad \alpha=0.05. \]
|
protectedvirtual |
Initialize problem variables using simulation.
A problem specification may set state variables x and/or control parameters u prior to the evaluation of stage k. The default version causes an initial value simulation based on initial values given in setup.
Reimplemented from Omu_Program.
|
inline |
nominal state values (for scaling)
interpolation order (0 (constant) or 1 (linear), default: 1)
References _mdl_x_nominal.
|
protectedvirtual |
Allocate states x, control parameters u, and constraints c for stage k.
Additionally setup bounds and initial values.
Implements Omu_Program.
Setup stages and time sampling.
The default implementation sets up an optimization problem without stages.
Reimplemented from Omu_Program.