# Scalar example

Although PROPT is mainly intended to solve for states and control variables that are functions of time, it is possible to use scalar variables as well. (This is often useful when boundary conditions are liked via a system of nonlinear equations.)

This file demonstrates how scalar variables are defined and used in propt.

For a more advanced example, see the Euler buckling problem.

## Equation involving a scalar variable

As an example, consider the equation:  (Note: Even though we only want to solve an equation, we need to set up an entire problem structure, including an independent variable and a cost function. Propt is not really meant to only solve scalar equations.)

```% Copyright (c) 2007-2008 by Tomlab Optimization Inc.

% Create an "empty" problem
problem = proptProblem;
problem.name = 'Nonlinear scalar equation';
problem.language = 'Matlab, vectorized';
problem.independent = proptIndependent('t', 0, 1);
problem.collocation = proptGausspoints(1);
problem.cost = '0';
problem.linobj = 1;

% Add a scalar variable, named "x"
problem.variables.x = proptScalar(2, 4, 3);

% Add an equation, named "eq"
problem.equations.eq = proptEquation('sin(x) = 0');

% Solve the problem
solution = proptSolve(problem);

% Display the result
disp(['And the answer is: x = ' num2str(solution.posteval.x)]);
```
```===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2009-02-05
=====================================================================================
Problem: ---  1: Nonlinear scalar equation      f_k       0.000000000000000000
sum(|constr|)      0.000000000289316693
f(x_k) + sum(|constr|)      0.000000000289316693

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied

FuncEv    1 ConstrEv    3 ConJacEv    3 Iter    2
CPU time: 0.359375 sec. Elapsed time: 0.516000 sec.
And the answer is: x = 3.1416
```

## Optimization involving a scalar variable

Scalar variables can also be used in the objective functions. Example: Maximize Subject to: ```% Create an "empty" problem
problem = proptProblem;
problem.name = 'Nonlinear scalar equation';
problem.language = 'Matlab, vectorized';
problem.independent = proptIndependent('t', 0, 1);
problem.collocation = proptGausspoints(1);

% Add a scalar variable, named "x"
problem.variables.x = proptScalar(0, 2, 1);

% Define the cost function.
problem.cost = '-sin(x)';

% Solve the problem
solution = proptSolve(problem);

% Display the result
disp(['And the answer is: x = ' num2str(solution.posteval.x)]);
```
```===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2009-02-05
=====================================================================================
Problem: ---  1: Nonlinear scalar equation      f_k      -1.000000000000000000

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied

FuncEv    8 GradEv    6 Iter    4 MinorIter    5
CPU time: 0.203125 sec. Elapsed time: 0.235000 sec.
And the answer is: x = 1.5708
```

## Optimization/equations involving scalar variables inside phases

There can be an arbitrary number of scalar variables. Variables used at the top level are accessible in any phase, while variables used inside a phase are local to that phase.

```% Create an "empty" problem
problem = proptProblem;
problem.name = 'Nonlinear scalar equation';
problem.language = 'Matlab, vectorized';

problem.variables.y = proptScalar(0, 2, 1);

clear v eq
t     = proptIndependent('t', 0, 1);
v.x   = proptScalar(0, 2, 1);
eq.eq = proptEquation('sin(x*y) = 0.5');
problem.phases.p1 = proptPhase(t, [], v, eq, [], 1);
problem.phases.p1.cost = 'x+y'; % We can have a cost inside just one phase.
problem.linobj = 1;
clear v eq
v.x   = proptScalar(0, 2, 1);
eq.eq = proptEquation('x^2 = y');
problem.phases.p2 = proptPhase(t, [], v, eq, [], 1);

% Solve the problem
solution = proptSolve(problem);

% Display the result
disp(['And the answer is: p1: x = ' num2str(solution.posteval.x_p1)]);
disp(['                   p2: x = ' num2str(solution.posteval.x_p2)]);
disp(['                       y = ' num2str(solution.posteval.y)]);
```
```===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2009-02-05
=====================================================================================
Problem: ---  1: Nonlinear scalar equation      f_k       1.447202427652263000
sum(|constr|)      0.000000078181716323
f(x_k) + sum(|constr|)      1.447202505833979500

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied