# Section 4.5.4: Minimization of Peron-Frobenius norm (GP)

    % Boyd & Vandenberghe "Convex Optimization"
    % (see page 165-167 for more details)
    % Written for CVX by Almir Mutapcic 02/08/06
    %
    % The goal is to minimize the spectral radius of a square matrix A
    % which is elementwise nonnegative, Aij >= 0 for all i,j. In this
    % case A has a positive real eigenvalue lambda_pf (the Perron-Frobenius
    % eigenvalue) which is equal to the spectral radius, and thus gives
    % the fastest decay rate or slowest growth rate.
    % The problem of minimizing the Perron-Frobenius eigenvalue of A,
    % possibly subject to posynomial inequalities in some underlying
    % variable x can be posed as a GP (for example):
    %
    %   minimize   lambda_pf( A(x) )
    %       s.t.   f_i(x) <= 1   for i = 1,...,p
    %
    % where matrix A entries are some posynomial functions of variable x,
    % and f_i are posynomials.
    %
    % We consider a specific example in which we want to find the fastest
    % decay or slowest growth rate for the bacteria population governed
    % by a simple dynamic model (see page 166). The problem is a GP:
    %   minimize   lambda
    %       s.t.   b1*v1 + b2*v2 + b3*v3 + b4*v4 <= lambda*v1
    %              s1*v1 <= lambda*v2
    %              s2*v2 <= lambda*v3
    %              s3*v3 <= lambda*v4
    %              1/2 <= ci <= 2
    %              bi == bi^{nom}*(c1/c1^{nom})^alpha_i*(c2/c2^{nom})^beta_i
    %              si == si^{nom}*(c1/c1^{nom})^gamma_i*(c2/c2^{nom})^delta_i
    %
    % with variables bi, si, ci, vi, lambda.

    % constants
    c_nom = [1 1]';
    b_nom = [2 3 2 1]';
    alpha = [1 1 1 1]'; beta  = [1 1 1 1]';
    s_nom = [1 1 3]';
    gamma = [1 1 1]'; delta = [1 1 1]';

    cvx_begin gp
      % optimization variables
      variables lambda b(4) s(3) v(4) c(2)

      % objective is the Perron-Frobenius eigenvalue
      minimize( lambda )
      subject to
        % inequality constraints
        b'*v      <= lambda*v(1);
        s(1)*v(1) <= lambda*v(2);
        s(2)*v(2) <= lambda*v(3);
        s(3)*v(3) <= lambda*v(4);
        [0.5; 0.5] <= c; c <= [2; 2];
        % equality constraints
        b == b_nom.*((ones(4,1)*(c(1)/c_nom(1))).^alpha).*...
                    ((ones(4,1)*(c(2)/c_nom(2))).^beta);
        s == s_nom.*((ones(3,1)*(c(1)/c_nom(1))).^gamma).*...
                    ((ones(3,1)*(c(2)/c_nom(2))).^delta);
    cvx_end

    % displaying results
    disp(' ')
    if lambda < 1
      fprintf(1,'The fastest decay rate of the bacteria population is %3.2f.\n', lambda);
    else
      fprintf(1,'The slowest gr0wth rate of the bacteria population is %3.2f.\n', lambda);
    end

    disp(' ')
    fprintf(1,'The concentration of chemical 1 achieving this result is %3.2f.\n', c(1));
    fprintf(1,'The concentration of chemical 2 achieving this result is %3.2f.\n', c(2));
    disp(' ')

    % construct matrix A
    A = zeros(4,4);
    A(1,:) = b';
    A(2,1) = s(1);
    A(3,2) = s(2);
    A(4,3) = s(3);

    % eigenvalues of matrix A
    disp('Eigenvalues of matrix A are: ')
    eigA = eig(A)

    % >> eig(A) (answer checks)
    %
    %    0.8041
    %   -0.2841
    %   -0.0100 + 0.2263i
    %   -0.0100 - 0.2263i

    Calling SeDuMi: 165 variables (6 free), 103 equality constraints
    ------------------------------------------------------------------------
    SeDuMi 1.1 by AdvOL, 2005 and Jos F. Sturm, 1998, 2001-2003.
    Alg = 2: xz-corrector, Adaptive Step-Differentiation, theta = 0.250, beta = 0.500
    Split 6 free variables
    eqs m = 103, order n = 60, dim = 284, blocks = 5
    nnz(A) = 305 + 0, nnz(ADA) = 2373, nnz(L) = 1252
     it :     b*y       gap    delta  rate   t/tP*  t/tD*   feas cg cg  prec
      0 :            7.81E-001 0.000
      1 : -2.32E+000 2.64E-001 0.000 0.3378 0.9000 0.9000   1.75  1  1  2.7E+000
      2 :  5.98E-001 8.41E-002 0.000 0.3188 0.9000 0.9000   2.58  1  1  4.3E-001
      3 : -1.43E-001 2.24E-002 0.000 0.2661 0.9000 0.9000   1.31  1  1  3.8E-001
      4 : -1.86E-001 8.18E-003 0.000 0.3658 0.9000 0.9000   1.15  1  1  1.1E-001
      5 : -1.89E-001 3.38E-003 0.000 0.4128 0.9000 0.9000   1.10  1  1  4.4E-002
      6 : -2.09E-001 7.95E-004 0.000 0.2355 0.9000 0.9000   1.11  1  1  9.1E-003
      7 : -2.16E-001 1.73E-004 0.000 0.2173 0.9000 0.9000   1.09  1  1  1.9E-003
      8 : -2.18E-001 9.83E-006 0.000 0.0569 0.9900 0.9900   1.04  1  1  1.0E-004
      9 : -2.18E-001 8.02E-008 0.000 0.0082 0.9901 0.9900   1.00  1  1  1.0E-006
     10 : -2.18E-001 6.75E-010 0.302 0.0084 0.9900 0.9413   1.00  2  3  4.4E-008
     11 : -2.18E-001 2.43E-011 0.000 0.0360 0.9902 0.9900   1.01  5  5  1.5E-009

    iter seconds digits       c*x               b*y
     11      0.3   Inf -2.1807011411e-001 -2.1807010471e-001
    |Ax-b| =  1.0e-008, [Ay-c]_+ =  6.6E-010, |x|= 2.8e+001, |y|= 4.7e+000

    Detailed timing (sec)
       Pre          IPM          Post
    1.001E-002    3.305E-001    1.001E-002
    Max-norms: ||b||=1.479659e+001, ||c|| = 1,
    Cholesky |add|=0, |skip| = 0, ||L.L|| = 141.66.
    ------------------------------------------------------------------------
    Status: Solved
    Optimal value (cvx_optval): +0.804069

    The fastest decay rate of the bacteria population is 0.80.

    The concentration of chemical 1 achieving this result is 0.50.
    The concentration of chemical 2 achieving this result is 0.50.

    Eigenvalues of matrix A are:

    eigA =

       0.8041
      -0.2841
      -0.0100 + 0.2263i
      -0.0100 - 0.2263i