Derivadas Numéricas

Ver Todos os Exercícios

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

Exercícios Resolvidos

Exercício Resolvido #1

Para o polinômio abaixo, plote a função e sua derivada, no intervalo de [-10,10], usando diferenciação numérica.

h x = x 5 - 4 x 4 - 9 x 3 + 32 x 2 + 28 x - 48

Passo 1

A questão nos pede para gerarmos um gráfico com duas curvas, uma representando h ( x ) e outra representando d h d x , com x indo de -10 a 10.

Antes de gerarmos as curvas com função p l o t ( ) , precisamos encontrar a derivada de h ( x ) , usando diferenciação numérica. Para isso, usaremos a função d i f f ( ) do MATLAB.

Passo 2

Primeiramente, crie um script novo no MATLAB e digite o código abaixo, para gerar um vetor contendo o intervalo de x pedido no enunciado:

O comando acima cria um vetor chamado x cujos elementos vão de -10 a 10, com um passo de 0,01. Escolhi um passo pequeno para as curvas no final saírem suaves, mas você pode escolher o passo que quiser.

Em seguida, precisamos calcular h ( x ) para cada elemento do vetor x . Para isso, digite a linha de código:

Nesta linha de código, colocamos um ponto (.) ao lado do vetor x indicando que queremos realizar a operação matemática em cada elemento dele. Por exemplo, x . ^ 5 pede que cada elemento de x seja elevado à quinta potência. Desta forma, criamos um vetor chamado h , de mesmo tamanho de x , que contém o resultado de h ( x ) para cada elemento do vetor x .

Passo 3

Para encontrarmos d h d x por diferenciação numérica, temos que gerar dois vetores, um representando d h e outro representando d x . O vetor d h teria a diferença de h ( x ) de um valor de x a outro e o vetor d x teria a diferença entre um valor de x e outro.

Estes vetores são gerados por meio da função d i f f ( ) . Lembrando que ela tem a seguinte estrutura:

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 .

Os dois vetores são gerados por meio das seguintes linhas de código:

Na primeira linha, é criado o vetor d x , que contém as diferenças entre elementos adjacentes do vetor x . Para criar o vetor d x , a função d i f f ( ) faz um elemento de x menos o elemento à esquerda, começando a partir do segundo elemento de x .

Na segunda linha, é feita a mesma coisa, mas com o vetor h . A variação de h é armazenada no vetor d h .

Note que não entramos nenhum valor para n , porque queremos que a diferença seja feita uma vez. Quando não entramos com nenhum valor para n na função d i f f ( ) , por o padrão o MATLAB adota n = 1 .

Passo 4

Com os vetores d x e d h criados, podemos calcular d h d x por meio da linha de código:

Com este comando, dividimos cada elemento do vetor d h pelo elemento do vetor d x que esteja na mesma posição e o resultado é armazenado no vetor d h d x .

O vetor d h d x representa a derivada de h ( x ) obtida por meio de diferenciação numérica. Com o vetor d h d x , podemos gerar o gráfico de d h d x .

Passo 5

Antes de gerar o gráfico de h ( x ) e de d h d x , precisamos criar um vetor auxiliar para podermos plotar a curva de d h d x em função de x . Esse vetor auxiliar é necessário por que o vetor d h d x tem um elemento a menos do que x , o que levaria a um erro na função p l o t ( ) .

Vamos chamar o vetor auxiliar de x d e criá-lo da seguinte forma:

A linha de código acima diz que o vetor x d é um pedaço do vetor x , começando do segundo elemento de x e indo até o final de x (indicando por e n d ).

Já temos tudo o que precisamos para gerar os gráficos de h ( x ) e de d h d x . Vamos criar as curvas de ambos na mesma janela. Para isso, entre as três linhas de código abaixo:

Na primeira linha, pedimos ao MATLAB para plotar h em função de x e d h d x em função de x d .

Na segunda linha, damos um nome ao eixo x do gráfico: chamamos ele de x.

Na terceira linha, criamos uma legenda para o gráfico. A string ‘ h ( x ) ’ é a legenda da curva gerada pelo primeiro par de vetores, x e h , da função p l o t ( ) . Já a string ‘ d h / d x ’ é a legenda da curva gerada pelo segundo par de vetores, x d e d h d x , da função p l o t ( ) .

Rodando nosso programa, temos o gráfico pedido no enunciado:

A curva azul representa h ( x ) e a curva vermelha, d h d x .

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #2

Para o polinômio abaixo, plote a função, sua derivada primeira e sua derivada segunda, no intervalo de [-10,10]. Use diferenciação numérica para encontrar as derivadas.

i x = x 7 - 5 x 3 + 14 x 2 - 12

Passo 1

A questão nos pede para gerarmos um gráfico com três curvas, uma representando i ( x ) , outra representando d i d x (a derivada primeira de i ( x ) ) e outra representando d 2 i d x 2 (a derivada segunda de i ( x ) )) com x indo de -10 a 10.

Antes de gerarmos as curvas com função p l o t ( ) , precisamos encontrar as derivadas de i ( x ) , usando diferenciação numérica. Para isso, usaremos a função d i f f ( ) do MATLAB. Lembrando que ela tem a estrutura:

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 .

Para encontrarmos a derivada primeira, o vetor X   de entrada de d i f f ( ) será a função i ( x ) . Para a derivada segunda, o vetor X será d i d x .

Nos passos abaixo, vamos entender direitinho o porquê.

Passo 2

Primeiramente, crie um script novo no MATLAB e digite o código abaixo, para gerar um vetor contendo o intervalo de x pedido no enunciado:

O comando acima cria um vetor chamado x cujos elementos vão de -10 a 10, com um passo de 0,01. Escolhi um passo pequeno para as curvas no final saírem suaves, mas você pode escolher o passo que quiser.

Em seguida, precisamos calcular i ( x ) para cada elemento do vetor x . Para isso, digite a linha de código:

Nesta linha de código, colocamos um . ao lado do vetor x indicando que queremos realizar a a operação matemática em cada elemento dele. Por exemplo, x . ^ 7 pede que cada elemento de x seja elevado à sétima potência. Desta forma, criamos um vetor chamado i , de mesmo tamanho de x , que contém o resultado de i ( x ) para cada elemento do vetor x .

Passo 3

Depois de criarmos os vetores x e i , podemos determinar as derivadas primeira e segunda de i ( x ) . Vamos começar com a a derivada primeira. Para encontrarmos d i d x por diferenciação numérica, temos que gerar dois vetores, um representando d i e outro representando d x . O vetor d i teria a diferença de i ( x ) de um valor de x a outro e o vetor d x teria a diferença entre um valor de x e outro.

Estes vetores são gerados por meio da função d i f f ( ) , que tem a estrutura:

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 .

Os dois vetores são gerados por meio das seguintes linhas de código:

Na primeira linha, é criado o vetor d x , que contém as diferenças entre elementos adjacentes do vetor x . Para criar o vetor d x , a funçao d i f f ( ) faz um elemento de x menos o elemento à esquerda, começando a partir do segundo elemento de x .

Na segunda linha, é feita a mesma coisa, mas com o vetor i . A variação de i é armazenada no vetor d i .

Note que não entramos nenhum valor para n , porque queremos que a diferença seja feita uma vez. Quando não entramos com nenhum valor para n na função d i f f ( ) , por o padrão o MATLAB adota n = 1 .

Passo 4

Com os vetores d x e d i criados, podemos calcular d i d x por meio da linha de código:

Com este comando, dividimos cada elemento do vetor d i pelo elemento do vetor d x que esteja na mesma posição e o resultado é armazenado no vetor d i d x .

O vetor d i d x representa a derivada primeira de i ( x ) obtida por meio de diferenciação numérica. Com o vetor d i d x , podemos gerar o gráfico de d i d x .

Passo 5

Após determinarmos a primeira derivada, vamos calcular a segunda derivada de i ( x ) , por meio de diferenciação numérica. Assim como fizemos para a primeira derivada no passo 3, para determinar d 2 i d x 2 , precisamos construir dois vetores, um representando d 2 i e outro representando d x 2 , e dividir um pelo outro.

Para isto, usamos a função d i f f ( ) de novo. No MATLAB, digite a linha de código:

Com este comando, aplicamos a função d i f f ( ) no vetor d i d x , que representa d i d x , e armazenamos o resultado no vetor d 2 i . Calculando a diferença entre os elementos adjacentes de d i d x , é como se estivéssemos calculando a derivada de d i d x , que é consequentemente d 2 i d x 2 .

d 2 i é o nosso vetor representando d 2 i . Para criar o vetor d x 2 , vamos criar um vetor auxiliar chamado x d , com tamanho compatível ao vetor d i d x :

A linha de código acima diz que o vetor x d é um pedaço do vetor x , começando do segundo elemento de x e indo até o final de x (indicando por e n d ). Precisamos criá-lo pois o vetor d i d x tem um elemento a menos que o vetor x e para calcular d 2 i d x 2 , precisamos que os vetores d 2 i e d x 2 tenham o mesmo comprimento.

Para criar o vetor d x 2 , digite a linha de código:

O vetor d x 2 contém a diferença entre os elementos adjacentes de x d e representa o vetor d x 2 .

Passo 6

Com os vetores d x 2 e d 2 i criados, podemos calcular d ² i d x ² por meio da linha de código:

Com este comando, dividimos cada elemento do vetor d 2 i pelo elemento do vetor d x 2 que esteja na mesma posição e o resultado é armazenado no vetor d 2 i d x 2 .

O vetor d 2 i d x 2 representa a derivada segunda de i ( x ) obtida por meio de diferenciação numérica. Com o vetor d 2 i d x 2 , podemos gerar o gráfico de d ² i d x ² .

Passo 7

Antes de gerar o gráfico de i ( x ) , d i d x e de d ² i d x ² , precisamos criar um vetor auxiliar para podermos plotar a curva de d ² i d x ² em função de x .

Precisamos criar esse vetor auxiliar porque o vetor d 2 i d x 2 tem dois elementos a menos do que x , já que ele na prática foi criado usando a função d i f f ( ) duas vezes seguidas. Vetores de tamanhos diferentes dão um erro na função p l o t ( ) .

Vamos chamar o vetor auxiliar da segunda derivada de x d 2 e criá-lo com a linha de código:

Este comando diz que o vetor x d 2 é um pedaço do vetor x , começando do terceiro elemento de x e indo até o final de x .

Note que, para plotar d i d x em função de x , podemos aproveitar o vetor x d do passo 5, já x d tem o mesmo comprimento de   d i d x .

Pronto! Já temos todas informações necessárias para gerar o gráfico pedido no enunciado.

Passo 8

Vamos criar as curvas de i ( x ) , de d i d x e de d ² i d x ² na mesma janela. Para isso, entre as três linhas de código abaixo:

Na primeira linha, pedimos ao MATLAB para plotar i em função de x , d i d x em função de x d e d 2 i d x 2 em função de x d 2 .

Na segunda linha, damos um nome ao eixo x do gráfico: chamamos ele de x.

Na terceira linha, criamos uma legenda para o gráfico. A string ‘ i ( x ) ’ é a legenda da curva gerada pelo primeiro par de vetores, x e i , da função p l o t ( ) . Já a string ‘ d i / d x ’ é a legenda da curva gerada pelo segundo par de vetores, x d e d i d x , da função p l o t ( ) . Finalmente, a string ‘ d 2 i / d x 2 ’ se refere ao terceito par de vetores da função p l o t ( ) , x d 2 e d 2 x d x 2 .

Rodando nosso programa, temos o gráfico pedido no enunciado:

A curva azul representa i ( x ) , a curva vermelha representa d i d x e a curva amarela representa d ² i d x ² .

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #3

Desenvolva um código que permita localizar o mínimo da função y = 2 x + 5 x 2 + 5 . Considere um intervalo de [-5, 5] e use diferenciação numérica.

Passo 1

A questão pede para localizarmos o mínimo de uma função usando diferenciação numérica.

Para encontrarmos o mínimo de uma função, temos que relembrar o conteúdo de derivadas de Cálculo 1.

No ponto mínimo de uma função, a primeira derivada é zero. É um ponto onde a tangente é representada por uma linha horizontal.

Entretanto, pontos máximos de função também tem a primeira derivada igual a zero. Para confirmar se um ponto onde a primeira derivada é igual a 0 é um ponto de mínimo ou máximo, devemos calcular a segunda derivada neste ponto. Se a derivada segunda for positiva, o ponto é um local de mínimo.

Logo, para este exercício, vamos determinar a primeira e a segunda derivadas de y = 2 x + 5 x 2 + 5 , por meio de diferenciação numérica, para x indo de -5 a 5. Em seguida, vamos achar o valor de x em que a primeira derivada d y d x é nula, e o chamaremos de x m i n . Então, vamos calcular a segunda derivada d ² y d x ² em x m i n , para ver se resulta em um valor positivo ou negativo e termos certez que se trata de um ponto mínimo.

Ao final, para termos as coordenadas do ponto mínimo, substituímos x m i n em y = 2 x + 5 x 2 + 5 e encontramos y m i n .

Passo 2

Primeiramente, vamos criar dois vetores, um representando o intervalo de x pedido no enunciado e outro com a função y , calculada para cada elemento do vetor x .

Crie um script novo no MATLAB e digite as duas linhas de código:

Na primeira linha, foi criado um vetor x que vai de -5 a 5, a um passo de 0,01. Eu escolhi este passo para ter um pouco mais de precisão no resultado, mas você pode escolher o passo que quiser.

Na segunda linha, calculamos a função y para cada elemento do vetor x , por isso temos o ponto ao lado de x . Por exemplo, o comando x . ^ 2 elevada cada elemento de x ao quadrado. O resultado é armazenado no vetor y , que tem o mesmo comprimento de x .

Passo 3

Depois de criarmos os vetores x e y , podemos determinar as derivadas primeira e segunda de y . Vamos começar com a a derivada primeira. Para encontrarmos d y d x por diferenciação numérica, temos que gerar dois vetores, um representando d y e outro representando d x . O vetor d y teria a diferença de y de um valor de x a outro e o vetor d x teria a diferença entre um valor de x e outro.

Estes vetores são gerados por meio da função d i f f ( ) , que tem a seguinte estrutura:

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 .

Os dois vetores são gerados por meio das seguintes linhas de código:

Na primeira linha, é criado o vetor d x , que contém as diferenças entre elementos adjacentes do vetor x . Para criar o vetor d x , a funçao d i f f ( ) faz um elemento de x menos o elemento à esquerda, começando a partir do segundo elemento de x .

Na segunda linha, é feita a mesma coisa, mas com o vetor y . A variação de y é armazenada no vetor d y .

Note que não entramos nenhum valor para n , porque queremos que a diferença seja feita uma vez. Quando não entramos com nenhum valor para n na função d i f f ( ) , por o padrão o MATLAB adota n = 1 .

Passo 4

Com os vetores d x e d y criados, podemos calcular d y d x por meio da linha de código:

Com este comando, dividimos cada elemento do vetor d y pelo elemento do vetor d x que esteja na mesma posição e o resultado é armazenado no vetor d y d x .

O vetor d y d x representa a derivada primeira de y obtida por meio de diferenciação numérica. Com o vetor d y d x , podemos calcular a derivada segunda d ² y d x ² .

Passo 5

Após determinarmos a primeira derivada, vamos calcular a segunda derivada de y , por meio de diferenciação numérica. Assim como fizemos para a primeira derivada no passo 3, para determinar d 2 y d x 2 , precisamos construir dois vetores, um representando d 2 y e outro representando d x 2 , e dividir um pelo outro.

Para isto, usamos a função d i f f ( ) de novo. No MATLAB, digite a linha de código:

Com este comando, aplicamos a função d i f f ( ) no vetor d y d x , que representa d y d x , e armazenamos o resultado no vetor d 2 y . Calculando a diferença entre os elementos adjacentes de d y d x , é como se estivéssemos calculando a derivada de d y d x , que é consequentemente d 2 y d x 2