Open goaldemo.m in the Editor
Run in the Command Window

# Multiobjective goal attainment optimization

This demo shows how the Optimization Toolbox can be used to solve a pole-placement problem using the multiobjective goal attainment method.

Consider here a 2-input 2-output unstable plant.

    A =  [ -0.5  0  0;  0  -2  10;  0  1  -2 ];

    B =  [ 1  0;  -2  2;  0  1 ];

    C =  [ 1  0  0;  0  0  1 ];

Suppose we wish to design an output feedback controller, x, to have poles to the left of the location [-5, -3, -1] in the complex plane. The controller must not have any gain element exceeding an absolute value of 4.

    goal = [-5, -3, -1]

    goal =

        -5    -3    -1

Set the weights equal to the goals to ensure same percentage under- or over-attainment in the goals.

    weight = abs(goal)

    weight =

         5     3     1

Initialize output feedback controller

    x0 = [ -1 -1; -1 -1];

Set upper and lower bounds on the controller

    lb = repmat(-4,size(x0))
    ub = repmat(4,size(x0))

    lb =

        -4    -4
        -4    -4

    ub =

         4     4
         4     4

Set optimization display parameter to give output at each iteration:

    options = optimset('Display','iter');

Create a vector-valued function eigfun that returns the eigenvalues of the closed loop system. This function requires additional parameters (namely, the matrices A, B, and C); the most convenient way to pass these is through an anonymous function:

    eigfun = @(x) sort(eig(A+B*x*C))

    eigfun =

        @(x) sort(eig(A+B*x*C))

To begin the optimization we call FGOALATTAIN:

    [x,fval,attainfactor,exitflag,output,lambda] = ...
            fgoalattain(eigfun,x0,goal,weight,[],[],[],[],lb,ub,[],options);

                        Attainment                 Directional
     Iter   F-count       factor      Step-size     derivative    Procedure
        0      6        1.88521
        1     12          1.061            1            1.03
        2     18         0.4211            1          -0.679
        3     24       -0.06352            1          -0.523    Hessian modified
        4     30        -0.1571            1          -0.053    Hessian modified twice
        5     36        -0.3489            1          -0.133
        6     42        -0.3643            1        -0.00768    Hessian modified
        7     48        -0.3645            1      -4.25e-005    Hessian modified
        8     54        -0.3674            1        -0.00303    Hessian modified twice
        9     60        -0.3806            1         -0.0213    Hessian modified
       10     66        -0.3862            1         0.00266
       11     72        -0.3863            1      -2.73e-005    Hessian modified twice
       12     78        -0.3863            1      -7.72e-014    Hessian modified twice
    Optimization terminated: magnitude of search direction less than 2*options.TolX
     and maximum constraint violation is less than options.TolCon.
    Active inequalities (to within options.TolCon = 1e-006):
      lower      upper     ineqlin   ineqnonlin
        1                                1
        2                                2
        4

The value of the control parameters at the solution is:

    x

    x =

       -4.0000   -0.2564
       -4.0000   -4.0000

The eigenvalues of the closed loop system are as follows:

    eigfun(x)     % These values are also held in output fval

    ans =

       -6.9313
       -4.1588
       -1.4099

The attainment factor indicates the level of goal achievement. A negative attainment factor indicates over-achievement, positive indicates under-achievement. The value attainfactor we obtained in this run indicates that the objectives have been over-achieved by about 39 percent:

    attainfactor

    attainfactor =

       -0.3863

Suppose we now require the eigenvalues to be as near as possible to the goal values, [-5, -3, -1]. Set options.GoalsExactAchieve to the number of objectives that should be as near as possible to the goals (i.e., do not try to over-achieve):

    % All three objectives should be as near as possible to the goals.
    options = optimset(options,'GoalsExactAchieve',3);

We are ready to call the optimization solver:

    [x,fval,attainfactor,exitflag,output,lambda] = ...
        fgoalattain(eigfun,x0,goal,weight,[],[],[],[],lb,ub,[],options);

                        Attainment                 Directional
     Iter   F-count       factor      Step-size     derivative    Procedure
        0      6        1.88521
        1     12          1.061            1            1.03
        2     18         0.4211            1          -0.679
        3     24         0.1437            1            -0.2    Hessian modified
        4     30        0.06407            1          -0.126    Hessian modified
        5     36       0.005703            1         -0.0268    Hessian modified
        6     42     9.619e-006            1      -2.11e-017    Hessian modified
        7     48     4.733e-011            1       2.96e-019    Hessian modified
    Optimization terminated: magnitude of directional derivative in search
     direction less than 2*options.TolFun and maximum constraint violation
      is less than options.TolCon.
    Active inequalities (to within options.TolCon = 1e-006):
      lower      upper     ineqlin   ineqnonlin
                                         1
                                         2
                                         3
                                         4
                                         5
                                         6

This time the eigenvalues of the closed loop system are as follows:

    eigfun(x)     % These values are also held in output fval

    ans =

       -5.0000
       -3.0000
       -1.0000

The attainment factor is the level of goal achievement. A negative attainment factor indicates over-achievement, positive indicates under-achievement. The low attainfactor obtained indicates that the eigenvalues have almost exactly met the goals:

    attainfactor

    attainfactor =

     -1.9343e-021