Tutorial Matlab: Função de Transferência (Nível Iniciante)

Olá pessoal,

conforme eu havia prometido, iniciarei a seguir, o primeiro de uma série de tutoriais envolvendo sistemas de controle empregando, como ferramenta principal, o Matlab. O Matlab é um poderosíssimo ambiente, uma ferramenta computaciona versátil e um companheiro inseparável para todos os que pretendem iniciar-se na maravilhosa engenharia de controle.

O primeiro passo é, obviamente, ter o Matlab instalado em seu PC. Basearei minhas aulas no Matlab 2008a (7.6.0) embora eu creia que a versão que você utilize esteja em conformidade com os comando que aprsentarei a seguir.

Como o tutorial trata de funções de transferência (FT), entenderei que você detém conhecimento suficiente para seguir adiante. Do contrário, sugiro que você leia a minha matéria sobre funções de transferência antes de iniciar o curso.

Muito bem. Mãos à obra. Abra o seu Matlab.

Tomemos como exemplo o controle de posição de um pequeno motor do tipo Pittman 12V com uma relação de redução da ordem de 30:1.  A sua função de transferência é dada pela seguinte equação:

No Command Window do Matlab digite:

numerador = [21.04]

As seguintes linhas de comando aparecerão:

>> numerador = [21.04]

numerador =

21.0400

Isso significa que o Matlab armazenou o valor em um array chamado “numerador” que é , de fato, o numerador da nossa FT. Antes de digitarmos o denominador da FT, porém, devemos notar que M(s) está na forma de frações parciais. Para facilitar nosso trabalho, faremos a expansão do denominador de M(s) na forma distributiva. Para isso, digite a  seguinte série de comandos, um a um, apertando ENTER após digitar cada linha:

syms s

\\ o comando acima serve para informar ao Matlab que se trata de uma variáve simbólica

expand(s*(0.0017*s+1))

\\ o comando acima efetua a operação distributiva

Surgirá o seguinte trecho em seu Command Window:

>> ans =

1/10000*s*(17*s+10000)

Agora simplificaremos a expressão encontrada pelo Matlab. Digite o seguinte trecho:

simple(ans)

A variável “ans” armazena o resultado do cálculo anterior. Não se assute. O Matlab efetuará uma série de cálculos antes de chegar ao seguinte resultado:

>> ans =

17/10000*s^2+s

Agora que já temos o denominador da nossa FT no formato expandido, digite:

denominador = [17/10000 1 0]

O resultado será o seguinte:

denominador =

0.0017    1.0000         0

Pronto. Temos nosso numerador e nosso denominador prontos. Agora é preciso fazer o Matlab entender quais os componentes de nossa FT. Digite o seguinte código:

M = tf(numerador,denominador)

O que resultará na seguinte mensagem:

Transfer function:
21.04
————–
0.0017 s^2 + s

Ou seja, já temos a nossa FT pronta, armazenada na variável M.

Fácil, não? Pois bem! No próximo tutorial nós aprenderemos a estimular a nossa recém criada função de transferência de modo que vejamos o que acontece com nosso motor (representado pela sua função de transferência), quando aplicamos uma tensão aos seus terminais.

Um abraço a todos e espero que tenham gostado do tutorial.

Até o próximo!

Sobre Eng. Rafael Coronel Bueno Sampaio, PhD.

Projeto & Pesquisa de Sistemas Mecatrônicos e Robótica Móvel
Esse post foi publicado em Controle, Função de Transferência, Matlab, Motor DC, Sistemas de Controle, Teoria de Controle e marcado , , , , , . Guardar link permanente.

38 respostas para Tutorial Matlab: Função de Transferência (Nível Iniciante)

  1. sandro marchini disse:

    Rafael percebi que você é um exímio conhecedor de Mat Lab, tenho um programa para fazer para faculdade más não consigo ao menos iniciá-lo, gostaria se possível da tua ajuda.

    Atte.

    • Olá Sandro!

      Obrigado pelo seu comentário. É sempre um prazer ser útil.
      Ficarei feliz em ajudá-lo. Poste sua dúvida aqui no blog que trocaremos idéias, sem problemas. De repente, a sua dúvida é a mesma dúvida de muitos outros leitores.

      Grande abraço!

  2. Avelino disse:

    Me ajudou muito esse tutorial cara! Muito obrigado!

    Não tinha idéia de que tem que ser feito vetores para o numerador e denominador para montar a FT, e também não estava sabendo fazer a variável simbólica.

    Agora só preciso descobrir como achar as funções de transferência equivalentes de 1º e 2º grau da minha função de terceiro grau e comparar os gráficos da resposta ao degrau.

    /tenso

  3. Henrique disse:

    Ótimo post Rafael. Graças a ele estou vendo o quão poderoso é o Matlab.
    Só não entendi o que isso significa definir s como uma variável simbólica e por que precisamos fazer isso. Você pode dar uma luz?
    Abraços,
    Henrique

    • Olá Henrique,

      Obrigado pelo seu interesse e por, mais uma vez, entrar em contato.
      Bem, ocorre que o operador laplaciano “s” refere-se a operações que fazemos com o Matlab para representações de sistemas dinâmicos no domínio da frequência, ou seja, para a resolução de equações diferencias ordinárias originalmente definidas no domínio do tempo após a aplicação da Transformada de Laplace. Assim como quando efetuamos operações matemáticas no domíno do tempo no Matlab (utilizando a variável ‘ t ‘, portanto) devemos defini-las antes como uma variável literal, o mesmo deve ser realizado com o operador ‘ s ‘. Um exemplo muito simples é a multiplicação de x por ele próprio. Experimente digitar a seguinte expressão no Matlab e veja o que ocorrerá:

      x * x

      O resultado será:

      ??? Undefined function or variable ‘x’.

      Isso ocorre porque o Matlab não sabe que ‘ x ‘ é um número, para nós humanos. Para nós é fácil ver que o resultado devria ser x ^2.
      Assim, é necessário informar ao Matlab que se deseja efetuar uma operação matemática com o número ‘ x ‘ e que ‘ x ‘ é um número.

      Assim, usa-se o toolbox Symbolic Math (syms) para fazê-lo.
      Espero ter esclarecido a sua dúvida.
      Mantenha contato e escreva caso ainda tenha alguma pergunta. Terei prazer em responder.

      Abraços !

  4. Adriano disse:

    Muito obrigado! Comecei agora e já estou encantado com o poder do MATLAB.

  5. Jeronimo disse:

    muito bom mesmo esse tutorial, eu preciso somar duas senoides de frequencias 10Hz e 1000Hz e fazer a transformada de laplace para multiplicar com a função de transferencia e depois fazer a transformada inversa de laplace como faço isso???(preciso fazer a função de transferencia de um filtro passa baixa e ingetar duas senoides ao mesmo tempo com uma frequencia maior e menor da frequencia de corte e ver que a resposta é só a senoide de 10HZ pois a de 1000hz foi filtrada)!!!eu não sei se o que eu falei antes está certo(de como fazer no matab)!!!!

    • Olá Jeronimo,

      Para a transformada de Laplace o Matlab possui o comando nativo “laplace”. Para a sua inversa use “ilaplace”.
      Para o passa baixa, use um circuito RC. A função de trabnsferência do filtro é 1/(rcs + 1), onde o produto “rc” será a constante de tempo de carga/descarga do capacitor. Ajuste os valores apropriadamente de modo que você filtre a alta frequência e veja seus 10Hz na saída.

      Abraços!

  6. Jonathan disse:

    Ótimo post,Rafael.Bom,eu ainda estou tentando aprender a usar o matlab.Estou com umas dúvidas e gostaria de saber se seria possível sua ajuda.
    O problema é o seguinte : tenho uma planilhas com dados no Excel e queria passar esses dados para o matlab para que formem um vetor.
    Agradeço desde já

  7. Marcio disse:

    Amigo, uma dúvida um pouco mais além do seu tutorial sobre a função ft do matlab. Ele apenas constroi funções de transferência com os coeficientes conhecidos, ou eu poderia definir no matlab uma função de transferencia com coeficientes que ficassem em função de variáveis, por exemplo G(s) = k/(Ms² + bs + k), sendo que as variáveis M, b, k, seriam aleatórias ou definidas posteriormente. É possível fazer dessa forma? Obrigado desde já pela atenção.

    • Olá Marcio,

      Obrigado pelo post e me perdoe pela demora. O tempo é mesmo um inimigo, por vezes.
      Bem, você se refere a um típico sistema dinâmico de segunda ordem, ou seja, possui uma representação geral baseada em dois parâmetros determinantes: um coeficiente de amortecimento ξ e uma frequência natural ωn.
      Sim, é possível observar respostas de sistemas de segunda ordem parametrizadas, ou seja, em função dos parâmetros ξ e ωn. O script ao final dessa mensagem produz as respostas de um sistema de segunda ordem em função do coeficiente de amortecimento, mantendo-se a frequência natural do sistema inalterada. O referido script pode servir, por exemplo, para testar as diferentes respostas de um sistema massa-mola-amortecedor para coeficientes de amortecimentos também variados (desde zero até um valor máximo arbitrário).

      Teste e envie sua resposta.

      Espero ter sanado a sua dúvida.

      Abraços,

      Rafael C.

      %====================================================================
      %=============== Resposta de Sistemas de 2a. Ordem ==================
      % Autor: Rafael Coronel
      % Data: 29/ABRIL/2013
      % Info: Controle e Servomecanismos I
      % Respostas de sistemas de 2a. ordem a variações na
      % constante de amortecimento do sistema (Xi).
      %====================================================================
      %====================================================================

      wn = 20;

      for i = 1:0.1:3

      ksi = i-1;

      num = [wn^2];
      den = [1 2*ksi*wn wn^2];

      G = tf(num,den);

      hold on

      t=0:0.01:2.5;
      step(G,t);

      end

      hold off

  8. SAMUEL OLIVEIRA disse:

    Rafael, parabens pelos post’s.

    Eu gostaria de saber como implementear no matlab um FT com zeros, pois tentei fazer (s-1)/(s^2+2s+1) e surge um erro dizendo que numerador e denominador devem ser um numero.

    Obrigado!

    • Olá Samuel,

      Basta utilizar as seguintes linhas de comando:

      num = [1 -1];
      den=[1 2 1];
      G = ft(num,den)

      O workspace do Matlab deverá exibir a seguinte mensagem:

      Transfer function:
      s – 1
      ————-
      s^2 + 2 s + 1

      Ou seja, a sua FT.
      Espero ter ajudado.

      Abraços,

      Rafael

    • Prezado Samuel,

      O Matlab não interpreta o operador laplaciano (s) explicitamente. É necessário, portanto, colocar os polinômios na notação vetorial.

      num = [1 -1];
      den = [1 2 1];
      G = tf(num,den)

      Ou, de modo direto:

      G = tf([1 -1],[1 2 1])

      O resultado será a sua FT.

      Transfer function:
      s – 1
      ————-
      s^2 + 2 s + 1

  9. Alessandra disse:

    Ótimo post.
    Eu gostaria de saber como implementar um motor cc usando linha de código para montar diagrama de bloco. Não posso utilizar o simulink. Aguardo resposta.

  10. Paulo disse:

    Rafael, estou vendo seu tutorial em 2013 e achei muito útil e instrutivo. Porém, se você puder ajudar um colega com uma dúvida, ficarei muito grato. A situação é a seguinte, tenho um bloco Transfer Fcn no Simulink onde já entrei o numerador e denominador. Como faço para “encadear” um bloco que calcule a derivada no domínio s?? Desde já lhe agradeço.

    • Prezado Paulo,

      O Simulink efetua a diferenciação de sinais no domínio de Laplace normalmente. Se bem entendi sua pergunta, você deve inserir um bloco ‘derivative’ (menu ‘continuous’) e conectar a saída de sua TF na entrada do bloco.

      Espero ter ajudado.

      []s

      Rafael C.

  11. Cristiano Dillem disse:

    Muito bom..Mas Rafael, eu tenho uma matriz estados espaço, como eu faço para transformar em uma.função transferência se minha matriz B é assim [y1;y2;y3;y4]?
    Cara desde já agradeço pela ajuda

    • Cristiano,

      Suponho, pela informação fornecida por você, que seu sistema dinâmico tenha quatro EDOs que o descrevem, 4 estados e 4 entradas. Correto? Suponho, com base nisso, que sua matriz A seja 4×4. Não conheço o número de saídas.
      O comando do MATLAB que converte um sistema matricial em FT é tf2ss. Veja o Exemplo:

      Seja o sistema dinâmico de 4 estados, 1 saída e 1 entrada descrito a seguir:

      A =

      0.6324 0.9575 0.9572 0.4218
      0.0975 0.9649 0.4854 0.9157
      0.2785 0.1576 0.8003 0.7922
      0.5469 0.9706 0.1419 0.9595

      B =

      0.6787
      0.7577
      0.7431
      0.3922

      C =

      0.6557 0.0357 0.8491 0.9340

      D = 0

      Utilize as linhas de comando:

      [n,d] = ss2tf(A,B,C,D)
      G = tf(n,d)

      Resultado:

      Transfer function:
      2.475 s^3 – 2.104 s^2 + 0.9414 s – 0.5448
      ——————————————–
      s^4 – 3.357 s^3 + 2.52 s^2 – 1.13 s + 0.4518

      Espero ter esclarecido.

      []s

      Rafael

  12. Rafael Lima disse:

    Olá, Rafael

    Estou com dificuldades nessa seguinte função y(s) 5(s+100)/(s^2+60s+500) R(s).
    Me ajude a entende por favor.

  13. Livia disse:

    Rafael ,

    Estou com dificuldades com o ilaplace, após criar minha função de transferência com o tutorial (sabendo que “G” é minha função de transferência) tento o comando:

    ilp = ilaplace(G)

    mas sempre tenho a resposta de erro
    Undefined function ‘ilaplace’ for input arguments of type ‘tf’

    Quando “escrevo” a função G entre parêntesis utilisando a variável s , como:

    ilp = ilaplace (1/s^2)

    o programa roda normalmente, creio que haja algum problema quanto ao comando “tf”. Existe algo que eu possa fazer para que ele transforme a função de transferência sem necessitar reescrever.

    Obrigada!

    • Olá Lívia,

      O comando ilaplace deve ser utilizado da seguinte forma para a sua FT:

      1) defina as variáveis simbólicas do domínio da frequência e do do domínio temporal, s e t, respectivamente:

      >> syms s t;

      2) em seguida, aplique o comando ilaplace. A função do MATLAB que se refere ao comando da inversa de Laplace requer que sejam passadas além da FT, as variáveis ‘s’ e ‘t’:

      g = ilaplace(1/s^2, s, t);

      3) O resultado da função g no domínio do tempo será exibida em seguida.

      Espero ter ajudado.

      Abraços,

      Rafael

  14. Julia Vale disse:

    Oi Rafael,

    Estou com uma dúvida referente a traçar o gráfico em resposta ao degrau.

    Tenho a seguinte FT:
    g11=tf(-[1.029e-3 2.3e-5], [1 0.0196 7.7184e-06]).

    Fisicamente, o eixo x é o tempo em segundos e o eixo y é altura em cm. Como eu devo fazer para transformar o tempo em minutos?

    Segue o que tenho, com a resposta em segundos:

    g11=tf(-[1.029e-3 2.3e-5], [1 0.0196 7.7184e-06]);
    s=tf(‘s’);

    FB11=(g11/(1+g11));
    figure
    step(FB11);
    title(‘Resposta ao degrau: g11’);
    xlabel(‘Tempo’)
    ylabel(‘Altura’)

    Muito obrigada pela atenção.

    Júlia

    • Olá Julia,

      Você precisa modificar a unidade de tempo antes de solicitar o plot do gráfico. Modifiquei a métrica de tempo relativa a sua FT primeiro:

      sys11 = chgTimeUnit(FB11,’minutes’)

      Note a mudança da FT sys11 (que é a na realidade a sua FT11 na base de segundos). Em seguida, utilizei o comando step sobre a nova FT sys11. Vide código abaixo:

      clear all
      clc

      g11=tf(-[1.029e-3 2.3e-5], [1 0.0196 7.7184e-06]);
      s=tf(‘s’);

      FB11=(g11/(1+g11));

      sys11 = chgTimeUnit(FB11,’minutes’)

      figure
      step(sys11);
      title(‘Resposta ao degrau: g11’);
      xlabel(‘Tempo’)
      ylabel(‘Altura’)

      Espero ter auxiliado.
      Abraços,

      Rafael

  15. Julia Vale disse:

    Oi Rafael,

    Tinha outra dúvida. Estou trabalhando com sistema multivariável com 3 entradas e 2 saídas. Fisicamente, as três entradas são vazões e possuem valores iniciais. As duas saídas também possuem valores de referência. Fazendo o degrau, gostaria de saber onde deveria colocar esses valores de referência.

    Exemplo: a primeira saída tem como valor de referência 50 e a segunda saída, 10. Os valores iniciais das entradas são g1=15, g2=4, g3=30. Você sabe onde deveria entrar com esses valores?
    Desde já, muito obrigada,

    clc;
    clear all;
    close all;

    % Funções de transferência – saída 1
    g11=tf(-[1.029e-3 2.3e-5], [1 0.0196 7.7184e-06]);
    g12=tf(-[1.59e-4 4.33e-7], [1 0.0084 3.2084e-06]);
    g13=tf([1.029e-3 2.3e-5], [1 0.0196 7.7184e-06]);
    % Funções de transferência – saída 2
    g21=tf(7p do ar.6e-5,[1 1.92e-2]);
    g22=tf(7.78e-5,[1 7.81e-3]);
    g23=tf(-7.6e-5,[1 1.92e-2]);

    s=tf(‘s’);
    G=[g11 g12 g13; g21 g22 g23];
    sys=ss(G);

    %% Resposta ao degrau: com feedback e sem controlador

    t=0:60:480;

    FB11=(g11/(1+g11)); sys11=chgTimeUnit(FB11,’minutes’);
    FB12=(g12/(1+g12)); sys12=chgTimeUnit(FB12,’minutes’);
    FB13=(g13/(1+g13)); sys13=chgTimeUnit(FB13,’minutes’);
    FB21=(g21/(1+g21)); sys21=chgTimeUnit(FB21,’minutes’);
    FB22=(g22/(1+g22)); sys22=chgTimeUnit(FB22,’minutes’);
    FB23=(g23/(1+g23)); sys23=chgTimeUnit(FB23,’minutes’);

    figure
    subplot(131);step(sys11,t);
    title(‘Resposta ao degrau: g11);
    xlabel(‘Tempo’)
    ylabel(‘Amplitude’)

    subplot(132);step(sys12,t);
    title(‘Resposta ao degrau: g12’);
    xlabel(‘Tempo’)
    ylabel(‘Amplitude’)

    subplot(133);step(sys13,t);
    title(‘Resposta ao degrau: g13’)
    xlabel(‘Tempo’)
    ylabel(‘Amplitude’)

    figure
    subplot(131);step(sys21,t);
    title(‘Resposta ao degrau: g21’);
    xlabel(‘Tempo’)
    ylabel(‘Amplitude’)

    subplot(132);step(sys22,t);
    title(‘Resposta ao degrau: g22’);
    xlabel(‘Tempo’)
    ylabel(‘Amplitude’)

    subplot(133);step(sys23,t);
    title(‘Resposta ao degrau: g23’);
    xlabel(‘Tempo’)
    ylabel(‘Amplitude’)

    Att,
    Júlia

  16. Anselmo disse:

    Olá, gostaria de saber como fazer expansão de uma fração de polinômios em frações parciais no matlab. estava tentando aqui mas nao consegui. por exemplo (s+a)/s^2+4s+3=A/s+x + B/s+y

  17. Gustavo disse:

    Olá Rafael, gostei muito do post e tenho uma dúvida.
    Preciso fazer um trabalho sobre ft de circuitos elétricos que possuem até 4 laços de corrente, gerando um sistema de 4 variaveis. Como eu posso escrever essas equações, que estão no plano s, no MatLab e obter a ft da tensão de um capacitor sobre a tensão da fonte de tensão do circuito?

  18. Olá. Quando ao ajuste que o Matlab/simulink faz na função de transferência. Saberia explicar como é feito esse ajuste? Digo, o que o simulink faz para ajustar a função?

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s