Baseado na minha resposta sobre a pergunta O que é assíntota?

Um conto grego

A assíntota de Aquiles é a tartaruga

Corolário do Paradoxo de Zeno

Um dia, Aquiles, o Herói, e uma tartaruga discutiram. A tartaruga afirmou para Aquiles que, se ela começasse na frente, ela iria vencer uma corrida de qualquer distância contra o Herói. Curioso, Aquiles perguntou

-Por que disso? Se eu sou mais rápido que você, eu irei vencer.

Para então a tartaruga responder:

-Se eu começar na frente, você precisa primeiro alcançar a posição que eu estava. Mas até você chegar lá, eu terei andado, estarei mais adiante. Então, você deverá chegar a minha nova posição, e eu estarei na sua frente. Então você precisará de infinitos passos desses até chegar em mim, pois então para me ultrapassar precisará de mais do que infinitos passos.

Lide com isso, Aquiles

Noção informal de assíntota

No paradoxo de Zeno, não importa quantas vezes Aquiles tente ultrapassar a tartaruga, ele nunca conseguirá. Pois, a cada passo, Aquiles está se aproximando da tartaruga. Aquiles se torna assintoticamente próximo da tartaruga.

Veja os seguinte infográfico, evolução das posições de Aquiles e da tartaruga:

Evolução das posições de Aquiles e da tartaruga pelo tempo

Dá para perceber que Aquiles fica cada vez mais próximo da tartaruga a cada passagem de tempo. A esse tipo de comportamento nós chamamos de assíntota. Daí, a assíntota de Aquiles é a tartaruga.

Quando você quer saber o comportamento geral de uma função, você quer saber qual a assíntota da função. Por exemplo:

f(x)=x2x2 f(x) = \frac{x^2 - x}{2}

Ao infinito, essa função tende a ter o mesmo comportamento que x2x^2. Então podemos dizer que o comportamento de f(x)=x2x2f(x) = \frac{x^2 - x}{2} é assintoticamente x2x^2.

Isso tem aplicação prática?

Bem, isso quer dizer que o bubble sort piora tão rápido quando o insertion sort, e também que o merge sort será melhor em casos maiores. Mais tarde, na seção Por que isso importa para o programador?, eu detalharei mais.

Como identificar assíntotas?

De modo geral, você precisa de um “Aquiles” e de uma “tartaruga”. A tartaruga será a assíntota de Aquiles.

A função dada como exemplo ela se aproxima de x2x^2, mas nunca chega nela.

Outro caso também, eu poderia pegar a função 1x\frac{1}{x}. No infinito positivo, ela tende a ser zero, mas nunca o é:

Desenho da função hiperbólica `1/x`

Note que quando x=10x=10, a função vale 0.1. Quando x=80x=80, a função por sua vez agora valeria 0.0125. Ficando cada vez mais próxima de 0, mas nunca de fato chegando lá.

Por que isso importa para o programador?

Em um mundo normal de aplicações corporativas que não se preocupam em calcular qual o desconto (em porcentual) que eu devo aplicar no preço de venda para que o valor com o ICMS-ST alcance o total de R$10,00 no preço final (dica: tem uma fórmula que condensa a soma infinita), assíntotas servem basicamente para descrever comportamentos de algoritmos.

Então, para o programador médio, o que importa é comportamento assintótico, normalmente associado à complexidade temporal/espacial de um algoritmo.

A seguir, uma lista de perguntas que flertam com esse conceito (o autor sabendo disso ou não):

Em todos os casos, se pede algo em relação ao comportamento assintótico (ou como parte da resposta, ou como parte da pergunta).

Também vale para o programador saber que comportamento assintótico nem sempre é tudo. As vezes temos constantes escondidas que, quando não se está “perseguindo tartarugas no infinito”, se tornam muito mais importantes. Por exemplo, o quick sort possui o tempo de execução normalmente mais rápido do que o merge sort.

Como provar a ordem assintótica de um algoritmo?

Esta pergunta já tem uma resposta aqui:

Como provar a ordem assintótica de um algoritmo? 3 respostas

Formalmente, o que é uma assíntota?

Uma assíntota é um ponto ou curva para o qual uma função tende. Por exemplo, o centro é a assíntota para a seguinte função polar exponencial:

f(θ)=e0.1×θ f(\theta) = e^{-0.1\times \theta}

Ela é plotada assim:

plotagem da função `f(t) = e^(-0.1 t)`

Quanto maior o θ\theta, mais próxima a função fica de (0,0)(0,0). Então (0,0)(0,0) é a assíntota de f(θ)=e(0.1×θ)f(\theta) = e^{(-0.1\times \theta)}.

Uma curva pode interceptar sua assíntota. Por exemplo, f(x)=sin(10×x)x+xf(x) = \frac{\sin(10\times x)}{x} + x tem como assíntota g(x)=xg(x) = x:

`f(x) = sen(10*x)/x + x` tem como assíntota `g(x) = x`

Nem toda assíntota precisa ser uma reta, mas pode ser uma curva. Como o caso de f(x)=1x+x2f(x) = \left|\frac{1}{x}\right| + x^2, cuja assíntota nos infinitos é g(x)=x2g(x) = x^2:

plotagem de `f(x) = |1/x| + x**2` e da assíntota `g(x) = x**2`

Então, a assíntota AA de uma função FF é um valor (exemplo da espiral) ou função (outros dois exemplos) que, dada a evolução de FF em termo de alguma variável, FF se aproxima arbitrariamente próxima de AA.

Como descobrir uma assíntota de uma função?

Eu normalmente uso os seguintes passos (para funções que usam coordenadas cartesianas, não polares) para descobrir a ordem da assíntota:

  1. conjecture OAOA
  2. divida* FOA\frac{F}{OA} ou OAF\frac{OA}{F}
  3. se errou, repita

A divisão, entretanto, não pode ser feita de qualquer forma. Normalmente, se deseja saber qual o comportamento extremo da função, então a divisão é com o limite da variável indo ao infinito. Nesse caso de comportamento no infinito, OAOA é da mesma ordem da assíntota de FF se elas forem co-dominantes conforme definida nesta resposta:

domina(f,g)={dominadalimxf(x)g(x)=0dominantelimxf(x)g(x)=codominantelimxf(x)g(x)=h(x),xh(x)0,xh(x) domina(f, g) = \begin{cases} dominada & \lim_{x\rightarrow \infty} \frac{f(x)}{g(x)} = 0\\ dominante & \lim_{x\rightarrow \infty} \frac{f(x)}{g(x)} = \infty\\ co-dominante & \lim_{x\rightarrow \infty} \frac{f(x)}{g(x)} = h(x), \exists x|h(x) \ne 0, \exists x|h(x) \ne \infty\\ \end{cases}

Também condensado nessa resposta do @Isac para a mesma pergunta (obs: com c0c \ne 0):

limnf(n)g(n)=c \lim_{n\rightarrow \infty} \frac{f(n)}{g(n)} = c

Descoberta a ordem, o valor obtido pela divisão é o coeficiente do maior termo. Isso significa que o termo mais significante da assíntota tem coeficiente conhecido, cc. Agora, remova o termo mais significativa e calcule novamente. Como?

Bem, achamos OAOA a função co-dominante de FF. Sabemos que F=OA×c+GF = OA \times c + G, para c=limOAFc = \lim \frac{OA}{F}. Então, agora, é achar o valor da assíntota de GG e somar a c×OAc\times OA, fazendo isso recursivamente até que, em algum momento, limG=0\lim G = 0. Essa será a curva da assíntota de FF.

Exemplo

Para f(x)=x+sin(10x)xf(x) = x + \frac{\sin(10x)}{x}. Vamos primeiro supor que a ordem da função assintótica OAOA é x2x^2:

limxx+sin(10x)xx2=limxxx2+sin(10x)x3 \lim_{x\rightarrow\infty}\frac{x + \frac{\sin(10x)}{x}}{x^2} = \lim_{x\rightarrow\infty}\frac{x}{x^2} + \frac{\sin(10x)}{x^3}

Essa divisão dá 0, portanto OAOA domina f(x)f(x). Portanto, a primeira conjectura da ordem da função assintótica deu errado. Nesse caso, repitamos.

Vamos agora supor que a ordem da função assintótica OAOA é xx:

limxx+sin(10x)xx=limxxx+sin(10x)x2limxx+sin(10x)xx=limx1+0=1 \lim_{x\rightarrow\infty}\frac{x + \frac{\sin(10x)}{x}}{x} = \lim_{x\rightarrow\infty}\frac{x}{x} + \frac{\sin(10x)}{x^2} \therefore \\ \lim_{x\rightarrow\infty}\frac{x + \frac{\sin(10x)}{x}}{x} = \lim_{x\rightarrow\infty}1 + 0 = 1

Eles são co-dominantes, então a ordem assintótica é, realmente, OAOA. Para o próximo passo, precisamos remover c×OAc\times OA de f(x)f(x) e verificar g(x)g(x):

x+sin(10x)x1×(x)=sin(10x)x x + \frac{\sin(10x)}{x} - 1\times(x) = \frac{\sin(10x)}{x}

Chegamos a conclusão que g(x)=sin(10x)xg(x) = \frac{\sin(10 x)}{x}. Agora, precisamos de outro termo para definir a assíntota de g(x)g(x)?

limxsin(10x)x=0 \lim_{x\rightarrow\infty}\frac{\sin(10x)}{x} = 0

Não, não precisamos. Portanto, A(x)=xA(x) = x é a assíntota para f(x)=x+sin(10×x)xf(x) = x + \frac{\sin(10\times x)}{x}.

Existem outras assíntotas que não as do infinito?

Sim, existem. Normalmente, elas se encontram em pontos de descontinuidade.

Tome a hipérbole f(x)=1xf(x) = \frac{1}{x}:

Desenho da função hiperbólica `1/x`

Ela apresenta descontinuidade em x=0x = 0. Portanto, o ponto x=0x = 0 é um candidato a ser uma assíntota vertical da função. Para achar uma assíntota vertical no ponto x=ax = a, é preciso atender um desses quatro critérios:

limxaf(x)=±limxa+f(x)=± \lim_{x\rightarrow a^-}f(x) = \pm \infty\\ \lim_{x\rightarrow a^+}f(x) = \pm \infty

A função deve tender ao infinito (positivo ou negativo) quando xx tender ao valor aa, seja o limite pela esquerda ou o limite pela direita.

No caso da hipérbole, quando x0x \rightarrow 0 pela direita, f(x)+f(x) \rightarrow +\infty. Isso já é o suficiente para considerar x=0x = 0 hipérbole vertical de 1x\frac{1}{x}.


Fontes das imagens: