function [ok] = get_started_ok(draw_plot)
if nargin < 1
draw_plot = false;
end
% --------------------------------------------------------------------------
max_itr = 20; % maximum number of iterations
epsilon = 1e-5; % convergence criteria
N = 40; % number of time points
n = 1; % number of state vector components per time point
sigma_r = 1; % variance of measurement noise
sigma_q = 1; % variance of transition noise
sigma_e = 1; % variance of initial state estimate
initial = ones(n); % estimate for initial state value
randn('seed', 4321)
% ---------------------------------------------------------------------------
% Level of tracing during optimization
if draw_plot
level = 1;
else
level = 0;
end
m = n; % number of measurements per time point
ell = 2 * n; % number of constraints
index = 1 : n; % index vector
% ---------------------------------------------------------------------------
% information used by box_f
params.box_f_lower = 0.5 * ones(n, 1);
params.box_f_upper = 1.5 * ones(n, 1);
params.box_f_index = index;
% ---------------------------------------------------------------------------
% global information used by persist_g
params.persist_g_initial = initial;
% ---------------------------------------------------------------------------
% global information used by direct_h
%global direct_h_info
params.direct_h_index = index;
h_fun = @(k,x) direct_h(k,x,params);
% ---------------------------------------------------------------------------
% simulated true trajectory
x_true = ones(n, N);
% initial vector during optimization process
x_in = 0.5 * ones(n, N);
% measurement variances
rinv = zeros(m, m, N);
qinv = zeros(n, n, N);
z = zeros(m, N);
for k = 1 : N
xk = x_true(:, k);
ek = randn(m, 1);
hk = h_fun(k, xk);
z(:, k) = hk + ek;
qinv(:,:, k) = eye(n) / (sigma_q * sigma_q);
rinv(:,:, k) = eye(n) / (sigma_r * sigma_r);
end
qinv(:,:,1) = eye(n) / (sigma_e * sigma_e);
% ----------------------------------------------------------------------
% call back functions
f_fun = @(k,xk) box_f(k,xk,params);
g_fun = @(k,xk) persist_g(k,xk,params);
% ----------------------------------------------------------------------
% call optimizer
[x_out, u_out, info] = ckbs_nonlinear( ...
f_fun, ...
g_fun, ...
h_fun, ...
max_itr, ...
epsilon, ...
x_in, ...
z, ...
qinv, ...
rinv, ...
level ...
);
% ----------------------------------------------------------------------
ok = size(info, 1) <= max_itr;
%
% Set up affine problem corresponding to x_out (for a change in x).
% Check constraint feasibility and complementarity.
f_out = zeros(ell, N);
g_out = zeros(n, N);
h_out = zeros(m, N);
df_out = zeros(ell, n, N);
dg_out = zeros(n, n, N);
dh_out = zeros(m, n, N);
xk1 = zeros(n, 1);
for k = 1 : N
xk = x_out(:, k);
uk = u_out(:, k);
[fk, Fk] = f_fun(k, xk);
[gk, Gk] = g_fun(k, xk1);
[hk, Hk] = h_fun(k, xk);
%
ok = ok & all( fk <= epsilon); % feasibility
ok = ok & all( abs(fk) .* uk <= epsilon ); % complementarity
%
f_out(:, k) = fk;
g_out(:, k) = gk - xk;
h_out(:, k) = hk;
df_out(:,:, k) = Fk;
dg_out(:,:, k) = Gk;
dh_out(:,:, k) = Hk;
xk1 = xk;
end
ok = ok & all( all( u_out >= 0 ) );
%
% Compute gradient of unconstrained affine problem at dx equal to zero
% and then check the gradient of the Lagrangian
dx_out = zeros(n, N);
grad = ckbs_sumsq_grad(dx_out, z, g_out, h_out, dg_out, dh_out, qinv, rinv);
for k = 1 : N
uk = u_out(:, k);
Fk = df_out(:,:, k);
dk = grad(:, k);
%
ok = ok & all( abs(Fk' * uk + dk) <= epsilon );
end
% ----------------------------------------------------------------------
if draw_plot
figure(1);
clf
hold on
time = 1 : N;
plot(time, x_true(1,:), 'b-');
plot(time, x_out(1,:), 'g-');
plot(time, z(1,:), 'ko');
plot(time, 0.5*ones(1,N), 'r-');
plot(time, 1.5*ones(1,N), 'r-');
title('Position: blue=truth, green=estimate, red=constraint, o=data');
axis( [ 0 , N , -1, 3 ] )
hold off
return
end