function [L,lambdaBF] = Becker_Ostertag(A,B,Lambda,lambdades,T)
%
% Synthse d'une commande ou d'un observateur multivariable par la formule de
% Becker-Ostertag
%
% [L,lambdaBF] = Becker_Ostertag(A,B,Lambda,[],Te) procde la saisie des
% valeurs propres continues dsires pour le systme boucl. Deux cas sont possibles,
% selon le choix fait pour la forme canonique de la matrice de systme du systme boucl :
%
% * cas 1 : forme canonique de commandabilit
% * cas 2 : forme diagonale ou de Jordan
%
% Dans le cas 1, un nombre quelconque de valeurs propres identiques peut tre
% choisi. Dans le cas 2, une valeur propre ne doit pas avoir un ordre de
% multiplicit suprieur au nombre d'entres du procd. Les valeurs propres
% saisies sont renvoyes en retour dans le vecteur lambdaBF :
% si Te = 0, les valeurs propres saisies sont renvoyes sans modification ;
% Si Te > 0, les valeurs propores saisies sont converties en valeurs discrtes
% (priode Te) par exp(lambda*Te), avant d'tre renvoyes.
% La matrice Lambda en entre est la matrice diagonale des valeurs propres de A, donc du
% systme ouvert, pour comparaison avec les valeurs propres imposes au systme boucl.
% Le programme demande ensuite d'introduire les vecteurs paramtres invariants,
% en liaison ou non avec le choix des vecteurs propres du systme boucl, puis
% cacule, selon la formule de Becker-Ostertag la matrice de retour d'tat L qui
% confre ces valeurs propres la matrice A-B*L.
%
% [L,lambdaBF] = Becker_Ostertag(A,B,Lambda,lambdades,Te) fait la mme chose, sauf
% que les valeurs propres dsires pour le systme boucl sont transmises en entre
% par le vecteur lambdades. Il n'y a donc plus de saisie de celles-ci.
%
% N.B.: ce programme est aussi utilis par dualit pour le calcul d'observateurs
% (identit ou d'ordre rduit).
%
% Utilise : saisievalpro, ChoixVpropVparam, arrondi_matrice.
%
% Auteur : E. Ostertag 27 juin 2005
%
n = size(A,1); p = size(B,2);
ni = nargin;
if ni<3,
disp('***Pas assez d''arguments***'); beep; L=0; lambdaBF=0;
return;
end;
%
% 1. Choix du modle canonique de la matrice de systme possdant les valeurs propres choisies
%
disp('Forme canonique choisie pour la matrice de systme du systme boucl :');
disp(' 1 = forme de commandabilit');
disp(' 2 = forme diagonale ou de Jordan');
forme = input('Votre choix --> ');
if isempty(forme) || forme ~= 2,
forme = 1;
end
D = zeros(n);
while rank(D) ~= n,
%
% 2. Choix des valeurs propres dsires pour le systme boucl, sauf si elles figurent dans les
% paramtres d'entre
%
if isempty(lambdades),
if forme == 2,
disp('Saisir des valeurs propres quelconques, d''ordre de multiplicit <= nombre des entres')
lambdades = saisievalpro(n,0,p);
else
disp('Saisir des valeurs propres quelconques, distinctes ou non, relles ou complexes)');
lambdades = saisievalpro(n);
end
end
if ni == 5 && T > 0,
lambdades = exp(lambdades*T);
end
polchar = real(poly(lambdades)); polchar = polchar/polchar(1);
if forme == 2,
Acan = diag(lambdades);
else
[Acan, Bcan, Ccan, Dcan] = tf2ss(1,polchar);
end
Qs = ctrb(A,B);
%
% 3. Choix des vecteurs propres et des vecteurs paramtres
%
[V, P] = ChoixVpropVparam(A,B,n,p,Lambda,lambdades);
%
% 4. Application de la formule de Becker-Ostertag
%
q0 = polyvalm(polchar,A);
for i=1:n,
polmatq{i} = polyvalm(polchar(1:n+1-i),Acan);
P_star((i-1)*p+1:i*p,:) = P*polmatq{i};
end
D = Qs*P_star;
if rank(D) ~= n,; % Vrification du rang de D
lambdades = [];
disp('La matrice D = Qs * [P*q1(Acan); ... ; P*qn(Acan)] doit tre inversible');
disp('Recommencez en choisissant des valeurs propres et des pi diffrents'); beep;
end
end
V = inv(q0)*D, Lbecost = P*inv(V); P
L = arrondi_matrice(real(Lbecost));
lambdaBF = lambdades;