Control Lab 2
Control Lab 2
Control Lab 2
TEMA: EXPERIENCIA 2
ALUMNO:
2021
2
Experiencia 2
2.1. Objetivos.-
sys = series(sys1,sys2)
3
sys = series(sys1,sys2,outputs1,inputs2)
sys = feedback(sys1,sys2)
El modelo en lazo cerrado sys tiene un vector de entrada y otro de salida, y esta función
determina una realimentación negativa como la de la figura. Los modelos sys1 y
sys2 deben ser continuos.
sys = feedback(sys1,sys2,feedin,feedout)
El vector feedin contiene índices dentro del vector de entrada de sys1 y especifica
cuales entradas u son afectadas en el lazo de realimentación. Similarmente, feedout
especifica cuales salidas y de sys1 son usadas en la realimentación. El modelo LTI
resultante sys tiene el mismo numero de entradas y salidas que sys1.
Compensador Planta
GC(s) G(s)
R(s) Y(s)
H(S)
Compensación en Serie
G1(s) G(s)
R(s) Y(s)
G(s)
H(s)
utilizar señales de prueba típicas para comparar sistemas, como señales paso,
rampa, etc. Esta función reproduce una figura con la respuesta de sys a la entrada
Paso:
Existen cuatro tipos de modelos linealmente invariantes en el tiempo LTI que pueden
utilizarse con la librería de Sistemas de Control, que son TF (función de
transferencia), ZPK (ceros, polos y ganancia), SS (espacio de estados) y FRD
(respuesta en frecuencia). Es posible realizar la conversión de un modelo a otro, en
forma explicita, para un modelo dado sys con la siguiente sintaxis:
Por ejemplo:
sys = ss(-2,1,1,3)
zpk(sys)
s 2.333
3
s 2
Se tiene un circuito serie RLC Alimentado por una fuente v(t) entrada y vc(t) tensión
en el capacitor de salida.
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
𝑑𝑖(𝑡) 1 𝑡
𝑉(𝑡) = 𝑅𝑖(𝑡) + 𝐿 + ∫ 𝑖(𝑡)𝑑𝑡
𝑑𝑡 𝐶 0
Ahora como se observa todo esta relacionado con la corriente y sabemos que
𝑖(𝑡) = 𝑑𝑞(𝑡)/𝑑𝑡.
𝑑 2 𝑞(𝑡) 𝑑𝑞(𝑡) 1
𝐿 + 𝑅 + 𝑞(𝑡) = 𝑣(𝑡)
𝑑𝑡 2 𝑑𝑡 𝐶
𝑞(𝑡) = 𝐶. 𝑉𝑐(𝑡)
𝑑 2 𝑉𝑐(𝑡) 𝑉𝑐(𝑡)
𝐿𝐶 2
+ 𝑅𝐶 + 𝑉𝑐(𝑡) = 𝑉(𝑡)
𝑑𝑡 𝑑𝑡
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
𝑑 2 𝑉𝑐(𝑡) 𝑉𝑐(𝑡)
𝐿𝐶 + 𝑅𝐶 + 𝑉𝑐(𝑡) = 𝑉(𝑡)
𝑑𝑡 2 𝑑𝑡
𝑉𝑐(𝑠) 1
= 2
𝑉(𝑠) 𝐿𝐶𝑠 + 𝑅𝐶𝑠 + 1
𝑉𝑐(𝑠) 1/𝐿𝐶
=
𝑉(𝑠) 𝑅 1
𝑠 2 + 𝐿 𝑠 + 𝐿𝐶
𝑑𝑖 𝑅 1 1 𝑑𝑒𝑜 1
= 𝑖̇ = − 𝑖 − 𝑒𝑜 + 𝑒𝑖 𝑑𝑜𝑛𝑑𝑒 = 𝑒𝑜̇ = 𝑖
𝑑𝑡 𝐿 𝐿 𝐿 𝑑𝑡 𝐶
Ahora definimos las variables de estado como:
𝑅 1 1
𝑥1̇ = − 𝑖 − 𝑒𝑜 + 𝑒𝑖
𝑥1 = 𝑖 𝑥1̇ = 𝑖 𝐿 𝐿 𝐿
𝑑𝑒𝑟𝑖𝑣𝑎𝑚𝑜𝑠 ̇ 𝑐𝑎𝑚𝑏𝑖𝑜 𝑑𝑒 𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒
𝑥2 = 𝑒𝑜 𝑥2 = 𝑒𝑜̇ 1
𝑥2̇ = 𝑥1
𝐶
𝑅 1 1
=− 𝑥1 − 𝑥2 + 𝑒𝑖
𝐿 𝐿 𝐿
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
𝑅 1
− − 1
̇ 𝐿] . [𝑥1] + [ ] . 𝑒 𝑥1
[𝑥1] = [ 𝐿 𝐿 𝑖 𝑑𝑜𝑛𝑑𝑒 𝑦 = 𝑒𝑜 = [0 1] [ ]
𝑥2̇ 1 𝑥2 𝑥2
0 0
𝐶
2.3.4. Obtener analíticamente vc(t) para una entrada escalón unitario para
valores de R L y C asumidos por el estudiante.. (nótese que la
entrada paso es la integral de una entrada impulso)
𝑉𝑐(𝑠) 1 1
= =
𝑉(𝑠) 𝐿𝐶𝑠 2 + 𝑅𝐶𝑠 + 1 0.5𝑠 2 + 1.5𝑠 + 1
1
𝑉(𝑠) =
𝑠
𝑉𝑐(𝑠)
Ahora para hallar el Vc(s) solo se multiplica para ∗ 𝑉(𝑠)
𝑉(𝑠)
1 1 1
= ∗ =
0.5𝑠 2 + 1.5𝑠 + 1 𝑠 0.5𝑠 + 1.5𝑠 2 + 𝑠
3
𝑉𝑐(𝑡) = 𝑒 −2𝑡 − 2𝑒 −𝑡 + 1
2.3.5. Con la ayuda del Excel presente los gráficos para una entrada
escalón unitario en lazo abierto.
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
𝑉𝑐(𝑠) 1 1
= 2
= 2
𝑉(𝑠) 𝐿𝐶𝑠 + 𝑅𝐶𝑠 + 1 0.5𝑠 + 1.5𝑠 + 1
Ahora definiremos los cero y polos con la función de transferencia definida con
los siguientes comandos.
>> B=zpk(A)
>> F=frd(A,60)
num1=[1];
den1=[1 0 0];
num=[1];
den=[0.5 1.5 1];
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
b=tf(num1,den1);
a=tf(num,den);
sys=series(a,b);
>> sys
plot(1),impulse(sys),grid
disp('RESUPUESTA A ENTRADA DE RAMPA');
num1=[1];
den1=[1 0 1];
num=[1];
den=[0.5 1.5 1];
b=tf(num1,den1);
a=tf(num,den);
sys=series(a,b);
sys
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
plot(1),impulse(sys),grid
disp('RESUPUESTA A ENTRADA SENOIDAL');
Como primer paso debemos definir el circuito como entrada una tensión V(t) y
como salida la Vc(t)
Primero aplicamos la segunda ley de Kirchhoff en la primera malla.
𝑉(𝑡) = 𝐼1 ∗ 𝑅1 + 𝑉𝑐(𝑡)
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
1
∫ 𝑖𝑑𝑡 = 𝑉𝑐(𝑡)
𝐶
1
𝑉𝑐(𝑡) 𝐶𝑠 1
= =
𝑉(𝑡) 𝑅 + 1/𝐶𝑠 𝑅𝐶𝑠 + 1
2.5. Informe.-
2.5.1. Presente los resultados obtenidos en la parte experimental.
for a=1:5;
nun=[a];
den=[1 4];
x=tf(nun,den);
step(x)
grid
hold on
end
Transfer function:
1
-----
s + 4
Transfer function:
2
-----
s + 4
Transfer function:
3
-----
s + 4
Transfer function:
4
-----
s + 4
Transfer function:
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
5
-----
s + 4
% *** Net will be the first 3 columns of the file. Coeff will be
the last column. ***
fid=fopen(NetFile); % Open the file
if (fid==-1)
fprintf('\n*** File, %s, not found ***\n\n',NetFile)
return
end
Net=[]; % Initialize the Numerical Net matrix
line_number=0; % Line number read from file
Coeff_Names={}; % Initialize cell array of strings
while 1 % Loop Until end of file, read one line at a time
line_number=line_number+1; % Count which line we are on
x=fscanf(fid,'%d',3); % Read the three decimal numbers into x
Coeff=fscanf(fid,'%s\n',1); % Read the one coefficient name into coeff
if isempty(x) % Stop the loop if no data is left in file
break
end
Net(line_number,:)=transpose(x); % Append one row to bottom of
numerical matrix
Coeff_Names{line_number}= Coeff; % Append the coefficient name to the
coefficient array
end
fclose(fid); % Remember to close the file!
%*** Determine Number of Coefficients in net file ***
temp=size(Net); % Determine the number of rows in the net matrix
Number_Coeff=temp(1);
%*** Find all the paths connecting the start and end nodes, along
which ***
%*** no node is crossed more than once ***
[PathCoeffList,PathNodeList]=findpaths(Start,Stop,[],[],Net);
% PathCoeffList and PathNodeList are matrixes where each row lists the
number of the coefficients or the nodes visited respectively. Each row
is padded with zeros to make them the same length.
%fprintf('\n- Path List -\n');
%print_paths(PathCoeffList);
%*** Determine all the first-Order loops ***
LoopCoeffList=[]; % Initialise list of coefficients in for each loop
LoopNodeList=[]; % Initialise list of nodes for each loop found
for index=1:Number_Coeff; % Find list of loops originating from each
node
% Get the matrix describing all the loops from at node #index
[FoundLoops,FoundNodes]=findpaths(index,index,[],[],Net);
LoopCoeffList=[LoopCoeffList;FoundLoops]; % Append Coefficients of
loops
LoopNodeList=[LoopNodeList;FoundNodes]; % Append nodes visited for
each loop
end
% Remove duplicate loops
[LoopCoeffList,LoopNodeList]=RemoveDuplicateLoops(LoopCoeffList,LoopNo
deList);
%fprintf('\n\n- 1st Order Loop List -\n');
%print_paths(LoopCoeffList);
%*** Convert to nomenclature used by Pozars RF Book ***
% P{n} represents the nth path found connecting start to stop
% P{n}.Coeff is an array with a list of the coefficients passed
through in order
% P{n}.Nodes is an array listing the nodes passed through in order.
Including the end nodes
% NOTE: A cell array is used because the path lengths can be different
resulting in different sized arrays
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
L{n}.Coeff{(L{n}.NumberLoops)}=[L{1}.Coeff{first}, L{n-
1}.Coeff{second}];
L{n}.Node{(L{n}.NumberLoops)}=[L{1}.Node{first}, L{n-1}.Node{second}];
end
end
end
end
if (L{n}.NumberLoops==0) % If no loops of order n where found, then
break
break % There will be no loops of order n+1
end
end
% ***** Display File info *****
fprintf('\n-- Network Info --\n')
fprintf('Net File : ');fprintf(NetFile);fprintf('\n');
fprintf('Start Node : %d\n',Start);
fprintf('Stop Node : %d\n',Stop);
% ***** Display the paths found ******
fprintf('\n----- Paths -----\n')
for pathn=1:length(P) % Look at each Path and display it's Coeff
numbers
fprintf('P%d : ',pathn); % on a different line
fprintf('%d ',P{pathn}.Coeff);
fprintf('\n');
end
% ***** Display all the loops found *****
for loop_order=1:length(L)-1 % Look at each loop order (last order has
no loops
fprintf('\n- Order %d Loops -\n',loop_order) % Print header describing
loop order
for loop_number=1:L{loop_order}.NumberLoops % Look at each loop of
that order
fprintf('L%d%d : ',loop_order,loop_number) % Display coefficients on a
different line
fprintf('%d ',L{loop_order}.Coeff{loop_number})
fprintf('\n')
end
end
% *******************************************************
% ************ Generate the final equation **************
% *******************************************************
% For now the equations are written in terms of the coefficient number
: c#
% the coefficient strings will be substituted later
% Determine Numerator
Num=''; % Assume Numerator is empty to start
for pathn=1:length(P) % Add Each path and related
Num=sprintf('%s%s*(1', Num, CoeffToString(P{pathn}.Coeff)); % Pn*(1
...
for order=1:length(L)-1 % Append each order of sums of non-touching
loops
% if order is odd order append a minus, otherwise a plus
if (rem(order,2)==1)
Num=sprintf('%s-',Num);
else
Num=sprintf('%s+',Num);
end
% Append the sum of all the nontouching loops that don't touch the
current path
Num=[Num,PrintSumsNotTouching(L,order,P{pathn}.Node)];
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
end
Num=sprintf('%s)+',Num); % Close the bracket around paths list of sums
end
Num=Num(1:length(Num)-1); % Remove the extra plus sign on the end.NOTE
using /b screws up the symbolic math later
% Determine Denominator
Den='1'; % Denominator always start with a zero
for order=1:length(L)-1 % Add order subtract the sum of each orders
loops
% if order is odd order append a minus, otherwise a plus,
if (rem(order,2)==1)
Den=sprintf('%s-',Den);
else
Den=sprintf('%s+',Den);
end
%Add or subtract all the loops
% KLUDGE: all the loops not touching the path with nodes 999999999 are
added
% That definetly should be all of them!
Den=[Den,PrintSumsNotTouching(L,order,[9999999 999999])]; %Sums of all
the loops of order order
end
fprintf('\nThe variables returned are strings describing\n')
fprintf('the numerator and Denominator of the transfer equation.\n')
fprintf('If you have the symbolic toolbox, use
Denominator=sym(Denominator)\n');
fprintf('and Numerator=sym(Numerator) to make these symbolic
equations.\n')
fprintf('You can now use simple(Numerator/Denominator) to boil the
whole\n')
fprintf('thing down. You could also use simple(Numerator) to simplify
the\n')
fprintf('Numerator on it'' own.\n\n')
% ****** Convert to Symbolic and do substitutions *******
for coeff_num=length(Coeff_Names):-1:1; %Cycle through Coefficient
array, substituting each one
orig=sprintf('c%d',Net(coeff_num,1)); % for each line generate c[Coeff
Number] to replace
Den=strrep(Den,orig,Coeff_Names{coeff_num}); % Replace all the c#s
with the strings from net file
Num=strrep(Num,orig,Coeff_Names{coeff_num});
end % This loop had to count down so there was no risk of C12 being
replace by C1
%*********************************************************************
****************************
function Touching=AreTouchingLoops(Nodes1,Nodes2)
%*********************************************************************
****************************
% This function takes two arrays describing two sets of nodes
visited(each padded with zeros).
% Return 1 if they are they are touching loops.
% Determine length of loop arrays with zeros removed
Loop1Length=sum(Nodes1>0);
Loop2Length=sum(Nodes2>0);
for first=1:Loop1Length
for second=1:Loop2Length
if (Nodes1(first)==Nodes2(second))
Touching=1;
return;
end
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
end
end
Touching=0;
%*********************************************************************
****************************
function StrMult=CoeffToString(Coefficients)
%*********************************************************************
****************************
% StrMult=CoeffToString(Coefficients)
% Coefficients is an array with coefficients c1,c2..cN
N=length(Coefficients); % Get length of string
StrMult=sprintf('c%d',Coefficients(1)); % Start with first coefficient
for n=2:N % Append each coefficent in list with * before it
StrMult=[StrMult, sprintf('*c'),sprintf('%d',Coefficients(n))];
end
%*********************************************************************
****************************
function [PathUp,NodesUp]=findpaths(StartNode,StopNode,Path,Nodes,Net)
%*********************************************************************
****************************
%[PathUp,NodesUp]=findpaths(StartNode,StopNode,Path,Nodes,Net)
%
%Iterative function to find path between StartNode and StopNode. Net
is the array with the network
%list in it. Path is the single path to date for a given route through
the tree. PathUp is a
%list of all paths terminated below that node that are sucesfull.
%Nodes is the list of nodes tvaersed so far on the way down
% Determine number of coefficients in net
temp=size(Net);
NumberCoeff=temp(1,1);
PathUp=[];
NodesUp=[];
% Terminate branch and return nothing if the Nodes to date contains
repetitions.
for index=1:NumberCoeff
if not(isempty(Nodes)) % Only compare if the the Path has data in it
if (sum(Nodes==index)>1)
PathUp=[];
% fprintf('Repeated Node : ');
% fprintf('%d ',Nodes);
% fprintf('\n');
return
end
end
end
% Terminate branch and return path if start and stop nodes are the
same
if ((StartNode==StopNode) & (length(Path>1)))
PathUp=Path;
NodesUp=Nodes;
%fprintf('Sucessfull Path : ');
%fprintf('%d ',Path);
%fprintf('\n');
return
end
% Check for all branches leaving StartNode, and call another iteration
for them
for index=1:NumberCoeff
if (StartNode==Net(index,2))
UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA ELÉCTRICA
Comentarios y conclusiones.
2.6. Bibliografía.-
• https://vdocumento.com/laboratorio-2-contro-automatico.html
• https://www.mathworks.com/help/control/ref/lti.step.html;jsessionid=d4600512a258
73ee9953862bc610
• https://www.angelfire.com/la/hmolina/matlab3.html