Engenharia Electrotécnica
Controlo
1.ª AULA
Matlab
Docente
MATLAB
• 1ª aula
O MATLAB (MATrix LABoratory) é uma linguagem de programação concebida pela MathWorks, Inc. baseadas na manipulação de matrizes e destinada a realizar cálculos matemáticos e de engenharia tornando-se assim uma poderosa ferramenta de software muito utilizada na concepção, simulação e análise de sistemas de controlo.
Declaração de vectores e matrizes
Declaração directa de variáveis onde as variáveis ficam declaradas automaticamente quando lhes é atribuído um valor.
EX: a = 4.3 , b = 6 , A = [ 5 2.2 3] , = 10 1 5 3 B
A variável a fica automaticamente criada e com o valor 4.3.
O mesmo que a variável a mas com ; no fim faz com que não apareça no Workspace o resultado da operação.
Criar a matriz C á custa das variáveis a e b já criadas = b a C 5 4 5 3 » a=4.3 a = 4.3000 » » b=6; » » A=[ 5 2.2 3] A = 5.0000 2.2000 3.0000 »B=[3 5 ; 1 10] B = 3 5 1 10 » » C=[ a 3 5; 4 5 b] C = 4.3000 3.0000 5.0000 4.0000 5.0000 6.0000 »
Todas as variáveis uma vez criadas podem ser visualizadas através do comando whos:
» whos
Name Size Bytes Class A 1x3 24 double array B 2x2 32 double array C 2x3 48 double array a 1x1 8 double array b 1x1 8 double array Grand total is 15 elements using 120 bytes »
Para apagar as variáveis já definidas o comando clear:
» clear »whos »
Dimensão
Para saber a dimensão de uma matriz basta o comando size(G):
» G= [3 4 5; 13 4 7 ]; »size(G)
ans=
2 3 »
enquanto de um vector o comando lenght(g):
» g= [ 4 7 5 13 4 7 ]; »length(g) ans= 6 »
Transposta
» A=[ 5 2.2 3]; » A' ans = 5.0000 2.2000 3.0000 »B=[3 5 ; 1 10]; » B' ans = 3 1 5 10 »»C=[ 4.3 3 5;4 5 6]; »C' ans = 4.3000 4.0000 3.0000 5.0000 5.0000 6.0000 »
Pode-se atribuir ao resultado da transposta de C outra variável , p. ex. E = C’, caso contrário o resultado perde-se:
» E=C' E = 4.3000 4.0000 3.0000 5.0000 5.0000 6.0000 »
Multiplicação
Na multiplicação tem de se ter cuidado com as dimensões das matrizes. Como B é 2x2 e C 2x3 pode ser calculado B*C:
» B*C ans =
32.9000 34.0000 45.0000 44.3000 53.0000 65.0000 »
No caso de haver engano é enviado uma mensagem de erro, dando pistas para a não concretização do pedido:
» C*B
??? Error using ==> *
Inner matrix dimensions must agree.
»
Uma constante tanto faz ser pré-multiplicação como pós-multiplicação: » a=4.3; »a*E ans = 18.4900 17.2000 12.9000 21.5000 21.5000 25.8000 » » E*a ans = 18.4900 17.2000 12.9000 21.5000 21.5000 25.8000
SOMA
Tal como na multiplicação a dimensão das matrizes tem de ser compatível:
Divisão
Operações com elementos individuais
=
23 22 21 13 12 11c
C
C
C
C
C
C
[
A
1A
2A
3]
A
=
Multiplicação de C23 * A2 = 6 * 2.2 = 13.2Sub-matrizes
A partir do vector A=[ 5 2.2 3 ] formar outro vector s baseado nos dois últimos elementos de A, s=[ 2.2 3 ] : »b=6; »f=a+b f = 10.3000 »D=[1 1 ;1 1]; »A+D ans = 4 6 2 11 » B+C ??? Error using ==> +
Matrix dimensions must agree. » » A/a ans = 1.1628 0.5116 0.6977 » »C(2,3)*A(2) ans = 13.2000 » »s=A(2:3) s = 2.2000 3.0000
Supondo que de um novo vector w=[ 4 5 2 3 8 9 3] criar outro vector com os elementos do vector w, s=[ 5 2 3 8 9];
Do mesmo modo a partir de uma matriz se pode criar sub-matrizes:
=
5
3
1
7
4
8
7
5
2
5
1
2
9
4
7
5
6
3
2
1
E
=
=
8
7
5
1
43 42 33 32E
E
E
E
D
» E=[1 2 3 6; 5 7 4 9; 2 1 5 2;5 7 8 4;7 1 3 5] E = 1 2 3 6 5 7 4 9 2 1 5 2 5 7 8 4 7 1 3 5 » E(3:4,2:3) ans = 1 5 7 8 »Matriz Identidade
Para criar uma matriz identidade basta fazer eye(5) onde 5 significa a dimensão da matriz: » eye(5) ans = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 » » w=[ 4 5 2 3 8 9 3] w = 4 5 2 3 8 9 3 » s=w(2:6) s = 5 2 3 8 9 »
HELP
Existem uma série de bibliotecas com funções já definidas.
» help
HELP topics:
matlab\general - General purpose commands. matlab\ops - Operators and special characters. matlab\lang - Programming language constructs.
matlab\elmat - Elementary matrices and matrix manipulation. matlab\elfun - Elementary math functions.
matlab\specfun - Specialized math functions.
matlab\matfun - Matrix functions - numerical linear algebra. matlab\datafun - Data analysis and Fourier transforms. matlab\polyfun - Interpolation and polynomials. matlab\funfun - Function functions and ODE solvers. matlab\sparfun - Sparse matrices.
matlab\graph2d - Two dimensional graphs. matlab\graph3d - Three dimensional graphs. matlab\specgraph - Specialized graphs. matlab\graphics - Handle Graphics.
matlab\uitools - Graphical user interface tools. matlab\strfun - Character strings.
matlab\iofun - File input/output. matlab\timefun - Time and dates.
matlab\datatypes - Data types and structures.
matlab\winfun - Windows Operating System Interface Files (DDE/ActiveX) matlab\demos - Examples and demonstrations.
toolbox\ncd - Nonlinear Control Design Blockset toolbox\control - Control System Toolbox.
control\ctrlguis - Control System Toolbox -- GUI support functions. control\obsolete - Control System Toolbox -- obsolete commands. stateflow\sfdemos - Stateflow demonstrations and samples.
toolbox\sb2sl - SystemBuild to Simulink Translator stateflow\stateflow - Stateflow
simulink\simulink - Simulink
simulink\blocks - Simulink block library.
simulink\simdemos - Simulink 3 demonstrations and samples. simulink\dee - Differential Equation Editor
toolbox\tour - MATLAB Tour
MATLABR11\work - (No table of contents file) toolbox\local - Preferences.
For more help on directory/topic, type "help topic". »
Por exemplo a biblioteca elfun (elementary functions) :
» help matlab\elfun
Elementary math functions. Trigonometric.
sin - Sine.
sinh - Hyperbolic sine. asin - Inverse sine.
asinh - Inverse hyperbolic sine. cos - Cosine.
cosh - Hyperbolic cosine. acos - Inverse cosine.
acosh - Inverse hyperbolic cosine. tan - Tangent.
tanh - Hyperbolic tangent. atan - Inverse tangent.
atan2 - Four quadrant inverse tangent. atanh - Inverse hyperbolic tangent. sec - Secant.
sech - Hyperbolic secant. asec - Inverse secant.
asech - Inverse hyperbolic secant. csc - Cosecant.
csch - Hyperbolic cosecant. acsc - Inverse cosecant.
acsch - Inverse hyperbolic cosecant. cot - Cotangent.
coth - Hyperbolic cotangent. acot - Inverse cotangent.
acoth - Inverse hyperbolic cotangent.
Exponential.
exp - Exponential. log - Natural logarithm.
log10 - Common (base 10) logarithm.
log2 - Base 2 logarithm and dissect floating point number. pow2 - Base 2 power and scale floating point number. sqrt - Square root.
nextpow2 - Next higher power of 2.
Complex.
abs - Absolute value. angle - Phase angle.
complex - Construct complex data from real and imaginary parts. conj - Complex conjugate.
imag - Complex imaginary part. real - Complex real part.
unwrap - Unwrap phase angle. isreal - True for real array.
cplxpair - Sort numbers into complex conjugate pairs.
Rounding and remainder. fix - Round towards zero.
floor - Round towards minus infinity. ceil - Round towards plus infinity. round - Round towards nearest integer.
mod - Modulus (signed remainder after division). rem - Remainder after division.
sign - Signum. »
Sempre que se pretenda saber se uma função está já definida no matlab basta escrever help nome_da_função, como por exemplo:
» help cos COS Cosine.
COS(X) is the cosine of the elements of X. »
Complexos
Para representar um número complexo basta multiplicar e a parte imaginária por i ou j : » k=1.5+2j k = 1.5000 + 2.0000i » » f=4-5i f = 4.0000 - 5.0000i »
Todas as operações algébricas são realizadas de acordo com as regras.
Polinómio e raízes
O polinómio é representado pelos seus coeficientes, como por exemplo o polinómio 4
3 2 2 3+ x + x+
x é representado pelo vector [1 2 3 4],
» p=[1 2 3 4] p =
1 2 3 4 »
As raízes do polinómio são dadas pelo comando roots(p): » a=roots(p) ans = -1.6506 -0.1747 + 1.5469i -0.1747 - 1.5469i »
Pode-se reconstruir o polinómio original baseado nas raízes pelo comando poly(a):
» poly(a) ans =
1.0000 2.0000 3.0000 4.0000 »
Diagrama de Blocos
Considere o seguinte diagrama de blocos
é equivalente a:
é exequível pelo comando series(num,den) :
» num= 1; » den=[1 1 0]; » sys1=tf(num,den) Transfer function: 1 --- s^2 + s » sys2=tf(num,[1 0 1]) Transfer function: 1 --- s^2 + 1 » series(sys1,sys2) Transfer function: 1 --- s^4 + s^3 + s^2 + s » s s2 + 1 1 1 2 + s s s s s4 + 3 + 2 + 1
ou » sys1*sys2 Transfer function: 1 --- s^4 + s^3 + s^2 + s »
Considere o seguinte diagrama de blocos:
é equivalente a
é exequível pelo comando parallel(num,den) :
» parallel(sys1,sys2) Transfer function: 2 s^2 + s + 1 --- s^4 + s^3 + s^2 + s »
Considerando o diagrama de blocos,
utilizando a forma canónica de realimentação o diagrama é equivalente a
s s2 + 1 1 1 2 + s + + s s s s s s + + + + + 2 3 4 2 1 2 1 1 1 2 2 +s + s + s s s2 + 1 1 1 2 + s + + s s s s s + + + + 2 3 4 2 1
é exequível pelo comando feedback(num,den) : » feedback(sys1,sys2) Transfer function: s^2 + 1 --- s^4 + s^3 + s^2 + s + 1 »
Modelos
Considerando a função de transferência com pólos distintos
) 1 ( 1 ) ( + = s s s G pode-se expandir em fracções parciais pelo comando residue(b,a) :
» num=1 num = 1 » den den = 1 1 0 » [r,p,k]=residue(num,den) r = -1 1 p = -1 0 k = [] »
onde r significa os zeros, p os pólos e k o ganho: 1 1 1 2 2 1 1 1 1 + − = + + = + = s s k p r p r ) s ( s ) s ( G
♦ Considere a função de transferência com dois pólos múltiplos e um pólo distinto e expande em fracções parciais, 2
) 1 )( 4 ( 1 ) ( + + = s s s G .
♦ Considere a função de transferência com pólos complexos conjugados, 2 2 1 ) ( 2 + + = s s s G .
Transformada de Laplace Inversa
Para realizar a transformada de Laplace é necessário recorrer à biblioteca symbolic do matlab onde se utilizam símbolos em vez das variáveis e como tal tem de se declarar quais são os símbolos através do comando syms nome_do_símbolo . Nesta biblioteca também é possível realizar diferenciações, integrações, transformada de Fourier, solução simbólica de equações, desenvolvimento de funções em série de Taylor, etc.
A transformada de Laplace inversa da função
[
]
? ) s ( s L ) s ( G L ) t ( g = + = = − − 1 1 1 1 édado pelo comando ilaplace(função) onde é necessário primeiro declarar s como variável symbolica e a função tem de ser dada na forma de resíduo,
[
]
? s s L ) s ( s L ) s ( G L ) t ( g = + + − = + = = − − − 1 1 1 1 1 1 1 1 » syms s » ilaplace((-1/s)+1/(s+1)) ans = -1+exp(-t) »Transformada de Laplace Directa
Vejamos a transformada de Laplace directa da função apresentada no exercício anterior,
[
]
1 1 1 1 + + − = + − = − s s e L ) s ( G t » syms t » laplace(-1+exp(-t)) ans = -1/s+1/(s+1) »Considerando a função de transferência:
25 4 25 ) ( 2 + + = s s S G
Representa-se o numerador por um polinómio num=[25] e o denominador den=[ 1 4 25 ]:
» num=[25]; »den=[ 1 4 25];
A função de transferência pode ser visualizada através do comando tf(num,den):
» G=tf(num,den) Transfer function: 25 --- s^2 + 4 s + 25 »
A função de transferência pode também ser visualizada na forma “Zero-Pole-Gain“ :
)) ( ))...( 2 ( ))( 1 ( ( )) ( ))...( 2 ( ))( 1 ( ( ) ( ) ( ) ( n p s p s p s n z s z s z s k s P s Z s G − − − − − − = = » sys1=zpk(G) Zero/pole/gain: 25 --- (s^2 + 4s + 25) ou » Z=[] Z = [] » P=roots(den) P = -2.0000 + 4.5826i -2.0000 - 4.5826i
» K=25 K = 25 » sys1=zpk(Z,P,K) Zero/pole/gain: 25 --- (s^2 + 4s + 25) »
A conversão entre modelos é realizável pelo comando tf2zp ou zp2tf:
1 3 3 3 2 ) ( 3 2 2 + + + + + = s s s s s s G 3 ) 1 ( 414 . 1 1 ) ( + ± + = s i s s G » num=[1 2 3]; » den=[1 3 3 1]; » [z,p,k]=tf2zp(num,den) z = -1.0000 + 1.4142i -1.0000 - 1.4142i p = -1.0000 -1.0000 + 0.0000i -1.0000 - 0.0000i k = 1 3 ) 1 ( 414 . 1 1 ) ( + ± + = s i s s G 1 3 3 3 2 ) ( 3 2 2 + + + + + = s s s s s s G » [num,den]=zp2tf(z,p,k) num = 0 1.0000 2.0000 3.0000 den = 1.0000 3.0000 3.0000 1.0000 »
Pode-se visulaizar os zeros e pólos de uma função de transferência através do comando pzmap(sys): » num=[0 1 2 3]; » den=[ 1 –12 16 272 –1017 740]; » sys=tf(num,den) Transfer function: zp2tf tf2zp
s^2 + 2 s + 3 --- s^5 - 12 s^4 + 16 s^3 + 272 s^2 - 1017 s + 740» num » pzmap(sys) -6 -4 -2 0 2 4 6 -1.5 -1 -0.5 0 0.5 1 1.5 Real Axis Im ag A xi s Pole-zero map
Ganho estático
O ganho estático do sistema (0) lim ( ) lim ( )
0G s t G G s t→∞ = →
= pode ser obtido pelo comando dcgain(sys) onde o sistema pode ser obtido pelos comandos tf ou zpk,
» dcgain(sys) ans =
0.0041
Convolução
Considere os seguintes polinómios x3+2x2+3x+4 e 7x2 + x8 +9 representados
pelos vectores a=[ 1 2 3 4] e b=[7 8 9] a convolução é exequível pelo comando conv(a,b) e corresponde à multiplicação entre polinómios cujo resultado é
36 59 70 46 22 7x5 + x4 + x3 + x2 + x+ , » a=[ 1 2 3 4]; » b =[ 7 8 9]; »c=conv(a,b) c = 7 22 46 70 59 36 »
Deconvolução
Pode-se usar a deconvolução para obter o polinómio original,
»deconv(c,a) ans =
7 8 9 »