# embotech/Y2F

YALMIP to FORCES Pro interface
GianUlli Fix sparse parameter generation in Y2F
The sparsity pattern matrices need to be dense. This bug was introduced when switching from dense to sparse optimisation problem matrices (H, f, Aineq, ...).
Latest commit 1759f02 Aug 14, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
Y2F
examples
.bumpversion.cfg
CHANGELOG.md
CONTRIBUTING.md
VERSION
example_problem.png

# Y2F - YALMIP to FORCES Pro Interface

This project provides a simple MATLAB interface that connects YALMIP with FORCES Pro. It combines YALMIP's intuitiveness with the high efficiency of FORCES Pro for rapid development.

## Installation

Simply download the code to the desired location and add the Y2F folder to your MATLAB search path.

The Y2F interface requires a working YALMIP installation. See https://yalmip.github.io/tutorial/installation/ for instructions on how to install YALMIP.

The code has been tested with YALMIP release 20150919. Older versions might work but have not been tested.

## Example Usage

Consider the following linear MPC problem with lower and upper bounds on state and inputs, and a terminal cost term:

This problem is parametric in the initial state x(t), and the first input u0 is typically applied to the system after a solution has been obtained. The following code generates a solver that returns u0, which can then be applied to the system:

% Define variables
X = sdpvar(nx,N+1,'full'); % state trajectory: x0,x1,...,xN (columns of X)
U = sdpvar(nu,N,'full'); % input trajectory: u0,...,u_{N-1} (columns of U)

% Initialize objective and constraints of the problem
cost = 0; const = [];

% Assemble MPC formulation
for i = 1:N
% cost
if( i < N )
cost = cost + 0.5*X(:,i+1)'*Q*X(:,i+1) + 0.5*U(:,i)'*R*U(:,i);
else
cost = cost + 0.5*X(:,N+1)'*P*X(:,N+1) + 0.5*U(:,N)'*R*U(:,N);
end

% model
const = [const, X(:,i+1) == A*X(:,i) + B*U(:,i)];

% bounds
const = [const, umin <= U(:,i) <= umax];
const = [const, xmin <= X(:,i+1) <= xmax];
end

controller = optimizerFORCES(const, cost, codeoptions, X(:,1), U(:,1));


The generated solver can then be called using curly braces:

u0 = controller{x0};


## Limitations

• The Y2F interface only supports convex quadratically constrained programs (QCQPs). FORCES' NLP solver is currently not supported.
• If you have rate constraints or cost, you need to manually define delta variables (e.g. U+ = U + dU, and then constrain dU). Otherwise, Y2F cannot figure out the multistage structure from your problem, and you might obtain a slow solver.