## 18  Bryson-Denham Problem (Detailed)

### 18.1  Problem description

A detailed version of the Bryson-Denham problem

Reference: 

### 18.2  Define the independent variable, and phase:

It is common for the independent variable to be named "t", but any legal tomSym name is possible. The length of the time-interval is variable, so another tomSym symbol is created for that.

```toms t t_f
p = tomPhase('p', t, 0, t_f, 30);
setPhase(p);
```

### 18.3  A few constants.

```% The name on the mathematics:
options = struct;
options.name = 'Bryson Denham Detailed';

x1max = 1/9;
tfmax = 50;
```

### 18.4  Define a list of states

After a phase has been defined, states can be created Note that the states can be given meaningful names, even though they are simply named x1...x3 in this particular problem.

```tomStates x1 x2 x3

% Initial guess
% The guess for t_f must appear first in the list
x0 = {t_f == 0.5
icollocate({
x1 == 0
x2 == 1-2*t/t_f
x3 == 0
})};

cbox = {0 <= t_f <= 50
-10 <= icollocate(x1) <= 10
-10 <= icollocate(x2) <= 10
-10 <= icollocate(x3) <= 10};
```

### 18.5  Adding the control variable and equations

```tomControls u

x0 = {x0
collocate(u == 0)};

cbox = {cbox
-5000 <= collocate(u) <= 5000};
```

### 18.6  Equations

The equations are on a nonlinear DAE form, i.e. the states and their derivatives can be combined into arbitrary equations. Equations can also be specified point-wise, or using integrals. Integrals can be achieved by using the function integral(). Each equation must contain one or more equals (==) signs, or one or more greater than (>=) signs, or one or more less than (<=) signs.

```usquared = u^2;

ceq = collocate({
dot(x1) == x2
dot(x2) == u
dot(x3) == 0.5*usquared
0 <= x1 <= x1max % Path constraint
});

cbnd = {initial({
x1 == 0; x2 == 1; x3 == 0})
final({x1 == 0; x2 == -1})};

% The "objective" function to minimize. Cost can be specified at a point,
% or integrated over time by using the function integral.
% If costs are defined as many parts they should be added together.
objective = final(x3);
```

### 18.7  Build the .m files and general TOMLAB problem

```Prob = sym2prob('con',objective,{cbox, ceq, cbnd},x0,options);

% Solve the problem using any TOMLAB solver
Result = tomRun('snopt', Prob, 1);
```
```===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2011-02-05
=====================================================================================
Problem: ---  1: Bryson Denham Detailed         f_k       3.998132387937467900
sum(|constr|)      0.000000810449850953
f(x_k) + sum(|constr|)      3.998133198387318700
f(x_0)      0.000000000000000000

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

FuncEv   35 GradEv   33 ConstrEv   33 ConJacEv   33 Iter   32 MinorIter  170
CPU time: 0.187500 sec. Elapsed time: 0.187000 sec.
```