"COMM" : Commande et Observation Mono- et Multivariables

by

 

27 Jun 2005 (Updated )

Companion software to french book "Commande et estimation multivariables"

ChoixVpropVparam.m
function [V, P, choix, kident] = ChoixVpropVparam(A,B,n,p,Lambda,lambdades)
%
% Saisie des vecteurs paramtres et des vecteurs propres 
%
%  [V, P] = ChoixVpropVparam(A,B,n,p,Lambda,lambdades)  compare en premier lieu
%  les valeurs propres imposes au systme boucl, transmises en entre par le
%  vecteur lambdades, aux valeurs propres de la boucle ouverte (matrice A),
%  transmises en entre par la matrice diagonale Lambda. Deux cas possibles :
%
%     * cas 1 : il n'y a aucune valeur propre commune aux systme ouvert et
%     boucl ; la saisie de vecteurs paramtres du systme boucl est alors possible soit
%     compltement au hasard, soit en liaison avec le choix des vecteurs propres
%     du systme boucl (choix "cibl") ; dans ce cas, le programme renvoie
%     choix = 0 et le vecteur kident = 0;
%
%     * cas 2 : une valeur propre au moins est commune ; la saise des vecteurs
%     paramtres au hasard est la seule possible ; le programme renvoie alors
%     choix = 1, et le vecteur kident qui contient dans son lment i, qui correspond
%      la ime valeur propre impose au systme boucl, le numro j de la premire
%     valeur propre de A qui est trouve identique  cette valeur. 
%
%  Auteur : E. Ostertag  27 juin 2005  
%

% 1. Recherche des valeurs propres du systme boucl qui sont identiques  une valeur
% propre de la boucle ouverte
%
choix = 0;
for i=1:n,
	for j=1:size(Lambda,1),
		if lambdades(i) == Lambda(j,j),
			kident(i) = j; choix = 1; break
		else,
			kident(i) = 0;
		end
	end
end
%
% 2. Si valeurs propres du systme boucl toutes diffrentes des valeurs propres
% du procd, possibilit de choix cibl des vecteurs propres et paramtres
%
if choix == 0,
	choix = input('Choix des vecteurs paramtres : 1 = au hasard; 2 = cibl ; Votre choix --> ');
	if isempty(choix),
		choix = 1;
	end
end
if choix == 1,
	disp(['Introduisez n = ' num2str(n) ' vecteurs paramtres de dimension p = ' num2str(p) ' ===>']);
	for i = 1:n,
		pi = zeros(p+1,1);
		while length(pi) ~= p,
			pi = input(['    Vecteur paramtre p' num2str(i) ' = ']);
			if length(pi) == p,
				if size(pi,1) == 1,
					P(:,i) = pi';
				else,
					P(:,i) = pi;
				end
			else,
				disp(['Resaisissez ce vecteur (dimension ' num2str(p) ')']); beep;
			end
		end
	end
	V = zeros(n);
else
	disp('Choix cibl de certaines composantes des vecteurs propres et vecteurs paramtres')
	nstrg = num2str(n); pstrg = num2str(p);
	for i=1:n,
		M = [A-lambdades(i)*eye(n) -B]; N = zeros(n,1);
		rM = rank(M); jmax = n+p-rM;
		disp(['Paire vecteur propre/vecteur paramtre associe  lambda = ' ...
					num2str(lambdades(i)) ' : ' num2str(jmax) ' inconnues  choisir arbitrairement :']);
		disp(['	Vect. propre (' nstrg ' composantes) : inconnues 1  ' nstrg ' ; '...
				'vect. paramtre (' pstrg ' composantes): inconnues ' num2str(n+1) '  ' num2str(n+p)]);
		for j=1:jmax
			ni(j) = input('				Inconnue numro --> ');
			vi(j) = input('				Valeur arbitraire choisie --> ');
			N = N - M(:,ni(j)-j+1)*vi(j); M(:, ni(j)-j+1) = []; 
		end
		sol = inv(M)*N;
		[Y,I] = sort(ni);
		for j=1:jmax
			sol = [sol(1:Y(j)-1); vi(I(j)); sol(Y(j):end)];
		end
		V(:,i) = sol(1:n);
		P(:,i) = sol(n+1:end);
	end
end

Contact us