Projeto Controlduino: Cálculo!

Antes de mostrar o que é um controlador PID e falar alguma coisa sobre modelamento de fenômenos físicos, devo introduzir, para aqueles que não estão familiarizados, o Cálculo… Mais especificamente o conceito de derivadas e integrais. Devo alertar os puristas que o que mostrarei aqui são conceitos bem básicos e usarei algumas analogias que não são perfeitas… Não falarei nada sobre limites, continuidades… nada sobre técnicas como “regra da cadeia” ou coisas do tipo… A idéia é preparar o terreno para a integração e derivação numérica, necessária para implementar o controlador, bem como iniciar o estudante que ainda não teve contato com esses conceitos (a turma do ensino médio, por exemplo), mas de forma bem suave, se é que me entendem…

Taxas de variação

lineO que você entende quendo vê a palavra “taxa”? Se pensou em imposto, essa é uma das interpretações em nossa lingua. No caso de fenômenos físicos e da matemática “taxa” significa apenas uma relação entre duas coisas… Pensando bem, mesmo no universo financeiro, “taxa” também é uma relação, geralmente expressa em porcentagem: 2% significa “2 para cada 100”, ou “2 em relação a 100”. Quando falamos de “taxa de variação” queremos saber o quanto uma coisa variou em relação a outra. Por exemplo, na figura ao lado eu poderia perguntar qual é a “taxa de variação” de y em relação a x entre os pontos x=0 e x = 1?

O que eu acho que você faria é pegar os valores de y correspondentes a esses pontos, em cima da linha, subtraí-los e dividir pelo intervalo de x (tudo na mesma ordem), assim:

\displaystyle tv=\frac{y_1-y_0}{x_1-x_0}=\frac{1-0}{1-0}=\frac{1}{1}

Ou seja… a taxa de variação (tv) de y, em relação a x, no intervalo de x [0,1], é de \frac{1}{1}, ou simplesmente 1. Bem simples, huh?

Tangentes como taxa de variação

parabolaQuando se tem uma linha a coisa é fácil… o problema real é quando temos uma curva. Na figura ao lado temos uma parábola e fica claro que não faz muito sentido perguntar sobre a taxa de variação da curva entre os pontos no intervalo [0, 1]. A inclinação da curva varia em cada ponto entre esses dois valores! No entanto, a inclinação da curva (sua taxa de variação) em um único ponto é chamada de tangente a esse ponto.

Só que não temos como calcular uma tangente com apenas um ponto… precisamos de dois! Basta lembrar das aulas de trigonometria:

\displaystyle \tan \Theta=\frac{\Delta y}{\Delta x}

Tangente ao ponto p.
Reta tangente ao ponto p na curva.

Note que a definição de tangente coincide exatamente com o conceito de “taxa de variação”… \Delta x é a mesma coisa que (x_1 - x_0) e \Delta y é a mesma coisa que (y_1 - y_0). Mas, o problema permanece: Se estamos falando de um ponto, então x_1 = x_0 e teremos \Delta x = 0. E isso causará uma divisão por zero que, como todos sabemos, é uma operação inválida na matemática!

 

 

Usando pontos muito próximos

Hummmm… e se usássemos um valor para x_1 bem próximo ao valor de x_0? Quer dizer, se o valor de \Delta x for bem pertinho de zero, mas não for exatamente zero?!

Poderemos fazer a divisão! Assim, ao invés de fazermos \frac{\Delta y}{\Delta x}, faremos \frac{\delta y}{\delta x} — \delta é a versão minúscula de \Delta, letra grega “delta” — onde os pontos para \delta x seráo um ponto x qualquer e um ponto x - \delta x (o motivo de eu usar uma subtração aqui é o seguinte: Não temos como ler o próximo valor de uma curva porque ele está no futuro — a não ser que você tenha uma máquina do tempo! Matematicamente teríamos que considerar o intervalo “em torno” do ponto x).

A diferença entre Cálculo algébrico e numérico

Antes de entrar nas explicações de derivada e integral, devo alertá-los: O foco aqui é o cálculo numérico. Derivadas e Integrais são transformações algébricas, isto é: De posse de uma função f, a transformamos e obtemos uma função g que, no caso da derivada, expressa a taxa de variação de f. Ou seja, temos uma função e obtemos outra. No cálculo numérico não temos funções, temos valores… Poderíamos até entender a diferença entre os dois tipos de cálculo como se o cálculo algébrico fosse analógico e o cálculo numérico, digital (seria uma comparação deficiente, mas serve). Outra diferença é que, no cálculo algébrico, podemos fazer \delta x tão pequeno quanto for necessário, no cálculo numérico, pelo menos para a aplicação em software, estamos limitados a um “diferencial” definido, que pode até ser “grande”, em comparação ao usado no cálculo algébrico.

O que segue é uma explicação muito (mas muito, mesmo!) superficial do que vem a ser derivadas e integrais, tanto do ponto de vista algébrico quanto numerico, mas a ênfase é numérica!

O que é uma derivada?

De novo, falando de modo bem conceitual, derivada é uma transformação algébrica que te dá uma função que expressa a taxa de variação de outra função em qualquer ponto x. Se temos uma função f, a derivada de f nos dá uma função f' (esse apóstrofo é chamado de ‘linha’) que conterá a equação que nos dá a taxa de variação de f em qualquer um de seus pontos… Parece complicado, mas é, essencialmente, uma simplificação algébrica da equação que resulta da divisão \frac{\delta y}{\delta x} quando \delta x ficar bem próximo de zero…

Para nossos propósitos, do ponto de vista numérico, calcularemos a taxa de variação de um ponto qualquer através da simples divisão \frac{\delta y}{\delta x}, ou melhor,  \frac{\delta y}{\delta t}, onde \delta t é o intervalo de tempo (t_n - t_{n-1} entre duas amostras (\delta y = y_n - y_{n-1}) obtidas do ADC. Nosso \delta t não chega a ser próximo de zero, mas é pequeno o suficiente para ser interpretado como tal. No nosso caso \delta t é igual ao inverso do sampling rate (\delta t=\frac{1}{f_{sampling}}).

Em cálculo algébrico, essas diferenças (\delta y, \delta t) são expressas usando uma notação diferente. Usa-se o um d para expressar “diferencial” que, como recurso mnemônico, gosto de pensar na palavra como uma contração de “diferença infinitesimal”. \delta t vira dt e \delta y vira dy. Em alguns artigos contendo “equações diferenciais” você poderá observar o símbolo \partial usado para expressar “derivada”, mas a notação se aplica ao que é conhecido como “derivadas parciais”, que estão completamente fora do escopo desse artigo.

Eis um exemplo de derivação algébrica: Suponha que você tenha uma função y=x^2. Para encontrar uma função que expresse a taxa de variação precisamos substituir x por x - \delta x e y por y - \delta y:

\displaystyle y-\delta y=(x - \delta x)^2=x^2-2x\delta x + \delta x^2

Já que estamos interessados apenas nos diferenciais, podemos retirar a própria função y=x^2 da equação, ou seja, o y do lado esquerdo e o x^2 do lado direito. E depois de inverter o sinal dos dois lados para facilitar, temos:

\displaystyle \delta y=2x\delta x + \delta x^2

Agora, para obter a taxa de variação, basta dividir \delta y por \delta x, mas temos que fazer isso dos dois lados:

\displaystyle \begin{array}{lc} \frac{\delta y}{\delta x}=2x+\delta x \\ \frac{\delta y}{\delta x}=2x \end{array}

Podemos ignorar o \delta x do lado direito porque ele é desprezível… Ou seja, a derivada de y=x^2 é y'=2x. Podemos agora responder à pergunta sobre a taxa de variação no ponto x=1. Ela é de \frac{2}{1}, ou simplesmente 2.

Se isso tudo te pareceu grego, lembre-se disso: Derivada é cálculo de taxas de variação…

Calculando áreas

Vimos, até então, o conceito de taxa de variação com relação a intervalos pequenininhos. A outra operação que nos interessa é o cálculo de áreas. Lá no gráfico inicial (o da reta), se eu pedisse que você calculasse a área do triângulo formado pela reta e o eixo x, entre os pontos x=0 e x=1, provavelmente você faria algo assim:

\displaystyle A=\frac{\Delta y \cdot \Delta x}{2} = \frac{(1-0)\cdot(1-0)}{2} = \frac{1}{2}

A área do triângulo é dada por “base vezes altura dividido por 2”, lembra-se?

De novo, o cálculo de áreas usando figuras geométricas simples é direto e fácil… Com uma curva a coisa complica e, mesmo assim, existem casos em que você precisa saber a área total sob algum intervalo \Delta x. A forma de fazê-lo é calcular as pequeninas áreas em intervalos diferenciais \delta x entre x_0 e x_1 e somar todas elas. É isso o que a equação abaixo nos diz:

\displaystyle A=\displaystyle \int_{x_0}^{x_1}f(x)dx

O símbolo \int significa “soma”, o termo f(x)dx é a multiplicação do valor da função num ponto do intervalo e o diferencial dx, o que nos dá uma pequena área retangular no intervalo entre x_n - \delta x e x_n (de novo: estou subtraindo por causa da característica temporal do sinal vindo do ADC). O que essa nomenclatura nos diz é que estamos “somando” todas as pequenas áreas sob a curva dada por f entre x_0 e x_1. O gráfico abaixo ilustra os efeitos da acumulação dessas áreas quando usamos intervalos para dx cada vez menores:

Usando dx cada vez menores...
Quanto menor o dx, mais aproximada é a área…

Do ponto de vista da integração numérica, quanto menor o dx melhor a qualidade do cálculo da área. Do ponto de vista do cálculo algébrico, podemos fazer dx infinitesimal e o cálculo da área será exato.

Na notação da fórmula acima dizemos “A é igual a integral da função f em relação a x (é o dx que nos diz isso), no intervalo entre x_0 e x_1” e tem como resultado uma outra função… Da mesma forma que as derivadas, a integração é uma operação algébrica.

Calculando integrais em software

Diferente das derivadas, integrais podem ser um problema… Note, na figura acima que, para que a área total seja bem aproximada da área real temos que usar valores para o diferencial dx bem pequenos, bem próximos de zero. Qualquer valor não tão próximo de zero e adicionaremos um erro considerável no cálculo. Tendo em vista que integrações são acumulativas, não somente o valor correto das pequenas áreas vão sendo acumulados, o erro também!

Como nossa aproximação aqui não é a integração algébrica, então precisamos calcular a área abaixo de dois pontos da forma mais aproximada possível. Ao invés de usarmos as áreas de retângulos, onde a base é \delta x e a altura o valor obtido do ADC, podemos calcular a área de um trapézio. Neste caso temos que levar em conta o valor obtido da amostra anterior. A integração fica, então assim:

\displaystyle \int_{t_0}^{t_n}f(t)dt\approx\displaystyle\sum_{t=t_1}^{t_n}\frac{f(t)+f(t-1)}{2}\delta t

O lado direito da comparação acima mostra um somatório das fórmulas da área de trapézios, onde as bases são obtidas a partir de duas amostras, a atual e a anterior, e a altura é dada por \delta x. Essa aproximação não é perfeita mas é bem melhor do que usar a área de um retângulo que não seja fino o suficiente.

Existem outras maneiras de aumentar a precisão do cálculo da área e elas envolvem o uso de mais amostras. O problema do método do calculo da área do trapézio é que acrescentamos um delay, deixando para trás o instante t_0 (o cálculo da integral só é feita a partir do instante t_1). Isso não é, em si, problemático… sempre podemos “começar” a controlar o processo a partir da segunda amostra obtida, ou da terceira, ou da quarta…Afinal, na derivação precisaremos também da amostra anterior…

Outro problema de usarmos apenas dois pontos é que se houver uma variação brusca no sinal teremos erros grandes (mas, mesmo assim, menores do que se usássemos retângulos!). Para não complicar mais a explicação, deixarei apenas o método do trapézio aqui. Mas, esteja ciente que existem outros métodos, em particular, a regra de Simpson é bem útil.

Cadê o código fonte?

No caso da derivação o código é bem simples… basta obter dois valores do ADC e dividir a diferença entre eles pelo período de amostragem. Não vale nem à pena colocar um código aqui.

No caso da integração, precisarei explicar alguns detalhes relativos a erros que ocorrem em adições e subtrações, em ponto-flutuante. Isso me faria escrever demais nesse artigo introdutório de cálculo numérico, portanto vou deixar o código da integração para outra ocasião. O importante aqui são os conceitos e a ideia geral de como realizar derivações e integrações numéricas. Se mesmo assim você quiser ver um código de integração, recomendo a leitura do livro Numerical Recipes in C (mas alerto que a leitura não é tão simples para os não iniciados).

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

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