"COMM" : Commande et Observation Mono- et Multivariables

by

 

27 Jun 2005 (Updated )

Companion software to french book "Commande et estimation multivariables"

Falb_Wolovich_Roppenecker.m
function [L, M] = Falb_Wolovich_Roppenecker(A,B,C,Te)
%
% Synthse d'une commande multivariable avec dcouplage, par la mthode de Falb-Wolovich
% ou la synthse modale complte (Roppenecker) : ne s'applique que si p = q.
%
%  [L, M] = Falb_Wolovich_Roppenecker(A,B,C,Te)  calcule selon l'une de deux mthodes,
%
%      * mthode de Falb-Wolovich (choix F),
%      * mthode de la synthse modale complte, ou mthode de Roppenecker (choix R),
%
%  la matrice de retour d'tat L qui produit un systme boucl sous forme de
%  sous-sytmes monovariables en parallle. Les valeurs propres du systme en
%  boucle ouverte qui peuvent tre dplaces vers de nouvelles valeurs imposes au
%  systme boucl dpendent de la diffrence d'ordre du systme initial, et sont
%  mentionnes  l'utilisateur pour qu'il choisisse ces nouvelles valeurs.
%
%  Une valeur de Te > 0 en entre indique que ces valeurs doivent tre converties en leur
%  quivalent discret  la priode Te, par exp(valeur*Te).
%
%  La matrice M renvoye en sortie est la matrice de compensation de gain qui
%  assure un gain statique unit au systme boucl et qui est aussi calcule par
%  cet algorithme.
%
%  Utilise : saisievalpro.
%
%  Auteur : E. Ostertag  27 juin 2005  
%

n = size(A,1); p = size(B,2); q = size(C,1); D = zeros(q,p);
if p ~= q,
	disp('*** La mthode du dcouplage ne s''applique que si p=q ***'); beep;
	L=0; M=0;
	return
end
%
% 1.- Dtermination de la diffrence d'ordre delta(i) des diverses sorties yi
%
for i=1:q,
	di = 0;
	Mtest = C(i,:)*A^di*B;
	while C(i,:)*A^di*B == 0,
		di = di+1;
	end
	delta(i)=di+1;
end
%
% 2.- Diffrence d'ordre globale "sumdelta" du systme multivariable
%
Delta = 0;
for i=1:q,
	Delta = Delta+delta(i);
end
if Delta == n,
	disp('Delta = n, donc toutes les valeurs propres peuvent tre dplaces');
else
	disp(['Delta < n : seules ' num2str(Delta) ' valeurs propres peuvent tre dplaces']);
end
%
% 3.- Dcouplage possible seulement si la matrice D* calcule ci-dessous est inversible
%
for i=1:q,
	Dstar(i,:) = C(i,:)*A^(delta(i)-1)*B;
end
if det(Dstar) ~= 0,
%
% 4.- Dtermination par placement de ples des dnominateurs des q sous-
%     systmes monovariables dcoupls, d'ordres respectifs delta(i) :
%
	disp('Mthode choisie :');
  disp('                 F = mthode de Falb-Wolovich (par dfaut)');
  disp('                 R = mthode de Roppenecker (synthse modale complte)');
  method = input('Votre choix --> ','s');
	if isempty(method)
		method = 'F';
	else
		method = upper(method(1));
	end
	sys_BO = ss(A, B, C, D, Te);
	G_BO = tf(sys_BO);
	kP = 1;
	for i=1:q,
		lambdades = saisievalpro(delta(i),Te);
		linep{i} = real(poly(lambdades));
		if Te > 0,
			knum(i) = polyval(linep{i},1);
		else
			knum(i) = polyval(linep{i},0);
		end
		if method == 'F',
			P(i,:) = C(i,:)*polyvalm(linep{i},A);
		else
			e_vect =[zeros(1,i-1) 1 zeros(q-i,1)]';
			for k=1:delta(i),
				G_BO_lambdades = evalfr(G_BO,lambdades(k));
				P(:,kP) = -inv(G_BO_lambdades)*e_vect;
				V(:,kP) = inv(A-lambdades(k)*eye(n))*B*P(:,kP);
				kP = kP+1;
			end
		end
	end
	if method == 'F',
		Ldecouplage = inv(Dstar)*P;	
	else
		Z_BO = zero(sys_BO);
		nz_BO = length(Z_BO);
		for i=1:nz_BO,
% % % 			Rbkmat = [A-Z_BO(i)*eye(n) B; C D]; null_vect = null(Rbkmat,'r'); nv = size(null_vect,2);
			Rbkmat = [A-Z_BO(i)*eye(n) B; C D]; null_vect = null(Rbkmat); nv = size(null_vect,2);
			Xz = null_vect(1:n,1:nv), Uz = null_vect(n+1:n+p,1:nv),
			V(:,kP:kP+nv-1) = Xz;	P(:,kP:kP+nv-1) = -Uz;
			kP = kP+nv;
			if kP > n,
				break;
			end
		end
		Ldecouplage = P*inv(V);
	end	
else
	disp('D* n''est pas inversible ===> dcouplage impossible'); beep;
	L=0; M=0;
	return
end
L = arrondi_matrice(Ldecouplage); M = inv(Dstar)*diag([knum]);

Contact us