| Roppenecker(A,B,Lambda,Vp,lambdades,Te)
|
function [L,lambdaBF] = Roppenecker(A,B,Lambda,Vp,lambdades,Te)
%
% Synthse d'une commande ou d'un observateur multivariable par la formule de
% Roppenecker, ou "Synthse modale complte"
%
% [L,lambdaBF] = Roppenecker(A,B,Lambda,Vp,[],Te) procde la saisie des valeurs
% propres continues dsires pour le systme boucl, et renvoyes en sortie dans
% le vecteur lambdaBF. Aucune valeur propre ne peut avoir un ordre de multiplicit
% suprieur au nombre d'entres p ;
% 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
% calcule selon la formule de Roppenecker la matrice de retour d'tat L qui confre
% les valeurs propres saisies la matrice A-B*L.
%
% [L,lambdaBF] = Roppenecker(A,B,Lambda,Vp,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.
%
% Vp estla matrice dont les colonnes sont les vecteurs propres du procd,
% pour le cas o l'une des valeurs propres souhaites est identique
% l'une de celles du procd (valeur propore non dplace).
%
% 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
% Dernire mise jour : 11 aot 2010
%
n = size(A,1); p = size(B,2);
%
% 1. Choix des valeurs propres dsires pour le systme boucl, sauf si elles figurent dans les
% paramtres d'entre
%
ni = nargin;
saisie = 0;
if ni<5,
saisie = 1;
elseif isempty(lambdades),
saisie = 1;
end
if saisie == 1,
disp('N.B.: Ordre de multiplicit des valeurs propres choisies <= nombre des entres')
disp(['Introduisez n=' num2str(n) ' valeurs propres pour le systme boucl ===>']);
lambdades = saisievalpro(n,0,p);
end
if ni == 6 && Te > 0,
lambdades = exp(lambdades*Te);
end
%
% 2. Choix des vecteurs paramtres et application de la formule
%
V = zeros(n);
while det(V) == 0,
[V, P, choix, kident] = ChoixVpropVparam(A,B,n,p,Lambda,lambdades);
if choix == 1,
for i = 1:n,
if kident(i) == 0;
V(:,i) = inv(A-lambdades(i)*eye(n))*B*P(:,i);
else
P(:,i) = 0; V(:,i) = Vp(:,kident(i));
end
end
end
%
% 3. Vrification de l'indpendance linaire des nouveaux vecteurs propres, vRi :
%
if det(V) == 0;
disp('Les vecteurs vLi = inv(A-lambdades(i)*I)*B*pi doivent tre lint. indpendants');
disp('Recommencez en choisissant des pi diffrents'); beep;
else
V, P
end
end
Lroppenecker = P*inv(V);
L = arrondi_matrice(real(Lroppenecker));
lambdaBF = lambdades;
|
|