Professional Documents
Culture Documents
Laboratorio 2
Modelacin de sistemas utilizando MATLAB
2.1. Objetivos.
sys = feedback(sys1,sys2,feedin,feedout)
en la mayora de sistemas de control realimentado es comn la
presencia de perturbaciones o seales que tienden a afectar
adversamente el valor de la salida, pueden ser internas o externas. Esto
implica seales que ingresan al sistema, pero que no se realimentan,
as:
Planta
GC(s)
G(s)
R(s)
Y(s)
H(S)
Compensacin en Serie
G1(s)
G(s)
R(s)
Y(s)
Gc(s)
H(s)
=
=
=
=
tf(sys)
% Conversin a TF
zpk(sys)
% Conversion a ZPK
ss(sys)
% Conversion a SS
frd(sys, frequency)
% Conversion a FRD
s 2.333
s2
2.2.3.
foh
imp
tustin
2.3. Trabajo Preparatorio.Se tiene un circuito serie RLC alimentado por una fuente v(t) entrada y Vc(t) tensin
en el capacitor de salida
2.3.1.
-
V ( t )=Ri (t ) +
-
Ldi ( t ) 1
+ i(t)dt
dt
C
Luego:
i ( t )=
dq(t)
dt
2
di ( t ) d q(t)
= 2
dt
dt
i(t)dt=q(t)
-
Reemplazando en la ecuacin:
Rdq ( t ) Ld q ( t ) 1
V ( t )=
+
+ q(t)
2
dt
C
d t
-
1
V ( t )=Rq ' (t)+Lq ' '(t)+ q (t)
C
2.3.2.
FT=
-
V ( t )=Ri (t ) +
-
Ldi ( t )
+Vc ( t ) (1)
dt
Vc ( t )=
-
Vc (t)
V (t)
1
i(t)dt (2)
C
(3)
1
1
(4)
C
Vc ( s )=
I (s)
S
-
I ( s )=CSVc (s)
Vc (t)
1
=
V (t ) CS( R+ LS ) +1
2.3.3.
V ( t )=Ri (t ) +
i ( t )=
-
Ldi ( t )
+Vc ( t )
dt
CdVc ( t )
dt
Organizando las ecuaciones:
di ( t ) R
1
1
= i (t ) Vc ( t )+ V (t)
dt
L
L
L
dVc ( t ) 1
= i(t )
dt
C
-
En forma matricial:
[ ] [ ][
di ( t )
R 1
1
dt = L L i ( t ) +
L [ V (t) ]
1
dVc ( t )
Vc
(
t
)
0
0
C
dt
][
Vc (t)
1
=
V (t ) CS( R+ LS ) +1
-
Vc (t)
200
=
2
V (t ) 0.005 S +0.2 S+200
-
n=1
-
0.2=2n
=
0.2
21
=
d=n 1
0.1
d=0.995
tr=
1
d
tan1
d
n
( )
tr=0.0015
tp=
tp=3.1574
Mp=e
1 2
Mp=1.371
T=
1
n
T =10
ts=4T
ts=40
Valores Y
3.5
3
2.5
Valores Y
2
1.5
1
0.5
0
0.5
1.5
2.5
-2.778
0
x1
x2
2
0
c =
x1
x2
y1
1.389
d =
y1
u1
0
Continuous-time model.
ZPK: Modelo ceros-polos-ganancia
%Modelo a ceros-polos-ganancia
clc
L=input('ingrese un valor para L=');
C=input('ingrese un valor para C=');
R=input('ingrese un valor para R=');
num=[1];
den=[L*C R*C 1];
B=tf(num,den);
Bzp=zpk(B)
ingrese un valor para L=0.3
ingrese un valor para C=0.3
ingrese un valor para R=20
Zero/pole/gain:
11.1111
------------------(s+66.5) (s+0.1671)
FRD: Modelo de respuesta de Frecuencia
%Modelo respuesta de frecuencia
clc
L=input('ingrese un valor para L=');
C=input('ingrese un valor para C=');
R=input('ingrese un valor para R=');
num=[1];
den=[L*C R*C 1];
B=tf(num,den);
Bfr=frd(B,3)
Ingrese un valor para L=0.3
Ingrese un valor para C=0.3
Ingrese un valor para R=20
Frequency(rad/s)
----------------
Response
--------
5.864e-004 - 0.0555i
Lazo Abierto
ENTRADA IMPULSO
Impulse Response
0.18
0.16
0.14
0.12
Am plitude
%Entrada Impulso
clc
L=input('ingrese un valor para
L=');
C=input('ingrese un valor para
C=');
R=input('ingrese un valor para
R=');
num=[1];
den=[L*C R*C 1];
I=tf(num,den);
impulse(I)
0.1
0.08
0.06
0.04
0.02
10
15
20
25
30
35
40
Time (sec)
ENTRADA PASO
10
9
8
7
6
Amplitude
%Entrada Paso
clc
L=input('ingrese un valor para
L=');
C=input('ingrese un valor para
C=');
R=input('ingrese un valor para
R=');
num=[1];
den=[L*C R*C 1];
I=tf(num,den);
step(I)
5
4
3
2
1
0
5
Time (sec)
ENTRADA RAMPA
10
%Entrada Rampa
clc
L=input('ingrese un valor
para L=');
C=input('ingrese un valor
para C=');
R=input('ingrese un valor
para R=');
num=[1];
den=[L*C R*C 1];
I=tf(num,den);
t=0:0.3:10;
u=t;
lsim(I,u,t)
Step Response
1
0.9
0.8
0.7
Amplitude
0.6
0.5
0.4
0.3
0.2
0.1
0
10
15
20
Time (sec)
ENTRADA SENOIDAL
ENTRADA SENOIDAL
%Entrada Senoidal
clc
L=input('ingrese un valor para L=');
C=input('ingrese un valor para C=');
R=input('ingrese un valor para R=');
num=[1];
den=[L*C R*C 1];
I=tf(num,den);
t=0:0.3:10;
u=sin(t);
lsim(I,u,t)
ingrese un valor para L=0.3
ingrese un valor para C=0.3
ingrese un valor para R=20
25
30
35
40
1
0.8
0.6
0.4
Amplitude
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
10
Time (sec)
Lazo Cerrado
ENTRADA IMPULSO
Impulse Response
0.18
0.16
0.14
0.12
Amplitude
%Entrada Impulso
clc
L=input('ingrese un valor
para L=');
C=input('ingrese un valor
para C=');
R=input('ingrese un valor
para R=');
num=[1];
den=[L*C R*C 1];
I=tf(num,den);
feedback(I,1);
impulse(I)
0.1
0.08
0.06
0.04
0.02
0
10
15
20
Time (sec)
ENTRADA PASO
%Entrada Paso
clc
L=input('ingrese un valor para L=');
25
30
35
40
Step Response
0.5
0.45
0.4
0.35
Amplitude
0.3
0.25
0.2
0.15
0.1
0.05
0
10
12
Time (sec)
ENTRADA RAMPA
%Entrada Rampa
clc
L=input('ingrese un valor para L=');
C=input('ingrese un valor para C=');
R=input('ingrese un valor para R=');
num=[1];
den=[L*C R*C 1];
P=tf(num,den);
P=feedback(P,1);
t=0:0.3:10;
u=t;
lsim(P,u,t)
14
16
18
10
9
8
7
Amplitude
6
5
4
3
2
1
0
Time (sec)
ENTRADA SENOIDAL
%Entrada Senoidal
clc
L=input('ingrese un valor para L=');
C=input('ingrese un valor para C=');
R=input('ingrese un valor para R=');
num=[1];
den=[L*C R*C 1];
P=tf(num,den);
P=feedback(P,1);
t=0:0.3:10;
u=sin(t);
lsim(P,u,t)
ingrese un valor para L=0.3
ingrese un valor para C=0.3
ingrese un valor para R=20
10
1
0.8
0.6
0.4
Amplitude
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
10
Time (sec)
i= IR 1+ I 1R 2
e
1
idt=e 0
c
I1
(s)R2
Ei (s)
I=
I 1 +I 2
11
cs
I2
(s)
E0 (s)
E0
R2
=
E i R 1 R 2 CS+R 1+R 2
2.5 Informe
2.5.1 presente los resultados
2.5.2 Empleando lazos y estructuras de control de flujo,
G ( S )=
a
s+4
Step Response
2.5
A m p litu d e
1.5
0.5
0.5
1.5
Time (sec)
for index=1:NumberPaths
Coeff=PathCoeffList(index,:);
P{index}.Coeff=Coeff(1:sum(Coeff>0));
Node=PathNodeList(index,:);
P{index}.Node=[Node(1:sum(Coeff>0)),Stop];
end
temp=size(LoopCoeffList);
NumberLoops=temp(1);
L{1}.NumberLoops=NumberLoops;
for index=1:NumberLoops
Coeff=LoopCoeffList(index,:);
L{1}.Coeff{index}=Coeff(1:sum(Coeff>0));
Node=LoopNodeList(index,:);
L{1}.Node{index}=[Node(1:sum(Coeff>0)),Node(1)];
end
=1;
while 1
n=n+1;
L{n}.NumberLoops=0;
for first=1:L{1}.NumberLoops
for second=1:L{n-1}.NumberLoops
if not(AreTouchingLoops(L{1}.Node{first},L{n-1}.Node{second}))
Duplicate=0;
for index=1:L{n}.NumberLoops
if IsSameLoop([L{1}.Coeff{first}, L{n-1}.Coeff{second}],L{n}.Coeff{index})
Duplicate=1;
end
end
if (Duplicate==0)
L{n}.NumberLoops=L{n}.NumberLoops+1;
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)
break
end
end
fprintf('\n-- Network Info --\n')
fprintf('Net File : ');fprintf(NetFile);fprintf('\n');
fprintf('Start Node : %d\n',Start);
fprintf('Stop Node : %d\n',Stop);
fprintf('\n----- Paths -----\n')
for pathn=1:length(P)
fprintf('P%d : ',pathn);
fprintf('%d ',P{pathn}.Coeff);
fprintf('\n');
end
for loop_order=1:length(L)-1
fprintf('\n- Order %d Loops -\n',loop_order)
for loop_number=1:L{loop_order}.NumberLoops
fprintf('L%d%d : ',loop_order,loop_number)
fprintf('%d ',L{loop_order}.Coeff{loop_number})
fprintf('\n')
end
end
Num='';
for pathn=1:length(P)
Num=sprintf('%s%s*(1', Num, CoeffToString(P{pathn}.Coeff)); % Pn*(1 ..
for order=1:length(L)-1
if (rem(order,2)==1)
Num=sprintf('%s-',Num);
else
Num=sprintf('%s+',Num);
end
Num=[Num,PrintSumsNotTouching(L,order,P{pathn}.Node)];
end
Num=sprintf('%s)+',Num); %
end
Num=Num(1:length(Num)-1);
Den='1';
for order=1:length(L)-1 %
if (rem(order,2)==1)
Den=sprintf('%s-',Den);
else
Den=sprintf('%s+',Den);
end
Den=[Den,PrintSumsNotTouching(L,order,[9999999 999999])];
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')
for coeff_num=length(Coeff_Names):-1:1;
orig=sprintf('c%d',Net(coeff_num,1));
Den=strrep(Den,orig,Coeff_Names{coeff_num});
Num=strrep(Num,orig,Coeff_Names{coeff_num});
end %
function Touching=AreTouchingLoops(Nodes1,Nodes2)
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
end
end
Touching=0;
function StrMult=CoeffToString(Coefficients)
N=length(Coefficients);
StrMult=sprintf('c%d',Coefficients(1));
for n=2:N
StrMult=[StrMult, sprintf('*c'),sprintf('%d',Coefficients(n))];
end
function [PathUp,NodesUp]=findpaths(StartNode,StopNode,Path,Nodes,Net)
temp=size(Net);
NumberCoeff=temp(1,1);
PathUp=[];
NodesUp=[];
for index=1:NumberCoeff
if not(isempty(Nodes))
if (sum(Nodes==index)>1)
PathUp=[];
return
end
end
end
if ((StartNode==StopNode) & (length(Path>1)))
PathUp=Path;
NodesUp=Nodes;
return
end
for index=1:NumberCoeff
if (StartNode==Net(index,2))
[FoundPath,FoundNodes]=findpaths(Net(index,3),StopNode,[Path,Net(index,1)],
[Nodes,StartNode],Net);
if not(isempty(FoundPath))
PathUp=[PathUp;[FoundPath,zeros(1,NumberCoeff+1-length(FoundPath))]];
NodesUp=[NodesUp;[FoundNodes,zeros(1,NumberCoeff+1-length(FoundPath))]];
end
end
end
function Same=IsSameLoop(Loop1,Loop2)
Loop1Length=sum(Loop1>0);
Loop2Length=sum(Loop2>0);
if (Loop1Length~=Loop2Length)
Same=0;
return
end
if (sum(abs(sort(Loop1)-sort(Loop2)))==0)
Same=1;
else
Same=0; %
function Str=PrintSumsNotTouching(L,order,Pnodes)
No_NonTouching=1;
Str=('(');
for n=1:L{order}.NumberLoops
if not(AreTouchingLoops(Pnodes,L{order}.Node{n})) Str=sprintf('%s
%s+',Str,CoeffToString(L{order}.Coeff{n}));
No_NonTouching=0; %
end
end
Str=Str(1:(length(Str)-1));
Str=sprintf('%s)',Str);
if No_NonTouching==1
end
function [LoopList,NodeList]=RemoveDuplicateLoops(LoopList,NodeList);
temp=size(LoopList);
NumberLoops=temp(1);
first=1;
while (first<=NumberLoops)
second=first+1;
while (second<=NumberLoops)
if (IsSameLoop(LoopList(first,:),LoopList(second,:))==1)
LoopList=[LoopList(1:second-1,:);LoopList(second+1:NumberLoops,:)];
NodeList=[NodeList(1:second-1,:);NodeList(second+1:NumberLoops,:)];
NumberLoops=NumberLoops-1;
else
second=second+1;
end
first=first+1;
end