Bryson-Denham Two Phase Problem

An example of how the input could look for PROPT.

Contents

Problem description

In this example we also take advantage of the advance knowledge that the solution reaches x1=x1max with x2=0, to introduce an event that divides the time interval into two phases. This increases the accuracy of the solution.

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

Problem setup

for n=[5 21]
    toms t1 tcut
    p1 = tomPhase('p1', t1, 0, tcut, n);
    toms t2 tmax
    p2 = tomPhase('p2', t2, tcut, tmax-tcut, n);

    setPhase(p1);
    tomStates x1p1 x2p1
    tomControls up1
    setPhase(p2);
    tomStates x1p2 x2p2
    tomControls up2

    % Constant
    x1max = 1/9;

    setPhase(p1);
    % Initial guess
    if n==5
        x01 = {tcut == 0.25
            tmax == 0.5
            icollocate({
            x1p1 == 0
            x2p1 == 1-2*t1/tcut
            })
            collocate(up1==0)};
    else
        x01 = {tcut == tcut_opt
            tmax == tmax_opt
            icollocate({
            x1p1 == x1p1_opt
            x2p1 == x2p1_opt
            })
            collocate(up1==up1_opt)};
    end

    % Box constraints
    cbox1 = {0.001 <= tcut <= tmax-0.01
        tmax <= 50
        collocate({0 <= x1p1 <= x1max
        -10 <= x2p1 <= 10})};

    % Set up initial conditions in phase p1
    % Initial constraints
    cbnd1 = initial({x1p1 == 0; x2p1 == 1});

    % ODEs and path constraints
    ceq1 = collocate({
        dot(x1p1) == x2p1
        dot(x2p1) == up1});

    % We take advantage of the fact that we've determined that a good place to
    % shift between phases is when x1 reaches x1max, and that x2 must equal 0
    % there (Later, we want the solver to be able to figure this out for
    % itself).
    % Final constraints
    cbnd1 = {cbnd1
        final({x1p1 == x1max; x2p1 == 0})};

    % Using integral gives the integral over the phase of an expression -
    % in this case 0.5 times the square of u.
    % Objective
    objective1 = integrate(0.5*up1.^2);

    setPhase(p2);
    % Initial guess
    if n==5
        x02 = {icollocate({
            x1p2 == 0
            x2p2 == 1-2*t2/tmax
            })
            collocate(up2==0)};
    else
        x02 = {icollocate({
            x1p2 == x1p2_opt
            x2p2 == x2p2_opt
            })
            collocate(up2==up2_opt)};
    end

    % Box constraints
    cbox2 = collocate({0 <= x1p2 <= x1max
        -10 <= x2p2 <= 10});

    % ODEs and path constraints
    ceq2 = collocate({
        dot(x1p2) == x2p2
        dot(x2p2) == up2});

    % x2_i of p2 is already linked to x2_f of p1, but linking it to a constant
    % helps convergence.
    % Final conditions in phase p2.
    cbnd2 = {initial(x2p2 == 0)
        final(x1p2 == 0)
        final(x2p2 == -1)};

    objective2 = integrate(0.5*up2.^2);

    % Link the phases
    link = {final(p1,x1p1) == initial(p2,x1p2)
        final(p1,x2p1) == initial(p2,x2p2)};

Solve the problem

    options = struct;
    options.name = 'Bryson Denham Two Phase';
    objective = objective1+objective2;
    constr = {cbox1, cbnd1, ceq1, cbox2, cbnd2, ceq2, link};
    solution = ezsolve(objective, constr, {x01, x02}, options);
    x1p1_opt = subs(x1p1, solution);
    x2p1_opt = subs(x2p1, solution);
    up1_opt  = subs(up1, solution);
    x1p2_opt = subs(x1p2, solution);
    x2p2_opt = subs(x2p2, solution);
    up2_opt  = subs(up2, solution);
    tcut_opt = subs(tcut, solution);
    tmax_opt = subs(tmax, solution);
Problem type appears to be: con
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Bryson Denham Two Phase        f_k       3.999999993412736800
                                       sum(|constr|)      0.000000023177918609
                              f(x_k) + sum(|constr|)      4.000000016590655100
                                              f(x_0)      0.000000000000000000

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

FuncEv   39 GradEv   37 ConstrEv   37 ConJacEv   37 Iter   34 MinorIter   69
CPU time: 0.062500 sec. Elapsed time: 0.078000 sec. 
Problem type appears to be: con
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Bryson Denham Two Phase        f_k       3.999999995253987500
                                       sum(|constr|)      0.000000000347325270
                              f(x_k) + sum(|constr|)      3.999999995601312800
                                              f(x_0)      3.999999738804261200

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

FuncEv    4 GradEv    2 ConstrEv    2 ConJacEv    2 Iter    1 MinorIter   75
CPU time: 0.046875 sec. Elapsed time: 0.046000 sec. 
end

t = subs(collocate(p1,t1),solution);
t = [t;subs(collocate(p2,t2),solution)];
x1 = subs(collocate(p1,x1p1),solution);
x1 = [x1;subs(collocate(p2,x1p2),solution)];
x2 = subs(collocate(p1,x2p1),solution);
x2 = [x2;subs(collocate(p2,x2p2),solution)];

Plot the result

figure(1)
plot(t,x1,'*-',t,x2,'*-');
title('Bryson Denham Two Phase state variables');