"COMM" : Commande et Observation Mono- et Multivariables

by

 

27 Jun 2005 (Updated )

Companion software to french book "Commande et estimation multivariables"

Becker_Ostertag.m
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;

Contact us