Teoria

Introdução

Olá, meu povo! Lembram das derivadas de Cálculo I? Usamos elas pra estudar variações de uma função ao longo de uma variável.

Por exemplo, se temos uma função que calcula a posição de um carro ao longo do tempo, sua primeira derivada indica a velocidade do carro e a segunda, a aceleração.

Quando se conhece a função que queremos derivar e é fácil de encontrar sua derivada (por exemplo, uma função polinomial tipo f ( x )   =   x 2 ou uma função que a gente encontra naquelas tabelas de derivadas) podemos resolver isso na mão em dois palitos.

Mas imagina que você fez um experimento medindo a velocidade em rpm de um motor elétrico, inicialmente parado, aplicando uma tensão constante nele. Você registrou em uma tabelinha a velocidade do motor a cada instante de tempo.

Você quer encontrar a taxa de variação de velocidade do motor, isto é, a aceleração. Como fazer isso sem conhecer a função matemática que descreve a velocidade do motor em função do tempo?

Nosso amigo MATLAB pode ajudar a gente a resolver isso! Para casos em que queremos encontrar as derivadas tendo apenas tabelas com valores, usamos a diferenciação numérica.

A função d i f f ( ) do MATLAB ajuda a gente a calcular a diferenciação numérica com vetores de valores. Partiu aprender mais essa funçãozinha do MATLAB?

Entendendo a função d i f f ( )

Podemos ter duas entradas na função d i f f ( ) e ela nos retorna uma saída:

Y   =   d i f f ( X ,   n )

Ela calcula n   vezes a diferença entre os elementos adjacentes do vetor X e nos dá o resultado na forma do vetor Y .

Vamos traduzir isso com um exemplo. Se nosso vetor X é [ 1   2   3   4   5 ] e usamos n   =   1 , entramos as seguintes linhas de código no Command Window do MATLAB:

Ele vai nos retornar:

Para construir o vetor Y , o MATLAB fez:

Y = [ 2 - 1   3 - 2   4 - 3   5 - 4     ] = [ 1   1   1   1     ]

Isto é, ele fez um elemento menos o elemento à sua esquerda, começando com o segundo elemento de X , e a diferença foi calculada só uma vez. Caso eu fizesse Y   =   d i f f ( X , 2 ) , o resultado seria:

Neste caso, a diferença foi feita duas vezes, pois n   =   2 . Primeiro o MATLAB fez:

[ 2 - 1   3 - 2   4 - 3   5 - 4     ] = [ 1   1   1   1     ]

Em seguida:

1 - 1   1 - 1   1 - 1   = 0   0   0  

Na prática, seria a mesma coisa que fazer Y   =   d i f f ( d i f f ( X , 1 ) , 1 ) , sacou?

Note que o vetor de saída Y sempre terá um elemento a menos do que o vetor de entrada X , por causa deste esquema de fazer um elemento menos o elemento à sua esquerda.

Na função Y   =   d i f f ( X , n ) , a entrada n é opcional. Se usarmos simplesmente Y   =   d i f f ( X ) , o MATLAB calcula a diferença uma vez só. Em outras palavras, o padrão é n   =   1 .

Diferenciação Numérica no MATLAB

Ok, já sabemos como funciona o d i f f ( ) , mas como usamos ele para calcular derivadas numéricas? Vamos aprender tendo como exemplo o experimento do motor. Imagine se tivéssemos uma expressão algébrica que representasse a velocidade do motor em função do tempo. Ela teria essa cara:

v   =   f ( t )

onde v é a velocidade do motor e t é o tempo. Para encontrar a variação da velocidade do motor ao longo tempo, eu teria que derivar essa função no tempo:

d v d t = d f ( t ) d t

Falando de um jeito beeem simplificado, na diferenciação numérica do nosso exemplo, temos que encontrar dois vetores, um representando d v e outro representando d t . O vetor d v teria a diferença de velocidades de um instante de tempo para outro e o vetor d t teria a diferença entre um instante de tempo e outro. Daí, para encontrarmos d v / d t , temos que dividir cada elemento de d v por um elemento de d t que esteja na mesma posição.

Vamos ilustrar isso no MATLAB. Primeiro, vamos criar dois vetores, um para o tempo e outro para a velocidade do motor:

O vetor do tempo eu chamei de t e, como o tempo foi registrado de um em um segundo, eu posso criá-lo usando os dois pontos, pedindo que ele comece em 0 e vá até 9 , de um em um.

O vetor de velocidade chamei de v . Dividi os valores de v por 60 para converter rpm (rotações por minuto) para rps (rotações por segundo), para que a unidade de velocidade seja compatível com a unidade de tempo do vetor t .

Agora, vamos usar a função d i f f ( ) para calcular os vetores d v e d t :

Para encontrarmos a derivada d v / d t , entramos com a linha de código:

Chamei a derivada d v / d t de d v d t e a calculei dividindo cada elemento de d v pelo elemento de d t que está na mesma posição. Então, d v d t também é um vetor e tem essa carinha:

Interpretando o resultado, temos que a aceleração do motor entre os instantes 0 e 1 s do experimento é de 20,1667 rps²; entre os instantes 1 e 2 s, ela é de 10,9333 rps², e assim sucessivamente.

Mais uma aplicaçãozinha

Para fechar, vamos ver mais um exemplo. Desta vez, não temos uma tabela com valores, nós conhecemos a expressão algébrica da função que queremos derivar. Digamos que eu queira calcular a derivada numérica do polinômio abaixo no intervalo [ - 4 ; 5 ] :

f x = x 5 - 3 x 4 - 11 x 3 + 27 x 2 + 10 x - 24

Chamando d f / d x de d f d x , eu crio um script no MATLAB com as seguintes linhas de código:

Vamos ver o que cada linha significa:

  • Na linha 1, crio o vetor x , que vai de - 4 a 5 , a um passo de 0,1 .
  • Na linha 2, eu entro com o polinômio, que vai ser representado pelo vetor f . Cada elemento de f é a solução de f ( x ) para cada elemento do vetor x . Eu faço isso usando o . do lado de x . Por exemplo, x . ^ 5 significa que cada elemento do vetor x é elevado à quinta potência.
  • Na linha 3, eu calculo a derivada do polinômio, usando o d i f f ( ) .
  • Na linha 5, crio um vetor x d que vai do 2º elemento de x até o último elemento dele (por isso o e n d no final). Lembra que o vetor de saída do d i f f ( ) tem um elemento a menos do que o vetor de entrada? Se tentarmos criar o plot com vetores de tamanhos diferentes, o Matlab dá erro, por isso criamos esse vetor pra fazer o plot da derivada;
  • Na linha 7, eu peço ao MATLAB para gerar o gráfico do meu polinômio, tendo o vetor x no eixo x do gráfico e o vetor f no eixo y ;
  • Na linha 8, eu uso o comando h o l d   o n . Com esse comando, eu faço com que meu plot seguinte não substitua o plot da linha 7. Desta forma, eu posso ter as duas curvas, a da função e a da derivada, na mesma janela;
  • Finalmente, na linha 9, eu peço ao MATLAB para gerar o gráfico da derivada do polinômio, tendo o vetor x d no eixo x e o vetor d f d x no eixo y .

Rodando o nosso código, temos este gráfico maravilhoso no final:

Em azul, temos o polinômio f x = x 5 - 3 x 4 - 11 x 3 + 27 x 2 + 10 x - 24 .

Em vermelho, temos a primeira derivada de f x .

E aí, curtiu? Sentindo que agora encara qualquer derivada? Para ganhar mais confiança, bora praticar com os exercícios que eu preparei com muito carinho para te ajudar a fixar o conteúdo ;D

Entendendo a função d i f f ( )

Diferenciação Numérica no MATLAB

Mais uma aplicaçãozinha