Prévia do material em texto
UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ CURSO DE ENGENHARIA DA COMPUTAÇÃO ADENILSON D. C. MUMBELLI EDEGAR KORB LUIS FELIPE BENEDITO SISTEMAS LINEARES MATLAB PATO BRANCO 2012 1. Introdução ao Matlab O software Matlab é um software interativo para computação envolvendo matrizes. O software foi desenvolvido no inicio da década de 80 por Cleve Moler, no departamento de Ciência da Computação da Universidade do Novo México nos Estados Unidos. No Matlab é disponível para o usuário, num ambiente interativo, algumas bibliotecas desenvolvidas através dos projetos linpack e eispack. Estes projetos têm por objetivo elaborar bibliotecas com domínio público para álgebra linear. A biblioteca linpack contém rotinas para solução de sistemas de equações lineares, enquanto que eispack possui rotinas destinadas à calculo de autovalores. O Matlab é voltado para o cálculo numérico, além disso, integram através de suas bibliotecas, cálculo com matrizes, processamento de sinais e construção e plotagem de gráficos, tudo envolvendo um ambiente de uso fácil, onde problemas e soluções são expressos como são escritos de forma matemática, se opondo a programação tradicional. O software possui como elemento básico uma matriz que não necessita de dimensionamento, este sistema permite o cálculo de muitos problemas numéricos em apenas uma parte do tempo que se gastaria implementando um programa semelhante em outros tipos de linguagens de programação como, por exemplo, Fortran, C++ ou Basic. Entretanto, as soluções são expressas exatamente como elas são escritas matematicamente. Além das bibliotecas projetadas através dos projetos linpack e eispack, o software dispõe também de um amplo programas de apoio, denominados toolboxes que proporcionam ao Matlab um aumento do número de funções incorporada ao software. Através do toolbox pode-se projetar algoritmos para processamento de sinais, de imagens, controle robusto, estática, análises financeiras, cálculo matemático simbólicos, redes neurais, lógica difusa, identificação de sinais, entre outros. Contudo, o objetivo inicial do estudo é implementar e apresentar algumas funções básicas do software, ajudando-nos na análise de sinais em sistemas lineares. 1.1. Conceitos e comandos Matlab Ao executar o software, duas interfaces são apresentadas ao usuário, uma janela de comando (Command Windows) e uma janela gráfica (Graphic Windows). O prompt de comando é >>, este é exibido logo quando o Matlab é iniciado através da janela de comando. A partir disso o software espera por comandos ou tarefas, sendo que o Matlab distingue caracteres maiúsculos de minúsculos, sendo assim denominada uma linguagem de programação do tipo case sensitive. Os últimos comandos realizados são exibidos através da janela command history. Assim, quando é necessária a repetição de algum comando usado anteriormente basta navegar através das setas para cima e para baixo do teclado que o software mostra tais comandos na tela. Através do da janela workspace é possível visualizar as variáveis do algoritmo sendo implementado e seus respectivos valores. Nota-se ao iniciar o Matlab que por se tratar de um software manipulador de matrizes, este é por default inicializado com uma variável padrão do tipo matriz 1x1. O software ainda aceita que a declaração de variáveis pode ser feita de dois métodos, ou tipo, um pode se o método gráfico e o outro através de string, ou uma sequencia de caracteres. Estas variáveis podem ser declaradas no formato de matriz, onde as linhas são separadas por um ponto e virgula das colunas: M = [15 10; 5 1] A criação de uma matriz somente de zeros é feita através do comando zeros: M = zeros[15 10; 5 1] Como em muitas linguagens de programação, as variáveis devem ser declaradas iniciando sempre com letra, não podendo conter espaços ou caracteres de pontuação. A limpeza da tela do espaço de trabalho poder ser feita utilizando o comando clc, além de que as variáveis também podem ser excluídas da área de trabalho através do comando clear, porém podemos excluir apenas uma variável especifica, basta passar como parâmetro o nome da respectiva variável: clear <nome-da-variável> %exclui somente a variável especificada clear %exclui todas as variáveis do espaço de trabalho clc %limpa a tela do espaço de trabalho Alguma das operações básicas realizadas pelo Matlab pode ser visualizadas através do Quadro 1: Símbolo Operação Aritmética + Adição - Subtração * Multiplicação / Divisão ^ Potenciação Quadro 1: Operações básicas do Matlab. Para realizar uma destas operações entre duas variáveis x e y, basta colocar entre as mesmas o símbolo da operação desejada, este valor pode ainda ser reservado numa outra variável r: r= x*y; %realiza a operação de multiplicação entre x e y r=x^y; %eleva a variável x ao expoente y O Matlab possui um conjunto muito grande de funções matemáticas que permitem resolver grande parte dos problemas de cálculo encontrados, tais como: funções exponenciais, logarítmicas, trigonométricas, etc. Para utilizá-las basta colocar a função com seu respectivo parâmetro entre parênteses: Y = Sin(pi) %a variável Y retorna o valor π da função seno Y = Log(x) %a variável Y retorna o valor logarítmico da variável x Quando as funções são aplicadas sobre matrizes a função é aplicada a cada um dos elementos. Abaixo podemos visualizar algumas funções matemáticas contidas nas bibliotecas do software: Função Descrição Função Descrição cos cosseno log logaritmo nepriano(base e) sin seno log10 logaritmo base 10 tan tangente rem resto da divisão inteira acos arco-cosseno abs valor absoluto asin arco-seno sign sinal atan arco-tangente round arredonda para o mais próximo sqrt raiz quadrada floor arredonda par abaixo exp exponencial ceil arredonda para cima max máximo min mínimo real parte real de um imaginário abs módulo imag parte completa de um imaginário angle argumento de um complexo Quadro 2: Funções matemáticas do MATLAB Os comandos terminados com ponto e vírgula não exibem as variáveis de resposta na tela. Esse comando é usado quando se possui uma impressão do resultado na tela que não interessa, ou quando se possui muitos valores a serem mostrados, por exemplo, para uma matriz 20 × 20. O MATLAB segue certas regras na apresentação dos resultados. No caso de que nenhum formato esteja definido, se o resultado for um número inteiro, será mostrado o próprio. Quando um resultado é um número real, este mostra o resultado com uma aproximação de até quatro casas decimais. Se os dígitos significativos estiverem fora desta faixa, será apresentado o resultado em forma de notação científica. Porém, pode-se pré-definir um formato diferente utilizando os seguintes comandos: Format short %exibe cinco dígitos Format long %exibe dezesseis dígitos Format rat %exibe no formato racional Para realizar uma operação entre duas matrizes, basta apenas declarar uma segunda matriz dentro de outra variável, certificando-se que a dimensão é a mesma, e multiplicar uma variável pela outra, semelhante a uma operação com números constantes. Uma variável complexa no Matlab consiste em parte real mais a parte imaginária, a parte imaginária é identificada pela letra. Para melhor entendimento, ou esclarecimento de dúvida, muitas vezes é necessário a criação de gráficos contendo muitas informações quanto o estudo, para tanto, o software possui varias funções para geração de gráficos, entretanto, a função plot é a mais utilizada para gerar gráficos variando o seu comportamento consoante os parâmetrosde entrada. Estes gráficos são construídos a partir do comando ploat(x,y) criando um vetor X com as coordenadas do eixo das abscissas, em seguida escreve-se a função desejada, a partir do vetor X, a qual criará um novo vetor Y, das ordenadas. O comando linspace é responsável para criação prática de vetores conhecendo a quantidade de pontos necessários: vet = linspace (1, 10, 60); % vetor inicia em 1, termina em 10 e possui 60 pontos. Abaixo segue alguns exemplos da utilização dos vetores mencionados acima: vet = linspace (0,1,1000); %vetor inicia em zero e termina em 1 possuindo 1000 pontos intermediários vet = linspace (1,0,1000); %vetor decrescente de 1 à zero com 1000 pontos intermediários A formatação de cor e tipo de linha também pode ser configurada pelo usuário seguindo algumas especificações demonstradas na tabela 3: Cor Marcador Tipo de linha y (amarela) . ponto - sólida m (magenta) o círculo : pontilhada c (azul-claro) xis -. traço ponto r (vermelha) + cruz -- tracejada g (verde) * estrela b (azul) s quadrado w (branca) d losango k (preta) v triângulo para baixo ^ triângulo para cima < triângulo para esquerda > triângulo para direita p pentagrama h hexagrama Quadro 3: Parâmetros opcionais. Para utilizar essas configurações apresentadas basta digitar plot(x,y,’configuração’). Porém, para construção de gráficos com dados no formato discreto usa-se o comando stem da mesma forma que como é usado o comando plot. Para esclarecer a maior parte das dúvidas acerca da utilização de uma dada função do Matlab o comando help é de grande utilidade, ele apresenta detalhadamente todos os pacotes instalados, além de todos os comandos e suas utilizações. 1.2. Exemplo Professor Antes de iniciarmos as atividades praticas do semestre, foi passado pelo professor um exemplo de algoritmo do Matlab com vários fundamentos do software para que pudéssemos entender um pouco sobre o real funcionamento da ferramenta: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Programa Inicial - Sistemas Lineares % % Autor: Luis Felipe Benedito % % Data 03/04/2012 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; %limpar as variaveis da memoria close all; %fecha todas as figuras %% Criacao de Sinais t=linspace(0, 10, 1000); %cria um vetor de tempo igualmente espacado a=exp(-0.3*t); %cria um sinal a(t) b=sin(5*t); %cria um sinal b(t) z1=a.*b; %cria um sinal z1=a(t)*b(t) %% Plotagem de Sinais figure plot(t,z1,t,a,t,b,t,-a); %Faz os graficos de cada sinal %% Encerra o Programa disp('Graficos Finalizados'); %% Novo Sinal clear; t=0:0.1:15; %vetor de tempo com incremento de 0.1 até 40 c=1; for k=1:length(t) x(k)=2; if (t(k)-(c-1)*5>3)&(t(k)-(c-1)*5<5) x(k)=-2; end if t(k)>5*c c=c+1; end end stem(t,x) %% Encerra Programa disp('Grafiscos Finalizados'); O código acima tem como finalidade exemplificar a representação de um sinal em tempo discreto, onde algumas condições e alguns limites foram impostos, porém pra melhor visualização do gráfico, a quantidade de pontos e o espaçamento entre eles, que inicialmente era, respectivamente, 0.1 e 40, foram alteras para 0.3 e 15, assim a visualização e entendimento do processo de criação do sinal periódico pelo leitor torna-se mais fácil: Gráfico 1: Exemplo de sinal de tempo discreto. 1.3. Exercícios propostos Para maior familiarização com o software Matlab, foram propostos durante o período letivo alguns exercícios a fim de exercitarmos não só a teoria, mas também a prática com a implementação de códigos capazes de realizar operações de sinais vistas teoricamente em sala de aula. Inicialmente, foi declarado um sinal para confecção dos gráficos referente ao tempo contínuo e tempo discreto do mesmo. Observe para o sinal Y(t) = sin (t): t = linspace (0, 10, 1000); %criação do vetor tempo y = sin(t); %função seno em relação ao tempo stem (t, y); %plotagem do gráfico tempo discreto A partir do comando stem, é gerado um gráfico da função no tempo discreto: Gráfico 2: Sinal seno discreto com 1000 amostras. Como pode ser observado no Gráfico 2, quase não se percebe os pontos de forma separadas dando a impressão assim de um gráfico de tempo continuo. Alterando o gráfico, passando de 1000 para 70 o número de amostras no intervalo especificado, observa-se que as amostras do sinal ficaram mais espaçadas podendo ser visualizado como um sinal discreto: t = linspace (0, 10, 70); %criação do vetor tempo y = sin(t); %função seno em relação ao tempo stem (t, y); %plotagem do gráfico tempo discreto Gráfico 3: Sinal seno discreto com 70 amostras. Para um sinal seno contínuo, assim como no sinal discreto, basta declarar um t variante e retornar à uma variável y o valor de seno passando como parâmetro a própria variável t: t = linspace (0, 10, 70); %criação do vetor tempo y = sin(t); %função seno em relação ao tempo stem (t, y); %plotagem do gráfico tempo discreto Gráfico 4: sinal seno contínuo. De posse do conhecimento em relação à criação de um sinal, tanto discreto como contínuo, após a criação da função seno, efetuamos algumas operações de sinais. Inicialmente, realizamos a seguinte operação proposta pelo professor: ( ) ( ) ( ) Implementando o algoritmo para que o sinal z(t) seja criado, obtêm-se: t = linspace(0,20,1000); %criação do vetor tempo z = exp((-0.3)*t).*(sin(3*t)); %multiplicação dos sinais plot (t, z); %criação do gráfico no tempo contínuo A partir do comando plot, o algoritmo acima retorna, de forma gráfica, o resultado da operação realizada entre os sinais: Gráfico 5: Multiplicação sinal exponencial e sinal seno Pode-se ainda, declarar duas variáveis, cada uma responsável por um sinal envolvido na operação, assim temos que: t=linspace(0,20,1000); %criação vetor tempo a=exp((-0.3)*t); %criação sinal exponencial b=sin(3*t); %criação sinal seno c=a.*b; %operação de multiplicação dos sinais plot (t, c); %geração do gráfico plot (t, c, t, a); plot (t, c, t, a, t, b, t, -a); Note que ao criar as variáveis separadamente para cada sinal, podemos utilizar o valor de cada uma, podendo efetuar outros tipo de operações, tais como soma, subtração, divisão, etc. Assim como podemos manipular as variáveis, é possível também criar gráficos de cada um dos sinais. Logo, podemos criar o gráfico contendo todos os sinais, tanto os sinais de entrada, como o sinal de saída do algoritmo apresentado logo acima. Gráfico 6: Apresentação de todos os sinais na operação de multiplicação. 2. Introdução à convolução 2.1. Integral de Convolução Sempre que existirem transformações lineares e invariantes de um determinado sinal, pode-se falar em convolução, ou seja, um sinal ao passar por um dispositivo qualquer, vai certamente sofrer uma transformação e é a essa transformação que chamamos de convolução. Sejam x(t) o sinal de entrada e h(t) é a resposta do sistema H ao sinal x(t), duas funções nulas para x<0. A convolução dessas duas funções x(t) e h(t) serão representadas pela notação x(t) *h(t) e é definida, no caso unidimensional, pela integral: ( ) ∑ ( ) ( ) ∫ ( ) ( ) 1 ou ainda: ( ) ∫ ( ) ( ) ( ) ( ) 2 2.2. Propriedade comutativa A operação convolução é comutativa. Ou seja, x1(t) * x2(t) = x2(t) * x1(t). Essa propriedade pode ser provada pela mudança de variável. Fazendo z = t – e d = - dz, têm-se: ( ) ( ) ∫ ( ) ( ) ∫ ( ) ( ) ( ) ( ) 3 2.3. Propriedade distributiva Conforme a propriedade distributiva, têm-se que: ( ) [ ( ) ( )] ( ) ( ) ( ) ( ) 4 2.4. Propriedade associativa De acordo com a propriedade associativa, ( ) [ ( ) ( )] [ ( ) ( )] ( ) 5 As provas das equações 4 e 5 seguem diretamente da definição da integral de convolução. 2.5. Propriedade de deslocamento Se ( ) ( ) ( ) 6 então, ( ) ( ) ( ) ( ) ( ) 6.1 e ( ) ( ) ( ) 6.2 Como prova, temos que: ( ) ( ) ∫ ( ) ( ) ( ) 7 logo, ( ) ( ) ∫ ( ) ( ) ( ) 8 2.6. Convolução com impulso A convolução de uma função x(t) de impulso unitário resulta na própria função x(t). Pela definição da convolução: ( ) ( ) ∫ ( ) ( ) 9 Como ( ) é um impulso localizado em , de acordo com a propriedade de amostragem do impulso, a integral da equação 9 é o valor de x( ) para , ou seja, x(t). Portanto: ( ) ( ) ( ) 10 2.7. Propriedade da largura Se a duração (largura) de x1(t) e x2(t) forem finitas, dadas por T1 e T2, respectivamente, então a duração (largura) de x1(t) * x2(t), será T1 + T2: Figura 1: Propriedade da largura. 2.8. Resposta de estado nulo e causalidade A resposta (de estado nulo) y(t) é um sistema LCIT é ( ) ( ) ( ) ∫ ( ) ( ) 11 Na determinação da equação 11, consideramos o sistema linear e invariante no tempo. Não houve outras restrições sobre o sistema ou o sinal de entrada x(t). Na pratica, a maioria dos sistemas e causal, de forma que suas respostas não podem começar antes da entrada. Além disso, a maioria das entradas também são causais, o que significa que elas começam em t = 0. A restrição de causalidade tanto dos sinais quanto dos sistemas simplifica ainda mais os limites da integração da equação 11. Pela definição, a resposta de um sistema causal não pode começar antes da entrada começar. Consequentemente, a resposta de um sinal causal ao impulso unitário ( ) (o qual esta localizado em t = 0) não pode começar antes de t = 0. Portanto, a resposta h(t) ao impulso unitário de um sistema causal é um sinal causal. É importante lembrar que a integração na equação 11 é executada com relação a (e não t). Se a entrada x(t) é causal, x(t) = 0 para t < 0. Portanto, x( ) = 0 para < 0, como mostrado a Figura 2a. Portanto, o produto x( ) h(t – ) = 0 em todo lugar exceto sobre o intervalo não sombreado 0 t mostrado na Figura 2a (presumindo t 0). Observe que se t for negativo, x( ) h(t – ) = 0 para todo como mostrado na Figura 2b. Logo, a equação 11 se reduz a: ( ) { ( ) ( ) ∫ ( ) ( ) 12 O limite inferior da integração da equação 12 é considerado como sendo 0- para evitar a dificuldade da integração que podemos ter se x(t) contiver um impulso na origem. Esse resultado mostra que se x(t) e h(t) são ambos causais, a resposta y(t) também será causal. Por causa da propriedade cumulativa da convolução, também podemos expressar a equação 12, como: ( ) {∫ ( ) ( ) 13 Daqui por diante, o limite inferior de 0- será deduzido mesmo quando o escrevermos como 0. Como na equação 13, esse resultado presume que a entrada e o sistema são causais. Figura 2: Resposta de estado nulo e causalidade. 2.9. Implementação e resultados %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Sistemas Lineares – Convolução % % Autor: Luis Felipe Benedito % % Data 24/04/2012 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Definicao Iniciais N=50; n=0:N-1; %% Definicao do sinal de entrada x=[0 1 1 1 1 zeros(1,N-5)]; subplot(311); stem(n,x) %% Definicao do resposta ao Impulso h=[1 2 1 zeros(1,N-3)]; subplot(312); stem(n,h) %% operacoes com sinal y=zeros(1,N); for n=1:N for k=1:N if k<n y(n)=y(n)+x(k)*h(n-k); %convolução dos sinais end end end n=0:N-1; subplot(313) stem(n, [y(2:N) 0]) Note que inicialmente definimos uma variável contador n para controlarmos o numero de convolução desejadas. Logo, como n inicia-se em zero, esta recebe um incremento para que o número de convolução realmente seja 50 como definido pela variável constante N. Após determinar o número de convolução, são criados os sinais de entrada. Após a criação dos mesmos, é realizada as operações necessárias para a convolução definida no interior do loop. Posteriormente as operações de convolução serem realizadas pelo algoritmo, o software retorna os gráficos dos três sinais, tando os de entrada como os de saída para análise: Gráfico 7: Convolução de sinais. Analisando os resultados gráficos apresentados pelo software, nota-se que os resultados são aceitáveis, já que teoricamente os resultados seriam próximos dos encontrados. Para complementar o conhecimento sobre sinais, foi sugerido a construção de um algoritmo que fosse capaz de representar um triangulo equilátero sabendo que os sinais podem ser representados por somas de senoides ou rampas. Inicialmente, definimos os pontos onde uma função e outra começava e terminava através de condições definidas no interior de uma estrutura repetitiva (loop): %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Sistemas Lineares % % Autor: Luis Felipe Benedito % % Data: 04/04/2012 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; close all; %% Declaracao das variaveis t=linspace(1,10,50) %criação vetor tempo po=2; %ponto inicial da rampa pf=8; %ponto final da rampa pm=((pf-po)/2)+2; %ponto em que a rampa assume o maior valor %% Criacao do Sinal for k=1:length(t) if (t(k)>po)&(t(k)<=pm) %condicao para sinal crescente começar x(k)=2*(t(k)-2); %sinal crescente end if (t(k)>pm)&(t(k)<pf) %condicao para sinal decrescente começar x(k)=-2*(t(k)-8); %sinal decrescente end if t(k)>pf %condicao para sinal se anular x(k)=0; %sinal nulo, x=0. end end %% Plotagem do Sinal figure subplot(311); plot (t, x) subplot(312); stem (t, x) %% Encerra o Programa disp('Grafico Finalizado') Note no algoritmo que, enquanto o valor do vetor tempo t(k) definido no início é menor que o ponto inicial po, o valor do sinal é zero, porém, imediatamente quando o vetor tempo se torna maiorque o ponto inicial a rampa ascendente começa a ser criada até que o vetor tempo assuma um valor imediatamente maior que o ponto médio pm criando assim outra rampa, mas com característica descendente, tendo seu fim quando o vetor tempo passa a ser maior que o ponto final pf do triangulo assumindo um sinal constante de valor zero até o tamanho do vetor definido pela função linspace. Pode verificar a característica do sinal formado conforme o gráfico abaixo: Gráfico 8: Manipulação dos sinais para formação do sinal representado pelo triangulo equilátero. Computacionalmente, todos os sinais processados são representados por amostras periódicas do sinal, ou seja, de forma discreta. Mesmo os sinais contínuos mostrados em displays não deixam de ser discretos uma vez que ao aumentarmos o zoom sobre o sinal vê-se uma certa descontinuidade do sinal, portanto torna-se um sinal discreto. O sinal contínuo nada mais é do que um sinal discreto com frequência de amostragem tão grande que torna-se imperceptível à visão dessas descontinuidades do sinal amostrado. 3. Referências [1] HAYKIN, Simon; VAN VEEN, Barry. Sinais e sistemas. Porto Alegre: Bookman, 2001. [2] LATHI, B. P. Sinais e sistemas lineares. 2. ed. Porto Alegre, RS: Bookman, 2007. [3] OGATA, Katsuhiko. Projetos de sistemas lineares de controle com MATLAB. Rio de Janeiro: Prentice-Hall, 1996. [4] Disponível em <http://ensino.univates.br/~chaet/Materiais/CURSOmatlab52.pdf>. Acessado em 20/10/2012. [5] Disponível em <http://www.mathworks.com/index.html>. Acessado em 20/10/2012.