www.gusucode.com > optim 案例源码 matlab代码程序 > optim/goaldemo.m

    %% Multi-Objective Goal Attainment Optimization
% This example shows how to solve a pole-placement problem using the 
% multiobjective goal attainment method. This algorithm is implemented in 
% the function |fgoalattain|.

% Copyright 1990-2012 The MathWorks, Inc.

%% Equation that Describes Evolution of System
% Consider a 2-input 2-output unstable plant.
% The equation describing the evolution of the system x(t) is
%
% $$\frac{dx}{dt} = Ax(t) + Bu(t),$$
%
% where u(t) is the input (control) signal.
% The output of the system is
%
% $$y(t) = Cx(t).$$
%
% The matrices A, B, and C are

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 ];

%% Optimization Objective
% Suppose that the control signal u(t) is set as proportional to
% the output y(t):
%
% $$u(t) = Ky(t)$$
%
% for some matrix K.
%
% This means that the evolution of the system x(t) is:
%
% $$\frac{dx}{dt} = Ax(t) + BKCx(t) = (A + BKC)x(t).$$
%
% The object of the optimization is to design K to have the following
% two properties:
%
% 1. The real parts of the eigenvalues of (A + B*K*C) are smaller than
% [-5, -3, -1]. (This is called pole placement in the control literature.)
%
% 2. abs(K) <= 4  (each element of K is between -4 and 4)

%%
% In order to solve the optimization, first set the
% multiobjective goals:

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);

%%
% Initialize the output feedback controller

K0 = [ -1 -1; -1 -1]; 

%%
% Set upper and lower bounds on the controller

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

%%
% Set optimization display parameter to give output at each iteration:

options = optimoptions('fgoalattain','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 = @(K) sort(eig(A+B*K*C));

%% Call Optimization Solver
% To begin the optimization we call FGOALATTAIN:

[K,~,attainfactor] = ...
        fgoalattain(eigfun,K0,goal,weight,[],[],[],[],lb,ub,[],options); 

%%
% The value of the control parameters at the solution is:

K

%%
% The eigenvalues of the closed loop system are 
% in eigfun(K) as follows: (they are also held in output fval)

eigfun(K)

%%
% 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 
% almost 40 percent:

attainfactor 

%% Evolution of System Via Solution to ODE
% Here is how the system x(t) evolves from time 0 to time 4,
% using the calculated feedback matrix K,
% starting from the point x(0) = [1;1;1].
%
% First solve the differential equation:

[Times, xvals] = ode45(@(u,x)((A + B*K*C)*x),[0,4],[1;1;1]);
%%
% Then plot the result:
plot(Times,xvals)
legend('x_1(t)','x_2(t)','x_3(t)','Location','best')
xlabel('t');
ylabel('x(t)');

%% Set Goals To Be Achieved Exactly
% 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.GoalsExactAchieve = 3;

%% Call Optimization Solver
% We are ready to call the optimization solver:

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

%%
% The value of the control parameters at this solution is:

K

%%
% This time the eigenvalues of the closed loop system,
% which are also held in output fval, are as follows:
eigfun(K)

%%
% 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

%% Evolution of New System Via Solution to ODE
% Here is how the system x(t) evolves from time 0 to time 4,
% using the new calculated feedback matrix K,
% starting from the point x(0) = [1;1;1].
%
% First solve the differential equation:

[Times, xvals] = ode45(@(u,x)((A + B*K*C)*x),[0,4],[1;1;1]);
%%
% Then plot the result:
plot(Times,xvals)
legend('x_1(t)','x_2(t)','x_3(t)','Location','best')
xlabel('t');
ylabel('x(t)');